如何抑制期望发送输出?

Bit*_*iot 4 expect

我有一个期望脚本,我想表现为一个花哨的ssh程序,它可以在运行命令之前跳过几台机器并在目标机器上设置环境.

我可以使用log_user 0/1关闭/打开expect的输出,这有助于密码提示和登录横幅,以及设置环境的命令.

但是,就像ssh一样,一旦我的脚本开始发出命令,我不想看到发出的命令.那就是发送"command \n"后我不想看"命令".我想看到的只是命令的结果.

如何抑制发送输出,但不抑制结果?

这是期望脚本的片段:

log_user 1
foreach daline [lrange \$argv 0 end] {
   send "\$daline\r"
   set buffer1 
}
Run Code Online (Sandbox Code Playgroud)

所以在此循环之前,我发送密码和设置环境.然后在这个循环中,我运行每个bash命令,该命令被作为参数提供给expect.

谢谢.

Din*_*esh 10

许多程序都反映了他们的意 例如,如果将date命令发送到shell,您将看到字符串日期后跟日期.更准确地说,您将看到通常在终端上看到的所有内容.这也包括格式化.

send "date\r" 
expect -re $prompt 
Run Code Online (Sandbox Code Playgroud)

上面的命令以expect_out (buffer)set为结尾date\r\nFri Nov 7 20:47:32 IST 2014\r\n.更重要的是,字符串日期已得到回应.此外,每行以a结尾\r\n,包括您发送的一行\r.日期的回声与send命令无关.

换句话说,没有办法发送字符串并发送不回应它,因为发送不首先回应它.产生的过程是.

在许多情况下,生成的进程实际上将回显任务委托给终端驱动程序,但结果是相同的 - 您将进程的输入视为进程的输出.

通常,回声输入只能使用log_user(您在不同的地方使用过).例如,假设已生成与远程主机的连接,并且您希望获得远程日期,但未看到日期命令本身已回显.一个常见的错误是写:

log_user 0 ;# WRONG 
send "date\r" ;# WRONG 
log_user 1 ;# WRONG 
expect -re .*\n ;# WRONG
Run Code Online (Sandbox Code Playgroud)

运行时,该log_user命令无效,因为expectexpect命令之前不读取回显的"日期" .解决此问题的正确方法如下:

send "date\r" 
log_user 0 
expect -re "\n(\[^\r]*)\r" ;# match actual date 

log_user 1 
puts "$expect_out(l,string)" ;# print actual date only 
Run Code Online (Sandbox Code Playgroud)

如果要向远程shell发送大量命令,那么首先禁用所有回显可能会更方便.您可以生成一个shell然后发送命令stty -echo,之后将不再回显您的命令.stty echo重新启用回声.

spawn ssh <host>
stty -echo; # Disable 'echo' here
expect something

#Your further code here

stty echo # Enable 'echo' here

#Close of connection
Run Code Online (Sandbox Code Playgroud)

参考:探索期待

  • 无论你在哪里放置`log_user 1`或`stty echo`,仍然会泄漏密码.所以无法真正重新打印. (3认同)