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; }