Perl Net::SSH::Expect交互式会话

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_

我想登录到远程服务器并执行一个名为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_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”)
呢?