You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从非交互式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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 03:14:55