gpt4 book ai didi

perl - 使用 Net::SSH::Expect 通过 ssh 存储输出

转载 作者:行者123 更新时间:2023-12-04 23:47:50 26 4
gpt4 key购买 nike

这里是学生 worker 。这是我第一次使用 perl,我似乎已经用完了解决方案,所以我需要你的帮助!

我正在尝试通过 ssh 模块将 HP Storeonce 3540 上命令的输出存储在一个变量中,以便我可以提取一些我要监控的信息:

不确定它是否有用,但仅供引用,输出是这样的:

系统/显示>性能

Service Set 1
Storage Usage
Current: xxxxx TB
Maximum: xxxxx TB
Throughput
VTL Read: 0 MB/s
VTL Write: 0 MB/s
NAS Read: 0 MB/s
NAS Write: 0 MB/s
Catalyst Read: 0 MB/s
Catalyst Write: 0 MB/s
Replication
Inbound: 0 MB/s
Outbound: 0 MB/s
Catalyst
Inbound: 0 MB/s
Outbound: 0 MB/s

代码如下:

use Net::SSH::Expect;
use Capture::Tiny ':all';
use Backticks;
( ... )
my $ssh = Net::SSH::Expect->new (
host => $hp_host,
password=> $hp_pwd,
user => $hp_user,
raw_pty => 1,
timeout => 20
);
my $login_output = $ssh->login();
if ($login_output !~ />/)
{
die "Login has failed. Login output was $login_output";
}
$ssh->send("system");
$ssh->waitfor('\>\s*\z', 5) or die "Error #1-system";
$ssh->send("show");
$ssh->waitfor('\>\s*\z', 5) or die "Error #2-show";

我想在这里存储“performance”命令的输出。 我尝试了很多组合,所以这里是:

1 -say '$ssh->send("performance")'->stdout;

给我这个错误:

在 script_hpstoronce.pl 第 67 行,靠近“say '$ssh->send("performance")'”处找到了运算符(operator)预期的字符串
(你需要预先声明 say 吗?)
script_hpstoonce.pl 行 xx 处的语法错误,靠近“say '$ssh->send("performance")'”

2 -反引号->run( '$ssh->send("performance")' );
打印 $stdout;

它不打印输出

3 -每次我将 "$ssh-> " 放在命令前面时,我都会收到此错误:

例如:$ssh->Backticks->run( 'send("performance")' );要么$string = $ssh->tee('performance');

错误:无法通过包“Net::SSH::Expect”在 script_hpstoronce.pl 第 xx 行找到对象方法“Backticks”/或(“Tee”)/。

4 - $test = Backticks->stdout('performance');
打印 $stdout;
要么 打印 $test;

错误:无法通过包“Net::SSH::Expect”在 script_hpstoronce.pl 行 xx 找到对象方法“Backticks”。

5 -我还尝试再次使用 Capture::Tiny 模块:

$stdout = capture { $ssh->send("performance") };
打印 $stdout;

给我这个错误:

无法通过包“Net::SSH::Expect”在 script_hpstoronce.pl 行 xx 找到对象方法“capture”。

但是

($stdout, $stderr) = capture {$ssh->send("performance")};
打印 $stdout;

$stdout = capture_stdout{$ssh->exec("performance")};
打印 $stdout;

my($stdout, $stderr, $exit) = $ssh->send('性能');
打印 $stdout;

$stdout = $ssh->capture('性能');
打印 $stdout;

运行脚本时不打印任何内容。

6 -T 恤也是如此:

$string = tee {$ssh->send("performance")};
打印 $string;

不打印任何东西

由于即使我使用不同的模块也会弹出相同的错误,我明白我可能 由于我缺乏语言知识和缺乏经验而遗漏了一些东西,但我不能 似乎发现这里出了什么问题。 $ssh-> 协议(protocol)有问题吗??

谢谢

最佳答案

Perl 将主要收集各种输出而无需额外的包。只有在特殊情况下您才需要额外的东西。在这种情况下,只需 Net::SSH::Expect 就足够了。

我的系统上没有 Net::SSH::Expect 但看起来你需要的是:

$ssh->send("find /");   # using send() instead of exec()
my $line;
while ( defined ($line = $ssh->read_line()) ) {
print $line . "\n";
}

对于像您所展示的那样简短的内容,我倾向于跳过 send 和 read_line 的复杂性而直接使用 exec。

my $who = $ssh->exec("who");
print ($who);

关于perl - 使用 Net::SSH::Expect 通过 ssh 存储输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45491192/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com