Perl Net :: SSH2 scp_put将文件放入然后挂起

时间:2011-05-12 21:10:38

标签: windows perl ssh scp

我正在使用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文件?

谢谢大家!

3 个答案:

答案 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种不同的方法来做同样的事情而不是做真正的工作。