Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl expect不';注销后无法工作_Perl_Ssh_Expect.pm - Fatal编程技术网

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/ ] );