sftp Datenübertragungsrate in stdout umleiten

dylan

dylan

Aktives Mitglied
Thread Starter
Dabei seit
18.12.2002
Beiträge
6.440
Reaktionspunkte
3
Hallo,

ich habe ein (hoffentlich) triviales "Problem" und stehe wahrscheinlich nur auf dem Schlauch:

Kann ich es irgendwie erreichen, dass in meinem Log auch die Datenübertragunsrate aufgeführt wird und nicht nur die "Transferred... xx Seconds"?

Bei der Eingabe von

Code:
sftp -v user@ftp-server:datei ~/Desktop/

...wird mir am Ende u. a. diese Zeile ausgegeben:

Fetching /Pfad/Datei to /Pfad/Datei
/Pfad/Datei 100% 100MB 11.1MB/s 00:09

So weit, so gut.


Jetzt möchte ich das allerdings in ein Script packen und mir die Ausgaben zusenden lassen. Daher leite ich die Ausgaben um in z.B. 1>&2 2>~/Desktop/sftplog

Jetzt allerdings wird mir dadurch (natürlich) die Zeile Fetching am Bildschirm ausgegeben, nicht aber mehr die Übertragungsrate/Zeit/etc. Und leider eben auch nicht im Log.

Selbst, wenn ich es auf 2>&1 1>~/Desktop/sftplog umleite, erhalte ich zwar noch die Fetching-Zeile (und natürlich nur diese), aber eben nicht mehr die Übertragungsrate/Zeit/etc

Hier mal mein Script:

Code:
#!/bin/bash
mkdir ~/Desktop/sftp_files/
mkdir ~/Desktop/sftp_logs/
sftp -v sftptest@ftp-server:testdatei.tif ~/Desktop/sftp_files/ 1>&2 2>~/Desktop/sftp_logs/log_test
cat ~/Desktop/sftp_logs/log_test | mail -s "S-FTP Test - testdatei" adresse@mail.de
traceroute ftp-server >~/Desktop/sftp_logs/traceroute
cat ~/Desktop/sftp_logs/traceroute | mail -s "S-FTP Test - Traceroute" adresse@mail.de

Das Ergebnis ist zwar auch auslesbar, ich hätte aber lieber diese Zeile auch in meinem Log:

/Pfad/Datei 100% 100MB 11.1MB/s 00:09

Vielleicht geht das, vielleicht ist das super-einfach, aber ich komme gerade nicht drauf.

Schönen Gruß,
Dylan
 
Zuletzt bearbeitet:
Hallo Dylan,

falls auf dem Server auch rsync installiert ist (was ja standardmäßig auch über ssh läuft), wirst Du damit vielleicht glücklicher.
Da bekommst Du als Ausgabe eine schöne Dateiliste sowie die Transferdaten in der Form
Code:
receiving file list ... done 
file1
file2

sent 36 bytes  received 3007490 bytes  1203010.40 bytes/sec
total size is 3007002  speedup is 1.00
Diese kannst Du dann auch ganz normal mit einer Ausgabeumleitung in Dein Logfile schreiben und ggf. noch filtern.

Oder mit --stats
Code:
Number of files: 1
Number of files transferred: 1
Total file size: 3007002 bytes
Total transferred file size: 3007002 bytes
Literal data: 3007002 bytes
Matched data: 0 bytes
File list size: 64
Total bytes sent: 36
Total bytes received: 3007490

sent 36 bytes  received 3007490 bytes  859293.14 bytes/sec
total size is 3007002  speedup is 1.00


Ob´s mit scp so funktioniert, wie Du es gerne hättest bezweifel ich. Ich werd aber mal ein wenig herumprobieren und recherchieren.

Gruß
maceis
 
Hi maceis, wie gewohnt klasse Antwort. In der Tat zwar nicht ganz das, was ich brauche, aber ein workaround, auf den ich gerade einfach nicht gekommen bin. Werde ich mir mal ansehen und schauen, ob mir das so reicht bzw. ob ich mit den Optionen von rsync eher hinkomme.

