Exibir progresso do scp na janela zenity

0

Gostaria de exibir graficamente o progresso da transferência scp de vários arquivos de um servidor remoto para a máquina local.

Eu pensei em usar o Zenity por exemplo. Navegando na net eu encontrei o comando pv pode ser usado para fazer isso.

Algo assim:

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

Mas isso não funciona.

Usar o rsync pode ser uma alternativa.

Alguma ideia?

Obrigado.

    
por Maxbester 20.04.2016 / 14:29

2 respostas

0

Seu problema está no fato de que zenity espera números e comentários, um por linha. Você está enviando mais com o sinalizador "-b". Tente removê-lo e tente novamente.

Zenity reads data from standard input line by line. If a line is prefixed with #, the text is updated with the text on that line. If a line contains only a number, the percentage is updated with that number.

Veja: Documentação do Zenity

Usando apenas o SCP

Agora, parece que você quer ter algum tipo de visão de progressão. Eu tentaria o sinalizador verboso de scp que deveria fazer o truque:

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

Não tenho certeza do que você está tentando realizar, mas você pode querer incluir subpastas no comando de cópia e compactação para reduzir os tempos de transferência da seguinte forma:

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

Usando o Rsync

Se eu fosse você, usaria rsync para isso, o que faz cópias incrementais e muito mais coisas, como manter permissões e horários. Aqui estão alguns comandos que eu uso o tempo todo:

Cópia incremental sem remover arquivos locais

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

Cópia incremental fazendo um espelho de ambos os diretórios, excluindo arquivos não presentes no servidor remoto

rsync -avz --delete --progress user@remote:/home/folder/ ./
    
por 07.03.2017 / 23:41
-1

Infelizmente, o scp não exibe o progresso se o stdout não for um terminal.

Você tem duas opções:

Opção 1 modifique o código scp para ignorar o stdout não sendo um terminal. Fontes de download (de link )

Comente o seguinte código em scp.c: main ()

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

Opção 2 Usando um wrapper, engane scp para pensar que existe um terminal.

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

Compile o wrapper e use-o para scp

 $ ./scpwrap /home/ubuntu/somefile [email protected]:~ | zenity --progress

Solução original & mais detalhes de: link

    
por 06.03.2017 / 23:27