Como fazer um arquivo tar local de um diretório remoto

5

Este link descreve como copiar arquivos tarredos para minimizar a quantidade de dados enviados pela rede. Eu estou tentando fazer algo um pouco diferente.

Eu tenho vários arquivos remotos em diferentes níveis de subdiretórios:

remote:/directory/subdir1/file1.ext
remote:/directory/subdir1/subsubdir11/file11.ext
remote:/directory/subdir2/subsubdir21/file21.ext

E eu tenho um arquivo que lista todos eles:

remote:/directory/allfiles.txt

Para copiá-los com mais eficiência, no site remoto eu poderia fazer

tar zcvf allfiles.tgz 'cat /directory/allfiles.txt'

mas não há espaço suficiente para isso.

Eu tenho espaço de armazenamento suficiente no meu disco local. Existe uma maneira de tar de um fluxo de entrada de um servidor remoto (usando scp ou ssh para a transferência)?

Algo como /localdir$ tar zc - | ssh remote cat /directory/allfiles.txt 'Eu diria - mas isso listaria apenas os arquivos remotos no host local.

    
por alle_meije 03.07.2015 / 16:34

3 respostas

5

Você entendeu quase certo, apenas execute o tar no host remoto em vez de localmente. O comando deve ser parecido com o seguinte:

ssh remote_host tar cvfz - -T /directory/allfiles.txt > remote_files.tar.gz
    
por 03.07.2015 / 17:33
1

Se você tem espaço suficiente em seu disco local e seu objetivo é minimizar a quantidade de dados enviados pela rede talvez seja suficiente ativar a compactação com scp ou rsync :

scp -avrC remotehost:/path/to/files/file1 /files/file2 ...  local/destination/path

É claro que você pode fazer um pequeno script para fazer um loop sobre cada arquivo e fazer uma transferência compactada scp, mesmo sem o uso de tar. Tudo é mais aconchegante com rsync

rsync -avz --files-from=FILE remotehost:/path/to/files  local/destination/path

Você pode se conectar via ssh ao host remoto e escrever lá

tar cvzf - -T list_of_filenames | ssh Local_Hostname tar xzf -

Referências:

  • de man scp :

    -C      Compression enable.  Passes the -C flag to ssh(1) to enable compression.
    
  • de man rsync

    --files-from=FILE       read list of source-file names from FILE
    -z, --compress          compress file data during the transfer
    --compress-level=NUM    explicitly set compression level
    
por 03.07.2015 / 18:23
0

Se tomarmos o seu comando de início:

tar zcvf allfiles.tgz 'cat /directory/allfiles.txt'

então tudo o que precisamos fazer é garantir que o arquivo seja enviado remotamente. Então, vamos deixar o tar fora do padrão, canalizar isso embora o netcat sand o salve como um arquivo local.

Como alternativa, algo assim:

local: nc -l 1234 | gunzip | tar zcvf allfiles.tgz
remoto: cat /directory/allfiles.txt | gzip | nc localIP 1234

Explicação:

Local, etapa 1: entrada do netcat. -l para ouvir em alguma porta. Envie a saída para onde você quiser.
Remoto: passo 1: você já está saindo da lista de arquivos. gzipped para dados mínimos de rede. Envie os resultados para o local.
local: Passo 2: Uhm, já estamos recebendo arquivos gzipados. Vamos descompactá-los antes de alimentá-los ao alcatrão.

    
por 03.07.2015 / 18:34

Tags