我正在使用Net :: SSH2的scp_put方法将一个文件放在Unix服务器上的主目录中,从Windows框中。我正在使用Strawberry Perl 5.12(便携版)。我安装了libssh2 1.2.5二进制文件,然后从cpan安装了Net :: SSH2。
这是我的代码段:
sub uploadToHost{
my $file=@_[0];
my $host=@_[1];
my $user=@_[2];
my $pass=@_[3];
my $remotelocation=@_[4];
#makes a new SSH2 object
my $ssh=Net::SSH2->new() or die "couldn't make SSH object\n";
#prints proper error messages
$ssh->debug(1);
#nothing works unless I explicitly set blocking on
$ssh->blocking(1);
print "made SSH object\n";
#connect to host; this always works
$ssh->connect($host) or die "couldn't connect to host\n";
print "connected to host\n";
#authenticates with password
$ssh->auth_password($user, $pass) or die "couldn't authenticate $user\n";
print "authenticated $user\n";
#this is the tricky bit that hangs
$ssh->scp_put($file, $remotelocation") or die "couldn't put file in $remotelocation\n";
print "uploaded $file successfully\n";
$ssh->disconnect or die "couldn't disconnect\n";
} #ends sub
输出(为匿名编辑):
制作SSH对象\ n
连接到主机\ n
经过身份验证\ n
libssh2_scp_send_ex(ss-> session,path,mode,size,mtime,atime) - > 0x377e61c \ n
Net :: SSH2 :: Channel :: read(size = 1,ext = 0)\ n
然后永远挂起(在一次测试中> 40分钟)并且需要被杀死。
奇怪的是,实际上是将文件scp到远程服务器!它只在应该完成之后挂起。我无法在StackOverflow或其他地方的其他地方找到对这个奇怪问题的引用。
任何人都可以指出我正确的方向1)阻止它挂起,或2)实现(作为一种解决方法)一个计时器,几秒后杀死这一个命令,这是足够的时间scp文件?
谢谢大家!
答案 0 :(得分:0)
您可以尝试使用alarm()将您的流程投射到行为中,如果您将此示例保存为'alarm.pl',您可以看到它是如何工作的:
use strict;
use warnings;
use 5.10.0;
# pretend to be a slow process if run as 'alarm.pl s'
if (@ARGV && $ARGV[0] eq 's') {
sleep(30);
exit();
}
# Otherwise set an alarm, then run myself with 's'
eval {
local $SIG{ALRM} = sub {die "alarmed\n"};
alarm(5);
system("perl alarm.pl s");
};
if ($@) {
die $@ unless $@ eq "alarmed\n";
say "Timed out slow process";
}
else {
say "Slow process finished";
}
答案 1 :(得分:0)
将Net::SFTP::Foreign与Net :: SSH2后端Net::SFTP::Foreign::Backend::Net_SSH2:
一起使用use Net::SFTP::Foreign;
my $sftp = Net::SFTP::Foreign->new($host, user => $user, password => $password, backend => Net_SSH2);
$sftp->die_on_error("Unable to connect to remote host");
$sftp->put($file, $remotelocation);
$sftp->die_on_error("Unable to copy file");
如果这也不起作用,您可以尝试使用plink(来自PuTTY项目)而不是Net :: SSH2后端。
答案 2 :(得分:-1)
我不认为它是悬挂它只是真的很慢。比它应该慢10倍。文件看起来像是在它完成传输之前分配文件的原因。这并不是太意外,Perl每天都会找到让程序员失望和挫败的新方法。有时我觉得我花了更多的时间来解决Perl的特性,并学习了10种不同的方法来做同样的事情而不是做真正的工作。