Visualizza l'avanzamento scp nella finestra zenity


0

Vorrei visualizzare graficamente l'avanzamento del trasferimento scp di diversi file da un server remoto alla macchina locale.

Ho pensato di usare Zenity per esempio. Navigando in rete ho trovato il comando pv che può essere usato per farlo.

Qualcosa del genere:

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

Ma questo non funziona.

L'uso di rsync potrebbe essere un'alternativa.

Qualche idea?

Grazie.

Risposte:


0

Il tuo problema sta nel fatto che zenity si aspetta numeri e commenti, uno per riga. Stai inviando di più con il flag "-b". Prova a rimuoverlo e riprova.

Zenity legge i dati dallo standard input riga per riga. Se una riga ha il prefisso #, il testo viene aggiornato con il testo su quella riga. Se una riga contiene solo un numero, la percentuale viene aggiornata con quel numero.

Vedi: documentazione Zenity

Utilizzando solo SCP

Ora, sembra che tu voglia avere una sorta di visione della progressione. Proverei la bandiera dettagliata di SCP che dovrebbe fare il trucco:

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

Non sono sicuro di ciò che stai cercando di realizzare lì, ma potresti voler includere sottocartelle nel tuo comando di copia e compressione per ridurre i tempi di trasferimento in questo modo:

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

Usando Rsync

Se fossi in te, userei rsync per quello, che fa copie incrementali e molte altre cose come mantenere permessi e tempi. Ecco alcuni comandi che uso sempre:

Copia incrementale senza rimuovere i file locali

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

Copia incrementale creando un mirror di entrambe le directory, eliminando i file non presenti sul server remoto

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

-1

Sfortunatamente, scp non mostra progressi se stdout non è un terminale.

Hai 2 opzioni:

L'opzione 1 modifica il codice scp per ignorare lo stdout che non è un terminale. Scarica fonti (da http://www.openssh.com/ )

Commenta il seguente codice in scp.c: main ()

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

Opzione 2 Usando un wrapper, prendi in giro scp per pensare che ci sia un terminale.

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

Compila il wrapper e usalo per scp

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

Soluzione originale e maggiori dettagli da: http://blog.clay.shep.me/2009/06/showing-scp-progress-using-zenity.html


Puoi includere le informazioni pertinenti dal link qui?
bertieb

La soluzione non è breve da spiegare. L'autore del post ha fatto un ottimo lavoro di spiegazione. Posso provare a spiegare, ma è meglio visitare il link.
Vamsi

Per quanto una risorsa sia, potrebbe cambiare / scomparire in qualsiasi momento, quindi una ragione in più per includere le informazioni qui e solo le risposte dei link sono scoraggiate in ogni caso.
bertieb

Capisco .. Grazie per le informazioni. Se avessi una risposta, probabilmente avrei contribuito in futuro. Per questa domanda, consiglieresti di copiare e incollare la soluzione? Come nuovo collaboratore, trovo scoraggianti i punteggi negativi per indicare una soluzione.
Vamsi

Non ti ho votato, quindi non posso dirti perché l'hanno fatto. Ma per rispondere alla tua domanda: copiare e incollare un intero articolo non è appropriato, ma sarebbe opportuno citare le parti e riassumere le altre parti.
bertieb
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.