如何从非交互式Shell脚本向调用System.console().readPassword()的Java程序传密码?
问题
我们有一个第三方Java应用,它使用了System.console().readPassword()方法且无法修改。我们需要从非交互式Shell脚本中调用该程序并传入密码,但通过管道传递密码的方式无法生效。请问是否有可行的解决办法?
测试代码
Java测试程序
import java.io.Console; public class Main { public static void main(String[] args) throws Exception { Console console = System.console(); if (console == null) { System.err.println("Cannot acquire console"); System.exit(-1); } char[] passwordArray = console.readPassword("Enter password: "); System.out.println("Password: " + String.valueOf(passwordArray)); } }
失效的Shell脚本
#!/bin/sh export TEST_PASSWORD="test password" echo "Test Password: $TEST_PASSWORD" echo $TEST_PASSWORD | java Main
解决办法
方法1:使用expect脚本自动输入密码
expect是专门用于自动化交互式程序的工具,可模拟用户输入。编写如下expect脚本:
#!/usr/bin/expect set password "test password" spawn java Main expect "Enter password: " send "$password\r" interact
保存为auto_input.exp,赋予执行权限:chmod +x auto_input.exp,运行脚本即可自动传入密码。
方法2:用script命令模拟终端环境
script可创建伪终端,让Java程序认为处于交互式环境,从而成功获取Console实例。执行命令:
script -q -c 'echo "test password" | java Main' /dev/null
参数说明:
-q:静默模式,不显示script的启动和结束信息-c:指定要执行的命令/dev/null:丢弃script的日志输出
方法3:使用pty工具创建伪终端
若系统无script或expect,可使用pty工具(部分系统需手动安装):
pty java Main << EOF test password EOF
内容的提问来源于stack exchange,提问作者KirEvse
相关产品推荐
相关产品推荐

