【问题标题】:TCL / Expect - After Interact, expect_user doesn't echoTCL / Expect - 交互后,expect_user 不回显
【发布时间】:2015-07-18 17:46:51
【问题描述】:

所以我有一个简单的脚本,可以登录到网络设备,然后进行交互,允许用户调用各种宏。我在下面有一个示例 - 用户在设备中,点击“!p”,然后脚本希望用户输入命令。

一切正常,除了程序没有回显用户输入的内容,因此他们不可能纠正错误输入。

我目前的解决方案是stty echoexpect_user 之前和stty -echo 之后。但是在这个解决方案中,退格键和箭头键按下被捕获,因此用户仍然无法更正他们的错误输入。

我不确定如何解决这个问题,但我认为生成的程序控制了 STDOUT,所以当调用 expect_user 时,它在后台。

set hostname 10.0.0.1
set password 1234qwer

spawn ssh -o StrictHostKeyChecking=no $hostname
expect {
        "assword:" {
                        send "$password\r"
                        expect "#"
        }
}
interact {
        "!p" {
                send_user "\nInput command: "
                expect_user -re "(.*)\r" {
                        puts "\n$expect_out(1,string)"
                }
        }
}

【问题讨论】:

    标签: ssh tcl expect


    【解决方案1】:

    在其最简单的形式中,interact 命令在用户和当前生成的进程之间建立了连接。 用户终端进入原始模式,这样连接是透明的。

    原始模式 是一种特定类型的面向字符 模式,其中没有对输入字符应用特殊解释。例如,Ctrl-C 不再充当中断,Ctrl-D 不再充当eofraw 模式 的对立面是cooked 模式。它代表了面向行模式的最常见形式。

    因此,要实现您想要的,您必须在提示用户输入之前将终端置于熟化模式。

    stty -raw echo; # Put the terminal to cooked mode, echo is enabled.
    stty raw -echo; # Put the terminal to raw mode, echo is disabled.
    

    由于终端处于交互的原始模式,它根本不会回显字符,您可能已经注意到了。即当你输入!p 时,你根本看不到它。有一个选项可以使其回显。带有interact-echo 标志将完成这项工作。

    例如,interact -echo "Hello" {puts " World"} 将在用户键入时回显 Hello。这也可以添加到您的脚本中。

    加上所有这些方面,最终的代码可以写成如下,

    interact {
             -echo "!p" {
                    send_user "\nInput command: "
                    stty -raw echo; # Enabling cooked mode
                    expect_user -re "(.*)\n" {
                            set input $expect_out(1,string)
                            puts "You have typed : $input"
                            # Process the user input as per your idea
                    }
                    stty raw -echo; # Enabling raw mode again.
              }
    }
    

    【讨论】:

    • 再次感谢您回答我的所有问题。有趣的是,我尝试了stty cooked,但没有尝试stty cooked echo。附带说明一下,使用 expect_userset var [gets stdin] 有什么好处
    • @genx1mx6 :我错过了您对其他问题的评论。否则,可以在那里回答。顺便说一句,当涉及到expect 时,使用expect_user 总是更好。看看Donal Fellows 先生的this 答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    • 2020-09-28
    • 2015-05-21
    • 1970-01-01
    • 2011-11-25
    • 1970-01-01
    相关资源
    最近更新 更多