SCP-Fortschritt im Zenity-Fenster anzeigen

988
Maxbester

Ich möchte den SCP-Übertragungsfortschritt mehrerer Dateien von einem Remote-Server auf den lokalen Computer grafisch anzeigen.

Ich dachte zum Beispiel an Zenity. Durchsuchen des Netzes Ich habe festgestellt, dass der Befehl pv dazu verwendet werden kann.

Sowas in der Art:

( scp user@remote:/home/folder/* . | pv -n -b -s $totalSize ) | zenity --progress --title="Transfer window" --percentage=0 --auto-close 

Das geht aber nicht.

Die Verwendung von rsync könnte eine Alternative sein.

Irgendeine Idee?

Vielen Dank.

0

2 Antworten auf die Frage

0
pycvalade

Ihr Problem liegt darin, dass Zenity Zahlen und Kommentare zeilenweise erwartet. Sie senden mehr mit der "-b" Flagge. Versuchen Sie es zu entfernen und versuchen Sie es erneut.

Zenity liest Daten zeilenweise aus der Standardeingabe. Wenn einer Zeile ein # vorangestellt ist, wird der Text mit dem Text in dieser Zeile aktualisiert. Wenn eine Zeile nur eine Nummer enthält, wird der Prozentsatz mit dieser Nummer aktualisiert.

Siehe: Zenity-Dokumentation

Nur mit SCP

Nun scheint es, als wollten Sie eine Art Fortschrittsansicht haben. Ich würde die verbose Flagge von scp versuchen, die den Trick tun sollte:

scp -v user@remote:/home/folder/* . 

Ich bin mir nicht sicher, was Sie dort erreichen möchten, aber Sie möchten vielleicht Unterordner in den Kopierbefehl und die Komprimierung einschließen, um die Übertragungszeiten wie folgt zu verkürzen:

scp -vrC user@remote:/home/folder/* . 

Rsync verwenden

Wenn ich Sie wäre, würde ich rsync dafür verwenden, wodurch inkrementelle Kopien erstellt werden und vieles mehr, beispielsweise Berechtigungen und Zeiten einzuhalten. Hier einige Befehle, die ich ständig benutze:

Inkrementelle Kopie, ohne lokale Dateien zu entfernen

rsync -avz --progress user@remote:/home/folder/ ./ 

Inkrementelle Kopie Spiegeln beider Verzeichnisse und Löschen von Dateien, die nicht auf dem Remote-Server vorhanden sind

rsync -avz --delete --progress user@remote:/home/folder/ ./ 
-1
Vamsi

Leider zeigt scp keinen Fortschritt, wenn stdout kein Terminal ist.

Sie haben 2 Möglichkeiten:

Option 1: Ändern Sie den SCP-Code, um zu ignorieren, dass der Standardwert kein Terminal ist. Quellen herunterladen (von http://www.openssh.com/ )

Kommentieren Sie den folgenden Code in scp.c: main ()

if (!isatty(STDOUT_FILENO)) showprogress = 0; 

Option 2 Mit einem Wrapper täuschen Sie scp vor, dass ein Terminal vorhanden ist.

#include <unistd.h> #include <sys/types.h> #include <stdio.h>  main(int argc, char **argv) { int fd; pid_t pid; char c,c1,c2;  if (argc != 3) { printf("usage: [[user@]host1:]file1 [[user@]host2:]file2\n\nThis is a program that wraps scp and prints out the numeric progress on separate lines.\n"); fflush(stdout); _exit(1); }  pid = forkpty (&fd, NULL, NULL, NULL); if (pid == 0) { execlp ("scp", "scp", argv[1], argv[2], (char *) NULL); _exit (1); } else if (pid == -1) { return 1; } else { FILE *F;  F = fdopen (fd, "r");  //reading character by character isn't horribly efficient... while((c = fgetc(F)) != -1) { if (c == '%') { if (c1 == ' ') printf("%c\n", c2); //one digit progess else if (c1 == '0' && c2 == '0') printf("100\n"); //done else printf("%c%c\n", c1,c2); //two digit progress } fflush(stdout); c1 = c2; c2 = c;  }  fflush (F); wait (0); } return 0; }  

Kompilieren Sie den Wrapper und verwenden Sie ihn für scp

 $ ./scpwrap /home/ubuntu/somefile user@example.com:~ | zenity --progress 

Originallösung und weitere Details aus: http://blog.clay.shep.me/2009/06/showing-scp-progress-using-zenity.html

Können Sie die relevanten Informationen aus dem Link hier einfügen? bertieb vor 7 Jahren 0
Die Lösung ist nicht kurz zu erklären. Der Autor des Beitrags hat eine großartige Arbeit geleistet. Ich kann versuchen zu erklären, aber es ist besser, den Link zu besuchen. Vamsi vor 7 Jahren 0
So gut eine Ressource auch ist, sie kann sich jederzeit ändern / verschwinden. Umso mehr Grund ist der Grund, die Informationen hier- und [link-only-Antworten werden nicht erwünscht] einzureichen (http://meta.stackexchange.com/questions/8231) (sind-Antworten-das-nur-enthalten-Links-anderswo-wirklich-gute-Antworten) auf jeden Fall. bertieb vor 7 Jahren 0
Ich verstehe .. Danke für die Info. Wenn ich eine beitragende Antwort habe, würde ich wahrscheinlich in der Zukunft beitragen. Würden Sie für diese Frage das Kopieren der Lösung empfehlen? Als neuer Mitwirkender finde ich negative Punkte, wenn man auf eine Lösung hinweist, die entmutigend ist. Vamsi vor 7 Jahren 0
Ich habe dich nicht abgewählt, also kann ich dir nicht sagen, warum sie das getan haben. Aber um Ihre Frage zu beantworten: Das Kopieren und Einfügen eines ganzen Artikels ist nicht angebracht, aber das Zitieren von Teilen und das Zusammenfassen anderer Teile wäre. bertieb vor 7 Jahren 0