Perl SFTP没有任何反应......没有错误?

时间:2014-02-27 20:13:50

标签: linux perl sftp

我需要帮助排查Net::SFTP::Foreign。我有一个在RHEL 5.7 / Perl 5.8.8上运行的脚本,但它似乎不适用于RHEL 6.4 / Perl 5.10.1。它似乎只是在my $sftp = Net::SFTP::Foreign->new...行之后废弃了。不再有打印输出,没有文件,也没有错误消息。

所以我彻底难倒了。我不确定如何排除故障以及如何继续。

完整性检查

  1. 我绝对可以手动使用该帐户进行sftp。
  2. 我在两个系统上都使用完全相同的脚本。
  3. 更新

    1. 我已加入use warnings。没有任何区别(没有警告或任何东西)。 (我之前使用过-w选项。我在某个时候再次取消它。
    2. 我已经进入睡眠状态(参见更新后的代码)没有什么区别。
    3. 我已经删除了Foreign->new来电的其他选项。一旦脚本命中该行,它就会立即退出,这让我觉得该模块有问题或更深层次......但我似乎无法收到任何错误消息。
    4. 我也尝试比较strace输出,但无法用它做出正面或反面...如果需要,我可以发布它们。

      #!/usr/bin/perl
      
      use strict;
      use warnings;
      use Net::SFTP::Foreign;
      use File::Temp;
      
      my $endprogram = 0;
      my $config = '/my/path/to/config.properties';
      
      print "Load Config File ", `date +%Y%m%d%H%M%S`;
      
      my %properties;
      open my $CONFIG, "$config" or die $!;
      while(<$CONFIG>)
      {
          $properties{$1}=$2 while m/(\S+)=(\S+)/g;
      }
      close $CONFIG;
      
      # Obtain XML file through SFTP
      print "\nBegin FTP ", `date +%Y%m%d%H%M%S`;
      
      my $timestamp = `date +%Y%m%d%H%M%S`;
      chomp $timestamp;
      #$Net::SFTP::Foreign::debug = -1;
      #$Net::SFTP::Foreign::debug = ~(8|16|1024|2048);
      my $fileTo = "$properties{LocalDirPath}/".
                 "$properties{PartialLocalFileName}$timestamp.xml";
      
      my $ssherr = File::Temp->new or die "File::Temp->new failed";
      
      print "\nFile Temp new\n";
      
      open my $stderr_save, '>&STDERR' or die "unable to dump STDERR";
      open STDERR, '>&'.fileno($ssherr);
      
      my $sftp = Net::SFTP::Foreign->new($properties{RemoteHostName},
         user => "some_user", password => "some_pass", timeout => 10, more=> '-v', queue_size => 16);
      $sftp->die_on_error("unable to connect to remote host");
      
      #print "open error stream\n";
      open STDERR, '>&'.fileno($stderr_save);
      
      if ($sftp->error) {
        print "sftp error: ".$sftp->error."\n";
        seek($ssherr, 0, 0);
        while (<$ssherr>) {
            print "captured stderr: $_";
        }
        $endprogram = 1;
      }
      
      close $ssherr;
      
      if ($endprogram > 0) {
        print "ENDPROGRAM: $endprogram\n";
        exit($endprogram);
      }
      
      print "changing ftp directory\n";
      if (!$sftp->setcwd($properties{RemoteDirPath})) {
        print "File Transfer - unable to change directory: " . $sftp->error;
        exit(1); #SFTP failure
      }
      
      print "get file\n";
      if (!$sftp->get($properties{RemoteFileName}, "$fileTo")) {
        print "File Transfer - get failed: " . $sftp->error;
        exit(1); #SFTP failure
      }
      
      print "\nEND FTP ", `date +%Y%m%d%H%M%S`;
      print "$fileTo\n";
      

      解决方案

      一位同事和我一起解决了这个问题,我们把所有内容都删除了,并且有一个脚本只做了这个。

      #!/usr/bin/perl
      
      use strict;
      use warnings;
      use Net::SFTP::Foreign;
      use File::Temp;
      
      print "\nNet::SFTP::Foreign - new\n";
      my $sftp = Net::SFTP::Foreign->new();
      $sftp->die_on_error("unable to connect to remote host");
      

      真正的罪魁祸首终于出现了。它抱怨Time::HiRes模块丢失了。我们安装了那个,你有它,它有效!

0 个答案:

没有答案