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
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.
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
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.