Linux perl远程执行错误
在下面的代码中,我尝试使用Perl脚本将git存储库克隆到另一台机器上 如果我打印Linux perl远程执行错误,linux,perl,ssh,perl-module,Linux,Perl,Ssh,Perl Module,在下面的代码中,我尝试使用Perl脚本将git存储库克隆到另一台机器上 如果我打印$output,我将获得所有登录消息,即/etc/motd/的内容,但不是实际的命令输出 如何解决这个问题?我在执行ssh命令时是否做错了什么 sub myexec_remote { my($cmd, $hostname, $filename) = @_; my $stdout = $stderr = $exit= ""; my ($output)
$output
,我将获得所有登录消息,即/etc/motd/
的内容,但不是实际的命令输出
如何解决这个问题?我在执行ssh命令时是否做错了什么
sub myexec_remote
{
my($cmd, $hostname, $filename) = @_;
my $stdout = $stderr = $exit= "";
my ($output) = `ssh $hostname $cmd 2>&1`;
## this is the command i.e, executed
##command is ssh 111.22.11.32 "git clone --bare gt@l.com:/nfs/git/ /nfs/new123/"
$exit = $?;
if (defined $output)
{
open(MYOUTFILE, ">$filename");
print MYOUTFILE "$output";
close(MYOUTFILE);
}
}
我之所以使用反勾号,是因为有时候ssh是在没有密码的情况下完成的,并且我已经看到NET:ssh模块不支持它…这是因为您在列表上下文中使用了:
my ($output) = `ssh $hostname $cmd 2>&1`;
在列表上下文中调用backticks时,backticks将返回一个行列表。您只捕获第一行,并将其放入$output
。其他行将被忽略。从perldoc perlop
:
在标量上下文中,它返回为单个(可能是多行)
字符串,如果命令失败,则为undef。在列表上下文中,返回
行列表(但您已使用$/或定义行
$INPUT_RECORD_SEPARATOR),如果命令失败,则为空列表
解决方案:
在标量上下文中调用backticks将导致$output成为多行字符串
2. my @output = `ssh $hostname $cmd 2>&1`;
您可以在数组上下文中调用backticks,但稍后必须将整个数组打印到MYOUTPUTFILE
其他意见:
这些都不是解决方案的一部分。解决方案本身应该足以修复您的bug。但是,它们可以降低bug的风险,并增加您的Perl知识
打开(我的$handle,'>',$filename)或死“无法打开文件,$!”代码>
没有密码?有密码或没有密码(=无密码)?Re:“但根据文档,如果命令运行,$输出将始终被定义”。不,当没有错误时,文档只是说它“返回一个行列表”。它并没有说至少会有一行,所以原始代码的
$output
可能是未定义的。当然,在标量上下文中这是一个不同的故事。
2. my @output = `ssh $hostname $cmd 2>&1`;
use Net::OpenSSH;
my $ssh = Net::OpenSSH->new($host, user => $user, password => $password);
my $output = $ssh->capture($cmd);