【问题标题】:How can I flush the input buffer in an expect script?如何刷新期望脚本中的输入缓冲区?
【发布时间】:2010-12-25 00:33:04
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: ksh expect


    【解决方案1】:

    如果你想扔掉 Expect 到目前为止看到的所有输出,试试

    expect -re $
    

    这是 $ 上的正则表达式匹配,这意味着输入缓冲区的结尾,因此它将跳过到目前为止收到的所有内容。更多详情请访问Expect man page

    【讨论】:

    • 好极了,这似乎正是我所需要的。
    【解决方案2】:

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

    【讨论】:

    • 这个系统上的ksh似乎没有multiline选项,但是我发现如果我set +o emacs(关闭emacs行编辑选项,这似乎是这里的默认值)然后水平滚动也被禁用。
    【解决方案3】:

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

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

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

    $ export TERM=""
    

    可能会成功。

    【讨论】:

    • 不幸的是,在这种情况下,很多其他事情都依赖于 shell 是 ksh。我会尝试取消设置TERM,这是个好主意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 1970-01-01
    相关资源
    最近更新 更多