Expect脚本调用远程外部脚本时send命令输出乱码问题求助
解决Expect脚本发送输入乱码及重复输入问题
问题根源
你看到的^[[6;1Rn是终端的光标位置报告(CSI控制序列),这是因为远程bash的终端类型设置与Expect不兼容,远程端开启了光标跟踪特性,导致发送的输入被终端转义成了控制序列。而重复输入的问题是因为read -n1不需要回车,加上回车后会产生额外输入,或者Expect没有正确匹配提示符导致本地输入被重复传递。
具体解决步骤
强制设置兼容的终端类型
在启动远程脚本时,将终端类型设置为dumb(无特殊终端特性),避免控制序列干扰:spawn ssh user@remote_host bash -c "TERM=dumb ./script.sh"或者先在远程会话中设置终端环境变量:
spawn ssh user@remote_host expect "$ " ;# 匹配远程提示符 send "TERM=dumb; export TERM\r" expect "$ " send "./script.sh\r"修改send命令,去掉多余的回车
因为read -n1会在读取单个字符后立即返回,不需要回车。直接发送输入字符即可:# 假设从Expect命令行获取用户输入 set pulltar [lindex $argv 0] send_user "你输入的字符是: $pulltar\n" # 不要加\r send "$pulltar"精准匹配read的提示符
确保Expect的expect语句准确匹配script.sh中的提示文本,避免遗漏或误匹配导致重复输入:# 匹配"RunFunction? [y,n]"这个提示 expect -exact "RunFunction? [y,n]" send "$pulltar"禁用终端回显优化交互
如果仍有终端交互异常,可以在Expect脚本开头设置终端模式为raw -echo,避免本地终端的回显干扰:set stty_init "raw -echo" spawn ssh user@remote_host ./script.sh # 后续逻辑...
内容的提问来源于stack exchange,提问作者Bartlomiej Zuranski
相关产品推荐
相关产品推荐

