6

我正在编写一个 Expect 脚本,但无法处理 shell 提示符(在 Linux 上)。我的 Expect 脚本生成rlogin并且远程系统正在使用ksh. 远程系统上的提示包含当前目录,后跟" > "(空格大于空格)。脚本片段可能是:

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

这适用于简单的命令,但是当我发送的命令超过终端的宽度(或者更准确地说,ksh认为是终端的宽度)时,事情就开始出错了。在这种情况下,ksh交互式命令行会进行一些奇怪的水平滚动,这似乎会重写提示并在输出中添加一个额外的“ > ”。当执行命令后输出中出现多个提示时,这自然会导致 Expect 脚本混淆和不同步(我的脚本包含多个send/expect对)。

我已经尝试PS1在远程系统上更改为更独特的内容,例如“prompt>”,但出现了类似的问题,这表明这不是解决此问题的正确方法。

我认为可能有帮助的是脚本能够告诉 Expect “我知道此时我已与远程系统正确同步,所以现在刷新输入缓冲区。” 该expect语句具有即使模式匹配也不会-notransfer丢弃输入缓冲区的标志,所以我认为我需要相反的情况。

是否有任何其他有用的技术可用于使远程 shell 的行为更具可预测性?我了解 Expect 进行了大量工作以确保生成的会话似乎与远程系统交互,但我宁愿ksh关闭一些更烦人的交互功能(例如 的水平滚动) .

4

3 回答 3

7

如果您想丢弃到目前为止 Expect 所看到的所有输出,请尝试

expect -re $

这是 $ 上的正则表达式匹配,这意味着输入缓冲区的结尾,因此它将跳过到目前为止收到的所有内容。更多详细信息请参见Expect 手册页

于 2009-12-10T13:56:59.083 回答
1

您可以尝试“set -o multiline”或 COLUMNS=1000000 (或其他一些合适的大值)。

于 2009-12-09T21:37:26.807 回答
0

过去我在使用 ksh 和 Expect 时遇到过困难。我的解决方案是使用 ksh 以外的其他东西作为登录 shell。

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

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

$ export TERM=""

可能会成功。

于 2009-12-10T02:18:34.347 回答