使用Expect Module的Telnet会话无法发送命令ctrl + A.

时间:2013-08-30 17:01:30

标签: perl switch-statement telnet expect

我正在尝试连接到信令点开关的开关。

我需要执行以下命令才能进入登录终端。

  1. telnet IP端口
  2. 发送CTRL + A
  3. 获取提示">"
  4. 发送命令登录:uid = user。
  5. 密码请求提供密码。
  6. 获取终端">"
  7. 然后我必须继续执行一些命令才能更进一步,但我的问题是我在发送CTRL + A时遇到问题。

    当我发送" ctrl + A"使用Expect它只是打印" ^ A"等等并没有为我提供终端。

    因此,我通过将命令更改为" ctrl + A \ n"来修改脚本。它给了我终端,但在我的下一个终端提示符上有新行。

    如下面的输出:

    ^A
    ^A
    ^A
    
    >
    
    wait's here at next line.
    

    无法匹配我的下一个命令正则表达式">"并且不会发送登录名。

    有人可以告诉我为什么我的第一个命令" ^ A"没能让我终端?为什么命令在我到达终端之前被执行了三次?

    我的手动场景它适用于单个ctrl + A

    我的示例代码:

    use Expect;
    
    my $exp = Expect->spawn("telnet 10.10.1.35 2020");
    
    $exp->expect($timeout,
                   [ qr/]'./ => sub {my $exp = shift;
                                        $exp->send("\cA\n");
                                          } ]
    );
    $exp->expect($timeout,
                   [ qr/>/ => sub { my $exp = shift;
                                         $exp->send("login:uid=user\n");
                                          } ]
    );
    $exp->expect($timeout,
                   [ qr/Enter Password :/ => sub { my $exp = shift;
                                         $exp->send("xxx\n");
                                          } ]
    );
    

    谢谢你, 普拉迪普。

1 个答案:

答案 0 :(得分:0)

尝试使用send "\01"

请咨询更多信息 http://expect.sourceforge.net/FAQ.html#q54

我喜欢从字面上输入大多数控制字符 - 因为生成的脚本更具可读性。但是,您的编辑必须允许这样做。例如,假设您要发送Control-A。传统上,大多数编辑器将其显示为^ A,但您不能只输入^和A.(这将只发送这两个字符。)大多数编辑器都有一些简单的引用机制,允许您逐字输入下一个字符。例如,使用emacs,我可以输入^ Q ^ A,这将添加单个字符^ A。

或者,Tcl提供了使用八进制或十六进制进行编码的方法。八进制编码机制比十六进制更不容易出错,所以我将演示使用八进制。例如,由于^ A在ASCII中具有八进制值1,因此要发送^ A:

send "\01"