有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java从Tomcat启动读取用户输入

我有一个Tomcat应用程序,在启动时需要多个密码
我当前的配置使用Java属性对象从密码加载密码。conf文件

现在要求系统上的“清除”中不允许使用密码。我曾建议加密密码文件,但这不是一个选项

如果Tomcat的启动脚本可以简单地从命令行读取用户键入的密码并将其提供给我的应用程序,这将是一个理想的选择

由于Tomcat是作为一个守护进程启动的,我认为我不能利用任何Java命令行I/O之类的扫描器来读取密码

有人有聪明的解决办法吗

谢谢 公关


共 (4) 个答案

  1. # 1 楼答案

    这里有两种解决方案是我能想到的一种解决方案:

    轻松-在shell脚本包装器中设置一个环境变量,并将其作为系统属性读取。i、 e:

    echo "What is the password"
    stty -echo
    read server_password
    stty echo
    # error check
    export server_password
    

    然后在java中:

    password = System.getenv("server_password");
    

    Harder-使用非对称加密加密密码,然后传递密码,然后需要在java代码中解除密码

    只是我即兴的想法

    编辑 删除了加密密码的想法,因为它可能会阻止某人确定密码,但不会阻止某人使用加密密码启动应用程序

    编辑2:根据@mpobrien建议合并的stty-echo

  2. # 2 楼答案

    嗯,聪明的解决方案是加密密码文件,为什么会被排除

    另一种解决方案可能是从数据库或其他服务器读取密码

  3. # 3 楼答案

    作为对上述环境变量建议的响应,linux下的环境变量可在以下位置获得:

    /proc/[pid]/environ
    

    因此,root用户或tomcat进程的所有者可以轻松地读取环境变量中的明文密码

    有关更多信息,请参见https://serverfault.com/questions/133147/proc-pid-environ-missing-variables

    这篇文章属于对另一个答案的评论。但我的名声还不足以添加评论;这是我的第一篇文章。我道歉。我觉得明文密码在环境中的安全影响值得回应

  4. # 4 楼答案

    您可以修改tomcat的启动脚本,将命令行参数传递给启动命令本身。这些可能应该是-Dkey=value的形式。这将允许您在启动时设置系统属性。您的应用程序可以通过系统读取这些信息。getProperty(名称),以获取密码,或者在未提供属性时无法启动

    请注意,tomcat的start命令可能会被记录到某些系统的磁盘上,因此也会记录-D标志以及您的密码。您只需确保未记录此信息