我正在编写一个Expect脚本,但在处理shell提示符时遇到问题(在Linux上)。 My Expect脚本生成rlogin
,远程系统正在使用ksh
。远程系统上的提示包含当前目录,后跟" > "
(空间大于空格)。脚本片段可能是:
send "some command here\r"
expect " > "
这适用于简单的命令,但是当我发送的命令超出终端的宽度时(或者更确切地说,ksh
认为是终端的宽度),事情开始出错。在这种情况下,ksh
会对交互式命令行进行一些奇怪的水平滚动,这似乎会重写提示并在输出中粘贴一个额外的“>”。当然,这会导致Expect脚本在执行命令后输出中出现多个提示时出现混淆和不同步(我的脚本包含多个send
/ expect
对)。
我尝试将远程系统上的PS1
更改为更像“提示>”这样更具特色的内容,但出现了类似的问题,这些问题向我表明这不是解决此问题的正确方法。
我正在想的可能是帮助脚本能够告诉Expect“我知道此时我已经与远程系统正确同步,因此现在请刷新输入缓冲区。” expect
语句有-notransfer
标志,即使模式匹配,也不会丢弃输入缓冲区,所以我认为我需要与之相反。
我可以使用其他任何有用的技术来使远程shell的行为更具可预测性吗?据我所知,Expect经历了大量的工作,以确保生成的会话出现与远程系统交互,但我宁愿一些更烦人的交互功能(如ksh
的水平滚动关闭。
答案 0 :(得分:7)
如果你想抛弃Expect目前所见的所有输出,请尝试
expect -re $
这是$的正则表达式匹配,意味着输入缓冲区的结束,因此它将跳过目前为止收到的所有内容。更多详情请见Expect man page。
答案 1 :(得分:1)
您可以尝试“设置-o multiline”或COLUMNS = 1000000(或其他适当大的值)。
答案 2 :(得分:0)
我过去曾经遇到过ksh和Expect的困难。我的解决方案是使用其他东西 ksh用于登录shell。
如果您可以将远程登录更改为ksh以外的其他命令(使用chsh命令或编辑/ etc / passwd),那么您可以尝试使用/ bin / sh作为shell。
另一种选择是告诉KSH终端是一个哑终端 - 禁止它进行任何特殊处理。
$ export TERM=""
可能会成功。