如何在向Java程序传参时隐藏密码避免ps命令泄露
解决方案
核心思路就是不要把敏感信息放在命令行参数里,下面是几种可行的方案:
方法1:通过标准输入传递(最推荐)
让bash把用户名和密码通过here-doc传给Java的标准输入,Java程序从System.in读取这些信息。这种方式完全不会在进程表中留下敏感信息痕迹。
修改后的bash脚本:
readSecrets() { read -p "Username: " username IFS= read -s -p "Password: " password echo if [[ -z "$username" || -z "$password" ]] ; then echo "!!Error!! Username and Password are mandatory." exit 1 fi } readSecrets # 通过here-doc将用户名和密码传入Java的标准输入 nohup java -jar "$JAR_FILE" START > logFile.log 2>&1 << EOF $username $password EOF
Java代码读取逻辑:
import java.util.Scanner; public class YourMainClass { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 读取用户名和密码 String username = scanner.nextLine(); String password = scanner.nextLine(); scanner.close(); // 这里写你的业务逻辑,使用username和password } }
方法2:通过环境变量传递
把用户名和密码设为Java进程的专属环境变量,Java通过System.getenv()读取。注意:部分系统用ps e能看到进程环境变量,但比命令行参数安全得多,且不会污染当前shell的环境。
修改后的bash脚本:
readSecrets() { read -p "Username: " username IFS= read -s -p "Password: " password echo if [[ -z "$username" || -z "$password" ]] ; then echo "!!Error!! Username and Password are mandatory." exit 1 fi } readSecrets # 仅给Java进程设置临时环境变量,不影响当前shell nohup env APP_USER="$username" APP_PASS="$password" java -jar "$JAR_FILE" START > logFile.log 2>&1 &
Java代码读取逻辑:
public class YourMainClass { public static void main(String[] args) { String username = System.getenv("APP_USER"); String password = System.getenv("APP_PASS"); // 这里写你的业务逻辑 } }
方法3:通过临时文件传递(需注意权限)
创建一个仅当前用户可读写的临时文件,写入敏感信息,Java读取后立即删除。这种方式要确保文件权限严格,避免被其他用户读取。
修改后的bash脚本:
readSecrets() { read -p "Username: " username IFS= read -s -p "Password: " password echo if [[ -z "$username" || -z "$password" ]] ; then echo "!!Error!! Username and Password are mandatory." exit 1 fi } readSecrets # 创建临时文件,设置权限为仅当前用户可读可写 temp_file=$(mktemp) chmod 600 "$temp_file" # 写入用户名和密码,每行一个 echo -e "$username\n$password" > "$temp_file" # 把临时文件路径传给Java,让它读取后删除 nohup java -jar "$JAR_FILE" START "$temp_file" > logFile.log 2>&1 & # 可选:等Java启动后删除文件,或者让Java自己删 sleep 2 rm -f "$temp_file"
Java代码读取逻辑:
import java.io.File; import java.util.Scanner; public class YourMainClass { public static void main(String[] args) { if (args.length < 1) { System.err.println("请传入临时文件路径"); System.exit(1); } File tempFile = new File(args[0]); Scanner scanner = new Scanner(tempFile); String username = scanner.nextLine(); String password = scanner.nextLine(); scanner.close(); // 立即删除临时文件 tempFile.delete(); // 这里写你的业务逻辑 } }
内容的提问来源于stack exchange,提问作者umesh
相关产品推荐
相关产品推荐

