Como se pode enviar um arquivo .tar em ssh com um arquivo temporário? Qual é a opção “-f -” no tar?

2

Como posso fazer a compactação e descompactação de um arquivo via ssh com o comando tar, sem criar um arquivo temporário:

Eu tenho um exemplo:

ScriptClient.sh

#!/bin/bash
tar -cf - myFile.txt | ssh $IP_SERVER ./ScriptServer.sh 

ScriptServer.sh

#!/bin/bash
tar -x -C ~/backups/ -f -

Esse snippet de código não é meu, e eu não entendo como o -f - funciona no comando tar, a página man é inútil.

    
por Marco 08.06.2018 / 16:16

4 respostas

1

Com -f archive.tar , tar -c escreveria no arquivo, tar -x extrairia dele. -f - é uma sintaxe especial que significa "escrever para stdout" (se criar) ou "ler de stdin" (se extrair).

Isso permite usar tar em pipes. O comando do cliente canaliza tar para ssh . No lado remoto, o servidor SSH executa ./ScriptServer.sh e envia o fluxo de entrada para seu stdin. tar -f - dentro do script lê este fluxo.

Você está certo de que -f - não está documentado em man 1 tar (pelo menos nos manuais que leio). Sem -f , a ferramenta deve usar stdout ou stdin de qualquer maneira. Algumas outras ferramentas suportam - como um "nome de arquivo" especial para apontar explicitamente para stdout ou stdin; Suponho que o suporte de -f - em tar seja apenas uma conformidade com este semi-padrão.

    
por 08.06.2018 / 17:09
1

I don’t understand how the -f - works in the tar command, the man page is useless.

Qual página man você está vendo? O da linha de comando do seu sistema via man tar ou outra coisa? Verificando esta página man online para tar —como bem como este - mostra o seguinte:

-f, --file=ARCHIVE
use archive file or device ARCHIVE

Assim, o -f iria ler a entrada de um arquivo específico ... Mas qual é então o - após o -f ? Com certeza não é um arquivo. Esse é basicamente um caractere especial que indica o comando - nesse caso - para obter os dados de stdin (entrada padrão) ... E que stdin vem do primeiro script que canaliza a saída - via o | pipe via SSH para o script de recebimento no destino.

    
por 08.06.2018 / 17:33
0

Aqui está um exemplo sem criar script no lado do receptor. Para transferir arquivos via fluxo descompactado do local para o unix remoto:

LocalDir="./"
LocalFile="myFile.txt"
RemoteIP="192.168.1.1"
RemoteDir="~/backups/"

cd "$LocalDir"
tar -cf - "$LocalFile" | ssh $RemoteIP "cd '$RemoteDir'; tar -xf -"

O POSIX Tar não compacta arquivos, apenas concatena. Além disso, você pode adicionar compactação leve dessa maneira

tar -cf - "$LocalFile" | gzip -1 | \
   ssh $RemoteIP "cd '$RemoteDir'; gzip -cd | tar -xf -"

Eu não recomendo adicionar uma compactação profunda devido ao maior tempo de transferência.

Se você quer uma linha, aqui está:

tar -cf - myFile.txt | gzip -1 | ssh 192.168.1.1 "cd backups; gzip -cd | tar -xf -"

Testado para transferir arquivos do RHEL6 para o Solaris11 e para trás do Solaris para o RHEL.

    
por 09.06.2018 / 11:37
-1

O primeiro comando "tar -cf -" criará o tar para a saída padrão (stdout) ao invés de um arquivo regular.

Isso será enviado como stdin a ssh e usado como tal pelo script do servidor.

Veja também: link e < href="https://www.linuxjournal.com/content/working-stdin-and-stdout"> link

    
por 08.06.2018 / 17:09

Tags