Perl expect不';注销后无法工作
这是一个非常简单的代码,用于连接到服务器、运行一些命令、断开连接并在本地运行更多命令Perl expect不';注销后无法工作,perl,ssh,expect.pm,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 so
#!/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
执行相同的操作-连接到一个服务器,从它连接到另一个服务器,等等。。。并对所有这些进行研究
我做错了什么?如何实现所需的行为?显然就在
$expect->send(“退出”)之后代码>脚本仍在尝试向远程服务器或任何人发送消息(因为它正在断开连接)。解决方案是将expect
与来自本地服务器的提示文本一起使用(,但确保使用的模式仅与本地提示匹配,而不与远程提示匹配!):
或者使用某种延迟(send\u slow
,某种类型的睡眠,等等)。断开连接后,您似乎正在尝试向服务器发送命令。我不认为这有多大作用。至于它为什么挂起,可能是如何实现超时的问题。你在运行什么操作系统?我的第一个问题是为什么要使用Expect模块来运行本地命令?使用system
或IPC::Run
或IPC::Open2
不是更容易吗?对于ssh命令,我将使用其中一个ssh模块,而不是Expect。@RonBergin另外,我将看一看perl的ssh。我是perl新手,甚至没有意识到它有这样一个模块
$expect->expect($timeout, [ qr/local_prompt/ ] );