【问题标题】:Telnet Session using Expect Module fails to send command ctrl+A使用 Expect 模块的 Telnet 会话无法发送命令 ctrl+A
【发布时间】:2013-09-03 11:40:53
【问题描述】:

我正在尝试连接到作为信号点交换机的交换机。

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

  1. telnet IP 端口
  2. 发送 CTRL+A
  3. 获取提示">"
  4. 发送命令 login:uid=user.
  5. 密码请求提供密码。
  6. 获取终端">"

然后我必须继续执行一些命令才能走得更远,但是我的问题是我在发送 CTRL+A 时遇到了问题。

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

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

像下面的输出:

^A
^A
^A

>

wait's here at next line.

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

谁能告诉我为什么我的第一个命令“^A”无法让我终端?为什么在我到达终端之前命令执行了3次?

我手动的场景它适用于单个 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");
                                      } ]
);

谢谢你, 普拉迪普。

【问题讨论】:

  • 尝试$exp->send(chr(1));发送Ctrl-A
  • 我得到了 ctrl+A 字符,它没有进一步移动它只是在等待。

标签: perl switch-statement telnet expect


【解决方案1】:

试试send "\01"

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

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

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

send "\01"

【讨论】:

    猜你喜欢
    • 2017-04-13
    • 1970-01-01
    • 2023-04-01
    • 2012-08-22
    • 2015-03-05
    • 2019-11-06
    • 2014-12-27
    • 2017-06-18
    • 1970-01-01
    相关资源
    最近更新 更多