我想登录远程服务器并执行名为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衬里,我打印欢迎消息并要求用户名并打印回来..
答案 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()
将返回远程控制台上显示的所有内容,如果还有其他内容正在运行,则不一定只返回一个脚本的输出。