我需要帮助排查Net::SFTP::Foreign
。我有一个在RHEL 5.7 / Perl 5.8.8上运行的脚本,但它似乎不适用于RHEL 6.4 / Perl 5.10.1。它似乎只是在my $sftp = Net::SFTP::Foreign->new...
行之后废弃了。不再有打印输出,没有文件,也没有错误消息。
所以我彻底难倒了。我不确定如何排除故障以及如何继续。
完整性检查
更新
use warnings
。没有任何区别(没有警告或任何东西)。 (我之前使用过-w
选项。我在某个时候再次取消它。Foreign->new
来电的其他选项。一旦脚本命中该行,它就会立即退出,这让我觉得该模块有问题或更深层次......但我似乎无法收到任何错误消息。我也尝试比较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
模块丢失了。我们安装了那个,你有它,它有效!