我有一个密码变量$pw
和一个命令变量$cmd
。
$pw=UNIX password of a remote machine.
$cmd=Command to be executed in the remote machine.
现在如果我使用back-tick
运行命令
我将能够在输出变量中获得一些值。
现在如果我想通过期望运行相同的命令我如何实现相同。我的意思是如何通过变量中的期望来运行命令的输出。
我的期望功能如下:
sub expt($$){
my $cmd;
my $timeout;
($cmd, $pw)=@_;
$expect = Expect->new;
$expect->raw_pty(1);
printDebug("Running the command under expt");
$expect->spawn($cmd)
or die "Cannot spawn $cmd: $!\n";
$expect->expect($timeout,
[ qr/password:/i, #/
sub {
my $self = shift;
$self->send("$pw\n");
exp_continue;
}
],
[qr/Are you sure you want to continue connecting \(yes\/no\)?/
, sub { my $self = shift;
$self->send("yes\n");
exp_continue; }],
[qr/Unix password \(user\):/
, sub { my $self = shift;
$self->send("pw\n");
exp_continue; }
],
);
$expect->soft_close();
return 0;
}
我正在调用像
这样的函数expt($cmd,$pw);
通过这样做,我能够在远程主机中执行脚本,但我的要求是将远程主机的输出存储在本地变量中。
答案 0 :(得分:1)
为什么不使用Net::SSH::Expect
?它会更接近第一种方法:你“只是”需要做类似的事情:
my $ssh = Net::SSH::Expect->new (
host => "myserver.com",
user => 'myuser',
raw_pty => 1
);
$ssh->run_ssh() or die "SSH process couldn't start: $!";
($ssh->read_all(2) =~ />\s*\z/) or die "where's the remote prompt?"
$ssh->exec("stty raw -echo");
my $output = $ssh->exec($cmd);
查看Net::SSH::Expect
pod文档,它非常广泛。