我在Perl中使用Expect模块进行交互式活动并在远程计算机上执行命令。请求您的帮助
以下是我使用的步骤
切换用户到另一个帐户。 发送密码登录。 获得新用户的shell后,执行ssh命令连接到远程计算机。
然后我想在该远程机器中执行命令并获得其响应。 我能够在远程机器上执行该命令。我也看到了终端上的输出。 但我无法在变量中捕获它,以便我可以将它与值进行比较。
use Expect;
my $exp = Expect->new;
$exp->raw_pty(1);
$exp->spawn('su - crazy_user') or die "Cannot spawn switch user cmd: $!\n"
$exp->expect($timeout,
[ qr/Password:/i,
sub { my $self = shift;
$self->send("$passwd\n");
exp_continue;
}],
[ qr/\-bash\-4.1\$/i,
sub { my $self = shift;
$self->send("ssh $REMOTE_MACHINE\n");
$self->send("$COMMAND1\n");
exp_continue;
}]
);
$exp->soft_close();
如何通过$COMMAND1
获取我在远程计算机上执行的$self->send("$COMMAND1\n")
的结果?
答案 0 :(得分:1)
我绝不是这方面的专家,但到目前为止还没有人回答,让我尝试一下。
您的expect命令是su
,因此,正常的期望只会对该命令回答原始shell的任何内容起作用。然而,这只是密码提示,也许是一些错误消息。您仍然可以发送命令,但是它们的响应显示在新用户的shell上,而不是执行了expect命令的shell。这就是为什么它们出现在屏幕上但不出现在您的expect对象可用的流中。请注意,如果你直接在哪里ssh,你可能会遇到同样的问题(我不知道为什么你会su然后再ssh,你不能直接ssh crazy-user@remote_machine
吗?)。
解决方案可能是将su
和ssh
直接删除到使用Net::SSH::Expect而不是普通Expect的远程计算机上所需的用户,因为它会为您提供所有写入的内容远程控制台在其输出流中。但要小心,如果我没记错的话,检查流的语法略有不同。