如何在expect脚本中刷新输入缓冲区?

时间:2009-12-09 21:28:07

标签: ksh expect

我正在编写一个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的水平滚动关闭。

3 个答案:

答案 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=""

可能会成功。