注销后Perl期望不起作用

时间:2015-05-07 14:12:05

标签: perl ssh expect.pm

一个非常简单的代码,用于连接服务器,运行一些命令,断开连接并在本地运行更多命令。

#!/usr/bin/perl

use strict;
use warnings;

use Expect;

my $timeout = 15;
my $password = "1234";

my $expect = new Expect;
$expect->raw_pty(1);
$expect->spawn("bash\n");

$expect->send("echo run some initial commands locally\n");   # edit: added this line

$expect->send("ssh 1.2.3.4\n");
$expect->expect($timeout,
                [   qr/password/,
                    sub {
                        $expect->send("$password\n");
                    }
                ]
                );
$expect->expect($timeout, [ qr/prompt/ ] );

$expect->send("echo run some commands on the server\n");

$expect->send("exit\n");   # disconnect from the server

$expect->send("echo run some more commands locally\n");

$expect->send("exit\n");   # exit bash
$expect->soft_close();

此代码适用于第一个exit命令。它与服务器断开连接,但整个脚本似乎都冻结了。没有其他命令被执行,我必须按Ctrl + C或等到它超时。

编辑:当我在本地执行命令时它起作用,当我远程执行某些命令时它起作用,然后我想返回本地工作,但我不能。

另外,我希望对嵌套的ssh做同样的事情 - 连接到一台服务器,从一台服务器连接到另一台服务器等等......然后处理所有这些服务器

我做错了什么?我怎样才能达到预期的行为?

1 个答案:

答案 0 :(得分:2)

显然在$expect->send("exit\n");之后,脚本仍在尝试向远程服务器或没有人发送消息(因为它正在断开连接过程中)。解决方案是使用expect来自本地服务器的提示文本(但请确保使用的模式仅匹配本地提示而不是远程提示!):

$expect->expect($timeout, [ qr/local_prompt/ ] );

或使用某种延迟(send_slow,某种类型的睡眠等......)。