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 trecho de código não é meu e não entendo como -f -
funciona no comando tar, a página de manual é inútil.
Responder1
Com -f archive.tar
, tar -c
escreveria no arquivo e tar -x
extrairia dele. -f -
é uma sintaxe especial que significa "gravar em stdout" (se estiver criando) ou "ler de stdin" (se estiver extraindo).
Isto permite a utilização tar
em tubulações. O comando do cliente direciona tar
para ssh
. No lado remoto, o servidor SSH é executado ./ScriptServer.sh
e envia o fluxo de entrada para seu stdin. tar -f -
dentro do script lê este fluxo.
Você está certo, isso -f -
não está documentado man 1 tar
(pelo menos nos manuais que li). Sem -f
a ferramenta, você deve usar stdout ou stdin de qualquer maneira. Poucas outras ferramentas suportam -
um "nome de arquivo" especial para apontar explicitamente para stdout ou stdin; Suponho que o suporte de -f -
in tar
seja apenas uma conformidade com este semi-padrão.
Responder2
Não entendo como
-f -
funciona o comando tar, a página de manual é inútil.
Qual man
página você está olhando? Aquele da linha de comando do seu sistema man tar
ou algo mais?Verificando esta página de manual on-line paratar
-tambémcomo este—mostra o seguinte:
-f, --file=ARCHIVE
use archive file or device ARCHIVE
Então ele -f
leria a entrada de um arquivo específico… Mas o que vem -
depois do -f
? Com certeza não é um arquivo. Esse é basicamente um caractere especial informando ao comando - neste caso - para obter os dados stdin
(entrada padrão)... E isso stdin
vem do primeiro script canalizando a saída - através do |
canal via SSH para o script de recebimento no destino.
Responder3
Aqui está um exemplo sem criar script no lado do receptor. Para transferir arquivos por meio de fluxo descompactado do Unix local para remoto:
LocalDir="./"
LocalFile="myFile.txt"
RemoteIP="192.168.1.1"
RemoteDir="~/backups/"
cd "$LocalDir"
tar -cf - "$LocalFile" | ssh $RemoteIP "cd '$RemoteDir'; tar -xf -"
POSIX Tar não compacta arquivos, apenas concatena. Além disso, você pode adicionar compressão leve de tal maneira
tar -cf - "$LocalFile" | gzip -1 | \
ssh $RemoteIP "cd '$RemoteDir'; gzip -cd | tar -xf -"
Não recomendo adicionar compactação profunda devido ao maior tempo de transferência.
Se você quiser 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 vice-versa do Solaris para o RHEL.
Responder4
O primeiro comando "tar -cf -" criará o tar para a saída padrão (stdout) em vez de um arquivo normal.
Isso será enviado como stdin por meio de ssh e usado como tal pelo script do servidor.
Veja também :https://www.cyberciti.biz/faq/howto-use-tar-command-through-network-over-ssh-session/ehttps://www.linuxjournal.com/content/working-stdin-and-stdout