Vielen Dank,
Dylan
 
Offensichtlich ist es so, dass sftp (und auch scp) die von Dir gewünschte Statuszeile nur dann nach stdout schreibt, wenn sie mit einem Terminal verbunden sind.

Das hängt vermutlich auch damit zusammen, dass die Zeile im Verlauf eines Datentransfers immer wieder geschrieben wird. Dabei wird am Anfang jeweils ein Steuerzeichen ausgegeben (genauer gesagt ein CR (Ascii 13)), was bewirkt, dass die Anzeige immer in der selben Zeile erscheint. Erst am Ende (also bei 100%) wird mit einem Newline abgeschlossen, was bewirkt, dass der Prompt in einer neuen Zeile erscheint.
Die Autoren sind wohl der Meinung, dass die Transfer-Informationen in einem Skript nicht so interessant sind.

Um das nachzuvollziehen, kann man einen Trick anwenden. Man missbraucht das screen Kommando.
Ich verwende hier scp, weil da nicht so viele debug Meldungen kommen wie bei sftp -v:
Code:
zsh% screen -L scp www.irgendeine-hochschule.de:remotefile localfile
zsh% cat screenlog.0                        1123 
remotefile                                          100% 2937KB 978.8KB/s   00:03
aber:
Code:
zsh% more screenlog.0                       1124
^Mfile                                            0%    0     0.0KB/s   --:-- ET
A^Mfile                                           22%  656KB 656.0KB/s   00:03 E
TA^Mfile                                           55% 1616KB 686.4KB/s   00:01 
ETA^Mfile                                          100% 2937KB 978.8KB/s   00:03
    
screenlog.0 (END)
Mit dem more Kommando sieht man sehr gut die Steuersequenzen (in meinem Terminal durch ^M dargestellt). (Nebenbei bemerkt verwende ich aus Bequemlichkeit publickey authentication und eine config Datei für ssh)

Nachdem das mit dem screen Kommando auch in einem Skript funktioniert, wäre das auch eine mögliche Lösung für Deine ursprüngliche Frage. Musst den Inhalt des screenlogs halt noch filtern, dann klappt das schon.

Edit:
Mal zwei Beispiele ;):
Code:
zsh% cat screenlog.0| tr '\r' '\n'          1125 

remotefile                                            0%    0     0.0KB/s   --:-- ETA
remotefile                                           22%  652KB 652.0KB/s   00:03 ETA
remotefile                                           36% 1068KB 628.4KB/s   00:02 ETA
remotefile                                           86% 2540KB 712.8KB/s   00:00 ETA
remotefile                                          100% 2937KB 978.8KB/s   00:03
oder gleich:
Code:
zsh% cat screenlog.0| perl -p -e 's/\r(.*)$/$1/'
remotefile                                          100% 2937KB 978.8KB/s   00:03
 
Zuletzt bearbeitet:
Hallo,

liefert das Kommando trace (trace on) vor dem Übertragen der Dateien nicht die gewünschte Information?

Viele Grüße
 
Hast Du mal nachgesehen, ob es das Kommando unter mac OS X überhaupt gibt? :D
 
Hi maceis, sorry für die späte Antwort, hatte hier gar nicht mehr reingeschaut und meine Benachrichtigung wohl abgestellt.

Zum Thema:

- Ja, weder rsync noch sftp lieferten eigentlich das, was ich sehen wollte (Gründe hast du ja genannt).

- Ich persönlich verwende auch einen publickey, aber das nützt mir nix, weil ich diesen Test für externe Dienstleister vorbereite, deren keys ich gar nicht haben will. Daher muss ich das ein wenig komplizierter mit PW machen... und es in ein Script packen.

- screen und more - das ist es. Prima. Damit kann ich arbeiten und es schön in mein Script packen. Sehr gut.

- ich bleibe bei sftp im verbose mode, weil ich auch noch weitere Optionen anzeigen bzw. vergleichen möchte.

Vielen herzlichen Dank für deine großartige Hilfe,
Dylan
 
Zuletzt bearbeitet:
Zurück
Oben Unten