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

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

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 -cescreveria no arquivo e tar -xextrairia 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 tarem tubulações. O comando do cliente direciona tarpara ssh. No lado remoto, o servidor SSH é executado ./ScriptServer.she 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 -fa 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 tarseja 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 manpágina você está olhando? Aquele da linha de comando do seu sistema man tarou 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 -fleria 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 stdinvem 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

informação relacionada