2009-12-09 57 views
5

我正在编写一个Expect脚本,并且在处理shell提示时遇到问题(在Linux上)。我的预期脚本产生rlogin,远程系统使用ksh。远程系统上的提示包含当前目录,然后是" > "(空间大于空间)。脚本片段可能是:如何在预期脚本中刷新输入缓冲区?

send "some command here\r" 
expect " > " 

这适用于简单的命令,但事情开始时,我发送命令超出终端的宽度(或者更精确地出问题,什么ksh认为是宽度终点站)。在这种情况下,ksh会在交互式命令行中进行一些奇怪的水平滚动,这似乎会重写提示并在输出中附加一个额外的“>”。当然,这会导致Expect脚本在执行命令后出现输出中出现多个提示时(我的脚本包含多个send/expect对),会感到困惑并且不同步。

我试过将远程系统上的PS1更改为“prompt>”这类更具特色的东西,但是出现了类似的问题,这表明这不是解决问题的正确方法。

我在想什么可能会有帮助的是脚本能够告诉“我知道我现在正确地与远程系统同步,所以现在刷新输入缓冲区。” expect声明有-notransfer标志,其中不会即使模式匹配,也会丢弃输入缓冲区,所以我认为我需要与此相反。

是否还有其他有用的技术可以用来使远程shell的行为更具可预测性?我知道Expect经历了很多工作,以确保产生的会话出现与远程系统交互,但我宁愿一些更令人讨厌的交互功能(例如水平滚动ksh)被关闭。

回答

7

如果你想扔掉所有输出到目前为止Expect是已经看到了,尝试

expect -re $ 

这是$一个正则表达式匹配,这意味着输入缓冲区的结尾,所以它只是跳过收到的一切都那么远。更多详情,请致电Expect man page

+0

非常好,这似乎正是我所需要的。 – 2009-12-10 21:18:59

1

你可以尝试“set -o multiline”或COLUMNS = 1000000(或其他适当的大值)。

+0

这个系统上的'ksh'似乎没有'multiline'选项,但我发现如果我设置了+ emacs'(关闭emacs行编辑选项,这看起来像是默认在这里),那么水平滚动也被禁用。 – 2009-12-09 21:48:52

0

我在使用ksh和Expect时遇到了困难。我的解决方案是使用除登录shell以外的 ksh。

如果您可以将远程登录更改为非ksh(使用chsh命令或编辑/ etc/passwd),那么您可以使用/ bin/sh作为shell来尝试此操作。

另一种方法是告诉KSH,终端是一个哑终端 - 不允许它进行任何特殊处理。

$ export TERM="" 

可能做的伎俩。

+0

不幸的是,在这种情况下,很多其他的东西都依赖于shell是ksh。我会尝试取消设置'TERM',这是一个好主意。 – 2009-12-10 04:10:53