我正在编写一个脚本来与远程服务器通信。我了解如何发送基本的 shell 命令,例如“ls”或“find / |grep foo”。但我正在另一端执行一个交互式应用程序。
如果我调用 $ssh->shell,我会从远程服务器获得提示,因此我知道 SSH 正在接收此提示。但是后来我什么也做不了,因为脚本被阻止在 shell 中。
我安装了两个处理程序。如果我使用脚本连接到一个基本的 ssh 主机,并执行一个 shell 命令,响应就会传递给处理程序,所以我知道它们是好的。所以我希望我正在执行的应用程序的提示会发送到这些,但事实并非如此。
#!/usr/bin/perl -w
use strict;
use Net::SSH::Perl;
my $host = 'rt.olsendata.com';
my $user = 'rtdemo';
my $pass = 'rtdemo';
my %params = ('debug' => 1,'protocol' => 2);
my $ssh = Net::SSH::Perl->new($host, %params);
$ssh->register_handler("stderr", sub{
my ($ssh, $packet) = @_;
receiveerrors($packet);
});
$ssh->register_handler("stdout", sub{
my ($ssh, $packet) = @_;
receivedata($packet);
});
my ($output, $errors, $exit) = $ssh->login($user, $pass);
此时我需要通过发送“1”来响应提示。但这被远程主机解释为 shell 命令,而不是对提示的响应。它返回错误“h:1:没有这样的文件或目录”。
如果您想尝试一下,可以使用代码顶部的演示 ssh 帐户。它是公开的。
编辑:我意识到 Expect 解决了这个问题,但我在 Expect 中找不到任何与 register_handler() 等效的东西。我是对的吗?