Thread Dateigröße mit SFTP ermitteln? (6 answers)
Opened by Ralf at 2012-11-04 11:29

topeg
 2012-11-04 23:28
#163045 #163045
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
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)

View full thread Dateigröße mit SFTP ermitteln?