Jemand zu Hause?
Net::SFTP abgeraten (eine menge bugs, seit 7 jahren keine entwicklung mehr). versuch doch mal eine alternative, z.b.
Net::SSH2::SFTP
Wie frage ich & perlintro
brian's Leitfaden für jedes Perl-Problem
Net::SSH2::SFTP gehts so:
Net::SSH2 versucht und die Verbindung mit dem Server klappt auch mittlerweile und die Dateigröße kann ich mit deinem Code auslesen.Guest RalfMit dem Modul habe ich jetzt aber ein Problem mit dem Herunterladen einer Datei vom Server. Zuerst habe ich es mit scp_get versucht, aber da habe ich nur eine leere Datei erhalten. $remote existiert, mit der Variable konnte ich die Dateigröße auslesen:
$ssh2->scp_get($remote,$local);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/usr/bin/perl
use Net::SFTP;
use Net::SSH2;
$remote = "x"
$local_ssh2 = "ssh2";
$local_sftp = "sftp";
my $ssh2 = Net::SSH2->new();
$ssh2->connect($server) or die $!;
if ($ssh2->auth_password($username,$password)) {
my $sftp = $ssh2->sftp();
my %stat = $sftp->stat($remote);
$filesize_ftp = $stat{size};
print "Filesize von $remote ist $filesize_ftp\n\n"; # => das geht schnell
#$ssh2->scp_get($remote,$local_ssh2); # => der Teil geht nicht, erzeugte leere Datei
open (OUTPUT, "> $local_ssh2"); # => die langsame Alternative aus der Doku cpan
my $fh = $sftp->open($remote) or die;
print OUTPUT $_ while <$fh>;
}
$ssh2->disconnect();
# make our connection, Modul Net::SFTP
print "\n\n\nConnecting to $server mit $username und $password ... \n\n";
%args = ("user" => $username, "password" => $password);
my $sftp = Net::SFTP->new($server, %args);
$sftp->get($remote, $local_sftp);
print "Finished\n";
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
#!/usr/bin/perl use strict; use warnings; use Net::SSH2; use Data::Dumper; my $server_file='test.txt'; my $local_file='test.local.txt'; my $server='server'; my $user='topeg'; my $pass='passwort'; my $ssh2 = Net::SSH2->new(); $ssh2->connect($server) or die("Can't connect $server ($!)"); if ($ssh2->auth_keyboard($user,$pass)) { my @stat=ssh_stat($ssh2,$server_file); print Dumper(\@stat); print ssh_read($ssh2,$server_file,$local_file)."\n"; } $ssh2->disconnect(); #0 dev #1 ino #2 mode #3 nlink #4 uid #5 gid #6 rdev = 0 #7 size #8 atime #9 mtime #10 ctime #11 blksize #12 blocks sub ssh_stat { my $ssh2=shift; my $file=shift; my @data=(); return @data unless($file); $file=~s/"/\\"/gs; my $chan = $ssh2->channel(); if($chan->exec(qq(/usr/bin/stat -c '%d:%i:%f:%h:%g:%u:0:%s:%X:%Y:%Z:%B:%b' "$file"))) { my $buff=''; $chan->read ( $buff, 1024); chomp($buff); @data=split(/:/,$buff); } $chan->close(); return @data; } # komprimierte Übertragung # das geht schneller sub ssh_read { my $ssh2=shift; my $file_ssh=shift; my $file_local=shift; my $gzip=shift // '/bin/gzip'; return 0 unless($file_ssh); return 0 unless($file_local); $file_ssh=~s/"/\\"/gs; $file_local=~s/"/\\"/gs; my $chan = $ssh2->channel(); my $ok=0; if($chan->exec(qq($gzip -cq1 "$file_ssh"))) { if( open(my $fh, '|-', qq($gzip -dqc > "$file_local") )) { my $buff=''; while($chan->read ( $buff, 1024)) { print $fh $buff; } if(close($fh)) { $ok=1; } else { warn("Can't run local $gzip ($!)"); } } else { warn("Can't run local $gzip ($!)"); } } else { warn("Can't run remote $gzip ($!)"); } $chan->close(); return $ok; }