Shell脚本中ssh命令弹出密码提示时如何自动传入回车键?
空密码SSH自动回车验证解决方案
你之前尝试的方案全部失效的核心原因是:ssh 出于安全设计,密码提示的输入默认直接从 /dev/tty 设备读取,不会接收标准输入(stdin)的内容,所以通过管道传给stdin的换行符无法被ssh识别。
以下是可行的实现方案:
方案1:使用sshpass工具(操作最简单)
sshpass是专门为非交互ssh密码验证设计的工具,直接指定空密码即可自动完成验证:
- 先安装sshpass:
Debian/Ubuntu系:apt install sshpass
RHEL/CentOS系:yum install sshpass - 替换你的ssh调用语句为:
sshpass -p '' ssh -t root@${host} ${command}
如果你的密码提示不是默认的password:,可以加-P参数指定匹配的提示字符串,比如sshpass -P "请输入密码:" -p '' ssh ...
方案2:使用expect实现交互模拟(通用性最强)
expect可以模拟终端交互,适配任意自定义的提示场景,不需要依赖sshpass,写如下脚本即可:
#!/usr/bin/expect # 读取环境变量中的主机和命令参数 set host $env(host) set command $env(command) set timeout 15 # 启动ssh进程 spawn ssh -t root@$host $command # 匹配密码提示 expect "password:" # 发送回车符 send "\r" # 交回终端控制权 interact
运行前先给脚本加可执行权限chmod +x ssh_auto_enter.exp,执行时传入环境变量即可:host=目标主机地址 command=要执行的命令 ./ssh_auto_enter.exp
内容的提问来源于stack exchange,提问作者Abhi
相关产品推荐
相关产品推荐

