Thread Dateigröße mit SFTP ermitteln?
(6 answers)
Opened by Ralf at 2012-11-04 11:29
Du kannst das ganze auch selber schreiben. SFTP basiert auf einer normalen SSH Session. Du kannst darüber auch Kommandos senden.
Hier mal ein Beispiel wie du "stat" aufrufen und Dateien vom Server kopieren kannst. Ein Kopieren auf den Server ist äquivalent. Code (perl): (dl
)
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; } Wenn du kompliziertere Aktionen hast kannst du auch ein Script auf den Server kopieren und dort ausführen. Last edited: 2012-11-04 23:35:31 +0100 (CET) |