Perl 使用Expect模块的Telnet会话无法发送命令ctrl+;A.

Perl 使用Expect模块的Telnet会话无法发送命令ctrl+;A.,perl,switch-statement,telnet,expect,Perl,Switch Statement,Telnet,Expect,我正在尝试连接到交换机,它是信令转辙机 我需要执行以下命令才能进入登录终端 telnet IP端口 发送CTRL+A 获取提示“>” 发送命令登录名:uid=user 密码请求提供密码 获取终端“>” 然后我必须继续执行一些命令才能继续,但我的问题是,在发送CTRL+A时,我遇到了一个问题 当我使用Expect发送“ctrl+A”时,它只打印“^A”,等待不会提供终端 因此,我修改了脚本,将命令更改为“ctrl+A\n”,这将为我提供终端,但在下一个终端提示符上有新行 与以下输出类似: ^A ^

我正在尝试连接到交换机,它是信令转辙机

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

  • telnet IP端口
  • 发送CTRL+A
  • 获取提示“>”
  • 发送命令登录名:uid=user
  • 密码请求提供密码
  • 获取终端“>”
  • 然后我必须继续执行一些命令才能继续,但我的问题是,在发送CTRL+A时,我遇到了一个问题

    当我使用Expect发送“ctrl+A”时,它只打印“^A”,等待不会提供终端

    因此,我修改了脚本,将命令更改为“ctrl+A\n”,这将为我提供终端,但在下一个终端提示符上有新行

    与以下输出类似:

    ^A
    ^A
    ^A
    
    >
    
    wait's here at next line.
    
    它与我的下一个命令正则表达式“>”不匹配,并且不发送登录名

    有人能告诉我为什么我的第一个命令“^A”不能让我使用终端吗?为什么在我拿到终端之前命令被执行了三次

    I手动场景对于单个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");
                                          } ]
    );
    
    谢谢,, Pradeep.

    尝试使用
    发送“\01”

    请咨询更多信息

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

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

    send "\01"
    

    尝试
    $exp->send(chr(1))发送Ctrl-AI得到了Ctrl+a字符,它没有再移动,只是在等待。