【发布时间】:2014-09-26 21:47:20
【问题描述】:
我需要创建一个适用于CentOS 5.x 和CentOS 6.x 框的脚本。 CentOS 5.x 使用Perl 5.8 而CentOS 6.x 使用Perl 5.10。目标是能够通过 ssh 进入一个有密钥交换的盒子,然后运行 python -V,以确定默认版本是否为 python 2.6。
我猜如果我得到一个适用于 Perl 5.8 的脚本,那么它也适用于 5.10。我在 Net::SSH:Any 方面取得了一些进展,不得不将其丢弃,因为它看起来适用于 Perl 5.12 及更高版本。
我也尝试过IPC::System::Simple 和qx,但没有成功捕获输出。
我的一些失败尝试:
失败 1:
use IPC::System::Simple qw(system systemx capture capturex);
my $output = capture("/usr/bin/ssh root\@10.100.10.56 python -V");
print "out: " . $output . "\n";
失败2:
my $output = qx(ssh root\@10.100.10.56 python -V);
print "out: " . $output . "\n";
失败 3:
my @output = qx(ssh root\@10.100.10.56 python -V);
print "@output\n";
我不确定 ssh 的调用是否在玩任何东西,并且迫切需要进行健全性检查。运行命令时,输出显示在屏幕上,但不存储在变量中,我可以对其进行子字符串检查。 $output 变量留空。如果我遗漏了什么,请告诉我。谢谢:)
【问题讨论】:
-
python -V可能会写信给STDERR而不是STDOUT。另外,为什么不直接为 SSH 使用不同的模块,例如Net::OpenSSH? -
我查看了
SSH、SSH2和OpenSSH。我试图简化事情并直接运行命令以使事情正常进行。有没有办法让qx也捕获stderr? -
有。见How to capture both STDOUT and STDERR in two different variables using Backticks in Perl。但是,当存在纯 Perl 等效项时,您应该真正避免使用 bacticks/
system。Net::OpenSSH有一个很好的system方法,可让您控制STDIN、STDOUT、STDERR等。 -
我不知道你在说什么。
Net::OpenSSH在 5.8.x 上通过了 CPAN Testers 上的所有测试。我认为您只是在查看许可条款,这与模块是否可以在早期 Perl 版本上运行无关。 -
IIRC, Net::SSH::Any 只需要 perl 5.8。