Perl Net::SSH::Expect交互式会话
我想登录到远程服务器并执行一个名为welcome.pl的文件。此welcome.pl文件要求我输入用户名,并用输入的用户名问候我 我有一个失败的小代码段Perl Net::SSH::Expect交互式会话,perl,Perl,我想登录到远程服务器并执行一个名为welcome.pl的文件。此welcome.pl文件要求我输入用户名,并用输入的用户名问候我 我有一个失败的小代码段 use Expect; use Net::SSH::Expect; my $ssh = Net::SSH::Expect->new ( host => "omsas", user => 'root', raw_pty => 1 ); $ssh->run_
use Expect;
use Net::SSH::Expect;
my $ssh = Net::SSH::Expect->new (
host => "omsas",
user => 'root',
raw_pty => 1
);
$ssh->run_ssh() or die "SSH process couldn't start: $!";
my $mkdir = $ssh->exec("mkdir security");
$ssh->exec("cd security");
$ssh->exec("perl welcome.pl") or die "Cant execute";
$ssh->waitfor('You are in OMSAS server now. Enter username',1) or die "waited enopugh";
然而,我的代码在最后一行失败了。谁能帮我一下吗
welcome.pl是一个简单的3行程序,我在其中打印welcome消息,请求用户名并打印回来。亲爱的未来的人们: 事实证明,通过
exec()
启动的脚本的第一个输出只能作为exec()
的返回值找到,而不能在输入流中找到。基本上,exec()。尽管如此,以后可以通过send()
和任何读取方法(如read_all()
或waitfor()
)与启动的脚本交互
伪代码:
my $firstResponse = $ssh->exec("script.pl");
$ssh->send("What i tell the script.");
my $whatTheScriptAnswers = $ssh->read_all(1);
.
.
.
我使用read_all(1)
使read_all()
仅在不活动一秒钟后返回,以避免遗漏任何内容。请注意,read_all()
将返回远程控制台上显示的所有内容,如果有其他内容正在运行,则不一定只返回一个脚本的输出。您所说的“失败”是什么意思?它不编译吗?它超时了?它和它的女朋友私奔了?好吧,它抛出了我在死后提到的错误,即“wait enough”删除它后面的或die
部分,并按照以下行操作:print$ssh->before()代码>上面说什么?它应该给你流中的任何东西,这样我们就可以看到服务器是否回复了。它是空的!!不返回/打印任何内容。那么print ssh->exec(“perl-welcome.pl”)
呢?