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

时间:2013-11-29 07:53:44

标签: 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_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衬里,我打印欢迎消息并要求用户名并打印回来..

1 个答案:

答案 0 :(得分:1)

来自未来的人们:

事实证明,通过exec()启动的脚本的第一个输出仅作为exec()的返回值而不是输入流中的返回值。基本上exec()的行为类似于send(),后跟read_all()。尽管如此,稍后可以通过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()将返回远程控制台上显示的所有内容,如果还有其他内容正在运行,则不一定只返回一个脚本的输出。