我正在编写一个Expect脚本,并且在处理shell提示时遇到问题(在Linux上)。我的预期脚本产生rlogin
,远程系统使用ksh
。远程系统上的提示包含当前目录,然后是" > "
(空间大于空间)。脚本片段可能是:如何在预期脚本中刷新输入缓冲区?
send "some command here\r"
expect " > "
这适用于简单的命令,但事情开始时,我发送命令超出终端的宽度(或者更精确地出问题,什么ksh
认为是宽度终点站)。在这种情况下,ksh
会在交互式命令行中进行一些奇怪的水平滚动,这似乎会重写提示并在输出中附加一个额外的“>”。当然,这会导致Expect脚本在执行命令后出现输出中出现多个提示时(我的脚本包含多个send
/expect
对),会感到困惑并且不同步。
我试过将远程系统上的PS1
更改为“prompt>”这类更具特色的东西,但是出现了类似的问题,这表明这不是解决问题的正确方法。
我在想什么可能会有帮助的是脚本能够告诉“我知道我现在正确地与远程系统同步,所以现在刷新输入缓冲区。” expect
声明有-notransfer
标志,其中不会即使模式匹配,也会丢弃输入缓冲区,所以我认为我需要与此相反。
是否还有其他有用的技术可以用来使远程shell的行为更具可预测性?我知道Expect经历了很多工作,以确保产生的会话出现与远程系统交互,但我宁愿一些更令人讨厌的交互功能(例如水平滚动ksh
)被关闭。
非常好,这似乎正是我所需要的。 – 2009-12-10 21:18:59