Unix下Expect脚本执行命令失效问题求助
解决Expect脚本SSH登录后无法执行命令的问题
我看了你的脚本和输出,问题核心出在提示符匹配不正确——脚本登录后没识别到远程主机的实际提示符,直接提前退出了,导致后面的ps -aef命令根本没发送出去。
先拆解下你的问题:
你原本用expect "$ "匹配远程提示符,但实际远程主机的提示符是[aacdd123@linprod345 ~]$ 这种带方括号、用户名、主机名的格式,你的匹配规则完全不生效,脚本自然不会执行后续的send操作,直接结束回到本地终端了。另外你的expect分支写法也可以优化,让登录逻辑更清晰。
给你修正后的脚本:
#!/usr/bin/expect set timeout 60 # 启动SSH连接 spawn ssh xxxx@xxxxxx # 处理登录流程:首次登录的yes/no确认,以及密码输入 expect { "yes/no" { send "yes\r" exp_continue ;# 发送yes后继续等待密码提示,避免嵌套混乱 } "*?assword" { send "xxxxxx\r" } } # 用正则匹配远程主机的提示符,适配[用户名@主机名 路径]$ 这类格式 expect -re {\[.*\]\$ } # 发送要执行的命令 send "ps -aef\r" # 等待命令执行完成,再次匹配提示符确保命令跑完 expect -re {\[.*\]\$ } # 退出远程连接 send "exit\r" expect eof
关键修改点说明:
- 精准匹配提示符:用
expect -re {\[.*\]\$ }这个正则表达式,能适配任何[xxx@xxx xxx]$格式的提示符,不管用户名、主机名是什么,都能准确识别。 - 优化登录逻辑:用
exp_continue让脚本在发送yes后继续等待密码提示,避免嵌套的expect结构,逻辑更简洁。 - 确保命令执行完成:发送命令后再次匹配提示符,保证远程主机执行完命令并返回提示符后,脚本再进行下一步,不会提前中断连接。
你可以试试这个脚本,应该就能正常执行ps -aef命令并看到输出了。
内容的提问来源于stack exchange,提问作者Sujeet Padhi
相关产品推荐
相关产品推荐

