如何通过Shell脚本自动为调用Java程序的ABC.sh填充三次密码
解决方案:自动化给调用Java程序的ABC.sh输入三次密码
问题背景
需要自动化执行ABC.sh脚本,该脚本会调用一个无源码的Java程序,服务启动前要求连续输入三次密码abc123。此前尝试Here Document和mkfifo管道方法均失效,寻求可行方案。
1. 使用expect工具(最可靠的交互式输入方案)
如果Java程序是直接读取终端输入(而非标准输入stdin,这是Here Document失效的常见原因),expect是专门处理这类交互式场景的工具。
编写auto_abc.exp脚本:
#!/usr/bin/expect # 启动ABC.sh spawn ./ABC.sh # 匹配密码提示(替换为Java程序实际的密码提示字符串,比如"Enter password:") set password_prompt "Enter password:" # 连续发送三次密码,每次匹配到提示后发送 for {set i 0} {$i < 3} {incr i} { expect -re $password_prompt send "abc123\r" } # 等待程序执行完成 expect eof
赋予执行权限并运行:
chmod +x auto_abc.exp ./auto_abc.exp
2. 检查Java程序是否支持非交互式密码传递
很多服务程序会提供命令行参数或环境变量来传递密码,无需交互式输入:
- 查看
ABC.sh中的Java启动命令,看是否有类似--password、-p的参数选项; - 直接运行Java程序(去掉ABC.sh的包装),尝试添加
--help或-h参数,查看是否有密码相关的配置说明; - 如果支持环境变量,可在ABC.sh中添加
export SERVICE_PASSWORD=abc123(需对应程序的环境变量名)。
3. 修正mkfifo管道的使用方式
之前的mkfifo写法存在逻辑问题,可尝试以下调整:
# 创建管道 mkfifo srv-input # 后台进程依次发送三次密码,加sleep适配程序读取节奏 ( echo "abc123" sleep 1 echo "abc123" sleep 1 echo "abc123" ) > srv-input & # 让ABC.sh从管道读取输入 ./ABC.sh < srv-input # 清理管道 rm srv-input
4. 备选方案:硬编码输入(不推荐)
如果以上方法都无法生效,只能考虑修改Java程序的输入逻辑:
- 使用字节码编辑工具(如ASM)或反编译工具(如JD-GUI)修改程序的密码读取逻辑,将密码硬编码到程序中;
- 注意:该方法存在安全风险(密码明文暴露),且可能涉及版权合规问题,仅作为最后备选。
内容的提问来源于stack exchange,提问作者Sean
相关产品推荐
相关产品推荐

