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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 23:17:03