Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux perl远程执行错误_Linux_Perl_Ssh_Perl Module - Fatal编程技术网

Linux perl远程执行错误

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)

在下面的代码中,我尝试使用Perl脚本将git存储库克隆到另一台机器上

如果我打印
$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知识

  • 尝试使用open的三参数版本,而不是带有全局参数的两参数版本,并在无法打开文件时捕获错误:

    打开(我的$handle,'>',$filename)或死“无法打开文件,$!”

  • 许多人决定使用反勾号代替反勾号,因为当出现问题时,您可以获得更多信息,并且可以避免使用外壳

  • 另一个选项是,它甚至可以让您轻松捕获STDOUT、STDERR和exitcode。不过,使用起来有点困难

  • 使用:


    没有密码?有密码或没有密码(=无密码)?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);