【发布时间】: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) 的水平滚动被关闭。
【问题讨论】: