SSH登录后Shell提示符长时间延迟,Expect脚本执行异常求助
问题解决建议
你的Expect脚本在SSH登录后等待Shell提示符时出现异常延迟,核心原因多是提示符正则匹配不精准、SSH终端参数设置导致输出缓冲,或是expect逻辑拆分不合理。以下是针对性解决办法:
1. 精准匹配Shell提示符
默认的$prompt变量可能匹配范围模糊,建议根据实际Shell类型定义精准正则:
# 匹配bash/zsh常见提示符($、#、%结尾) set prompt {[$#%>]$} # 若为带用户名/主机名的自定义提示符,可更精准: # set prompt "${user}@${host}:.*[$#%>]$"
2. 调整SSH终端参数
-t参数可能导致终端缓冲延迟,改用-tt强制分配伪终端,避免输出阻塞:
spawn ssh -tt -q -o StrictHostKeyChecking=no "$user@$host"
3. 合并expect逻辑减少等待
将等待提示符的操作合并到第一个expect块,避免额外的等待步骤:
set timeout 15 spawn ssh -tt -q -o StrictHostKeyChecking=no "$user@$host" expect { -re "closed by remote host" { continue } -re "(P|p)assword: " { send "$pass\r"; exp_continue } -re $prompt { send -- "sudo passwd\r"; } }
4. 单独设置expect超时
若全局timeout未生效,可为等待提示符的expect操作单独指定超时:
expect -timeout 5 -re $prompt
5. 开启调试排查匹配问题
添加exp_internal 1开启Expect调试模式,查看实际交互输出,确认提示符是否被正确识别:
exp_internal 1 ;# 输出所有交互细节,方便排查匹配问题 set timeout 15 spawn ssh -tt -q -o StrictHostKeyChecking=no "$user@$host" ...
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

