【发布时间】:2019-04-26 01:49:21
【问题描述】:
我有一些执行 bash 脚本的 java 代码,而该脚本又执行需要命令行参数才能运行的命令行工具。
此工具的这些命令行参数之一是纯文本密码。
脚本类似于:
#!/bin/bash
# script.sh
# some setup code
<cli-tool-executable> -arg1 <arg1> -arg2 <arg2> ... -password <password>
我正在通过 apache commons exec 从 java 代码中调用它,方法是:
CommandLine commandLine = new CommandLine("bash");
// bash script that runs the tool
commandLine.addArgument("script.sh");
// add other arguments
commandLine.addArgument(...);
// execute
new DefaultExecutor().execute(commandLine);
鉴于目前的状态,如果我要运行 ps -ef 或查看 bash 历史记录,我将能够以纯文本形式查看提供给 cli 工具的命令行参数,包括密码,显然不是很好。
理想情况下,我希望密码以某种方式被混淆或根本不显示。
我花了大半天的时间试图寻找其他解决方案,并在此过程中发现:
- 使用 C 代码执行此操作有一些潜在的骇人听闻的方法,这些方法不一定安全或不推荐
- 永远不希望以这种方式传递密码(很明显),最好通过以某种安全方式控制其权限的文件,或者通过环境并作为标准输入传递,或者通过代码本身。不幸的是,这对我来说都不是一个选项(该工具不支持它 - 它只需要一个名为 -password 的命令行参数和一个字符串密码,它不会读取任何环境变量或类似的东西)。
- 我仍然不能完全确定我正在尝试做的事情是否完全可能
我尝试将内容放入环境变量并将其传递给 -password 参数,我尝试将其放入文件中并尝试将 cat passwordfile 放入密码参数中,但在所有情况下我都尝试过它没有'似乎没有显示密码参数。
有人对此有任何想法/建议吗?谢谢。
【问题讨论】:
-
您可以更轻松地重现:当您运行
secret=7;sleep $secret &时,您会发现sleep 7和ps -f。如何避免这种情况? -
我没有测试serverfault.com/a/592941,这对你有用吗?
标签: java bash unix password-protection ps