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

如何通过Bash脚本向终端运行的程序即时输入文本?

解决Bash脚本向交互式程序即时输入内容的问题

嘿,我来帮你搞定这个麻烦!你遇到的“输入内容在程序结束后才打印出来”的情况,大概率是因为目标程序没有读取标准输入(stdin),而是直接读取终端设备(/dev/tty)——这是很多需要输入敏感信息(比如密码)的程序的常见设计,目的是避免输入被管道或重定向捕获。下面给你几种实用的解决办法:

方法1:管道(适用于程序读取stdin的场景)

如果你的程序是从标准输入读取内容的,可能是你用的echo在某些环境下行为不一致。试试用更可靠的printf来传递输入:

printf "password\n" | ./your-target-program

这里的\n模拟了用户按下回车键,多数程序需要这个来确认输入。如果用echo的话,也可以写成echo -e "password\n" | ./your-target-program(-e让echo解析转义字符)。

方法2:用expect工具(专门处理交互式程序)

这是处理终端交互式输入的标准方案,它能完美模拟用户的键盘操作。首先确保你的系统安装了expect:

  • Debian/Ubuntu系:sudo apt install expect
  • RHEL/CentOS系:sudo yum install expect

然后写一个简单的expect脚本(比如命名为send_pass.exp):

#!/usr/bin/expect
# 启动目标程序
spawn ./your-target-program
# 等待程序出现密码提示(把下面的字符串替换成程序实际的提示,比如"Enter password:")
expect "Password:"
# 发送密码和回车(\r模拟回车键)
send "password\r"
# 如果需要继续和程序交互,保留interact;如果只需要输入密码后让程序自行运行,换成expect eof
interact

给脚本添加执行权限:

chmod +x send_pass.exp

然后运行它:

./send_pass.exp

方法3:命名管道(无需额外工具的方案)

如果不想安装expect,可以用命名管道(fifo)来实现:

# 创建一个命名管道
mkfifo password_pipe
# 后台向管道写入密码(&让命令在后台运行,避免阻塞)
printf "password\n" > password_pipe &
# 让程序从管道读取输入
./your-target-program < password_pipe
# 用完后删除管道
rm password_pipe

这个方法的原理是提前把输入内容写入管道,当程序启动后读取管道时,就能立刻获取到输入内容。

方法4:用script模拟终端环境

script命令可以创建一个伪终端,让程序以为自己在和真实终端交互,这样就能通过here-doc传递输入:

script -q -c './your-target-program' /dev/null << EOF
password
EOF

-q让script安静运行(不显示日志信息),-c指定要运行的程序,/dev/null用来丢弃script生成的日志文件。

内容的提问来源于stack exchange,提问作者Erika

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:52:40