1

我正在尝试连接到作为信号点开关的开关。

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

  1. 远程登录 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”不能让我终端吗?为什么在我得到终端之前命令被执行了三遍?

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

谢谢你,普拉迪普。

4

1 回答 1

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"
于 2013-09-01T12:14:36.797 回答