Armazenar saída de comando no recurso SFTP

1

Eu só queria criar uma tarball e armazená-la apenas em um recurso SFTP. Como sou paranoico com corrupção de dados, geralmente guardo os sha256sums das minhas bolas de alcatrão com eles, se é algo em que quero confiar, e os calculo ao gerar os arquivos e depois de terem sido escritos lendo-os a mídia de armazenamento na qual eles estão armazenados.

Assumi que isso é bem direto, então digitei este comando em:

tar --exclude='./somefolder' -zc . | tee "sftp://mydomain.ending/storage/location/on/server/sth.tar" | sha256sum

Eu também tentei o que o Nautilus usa para seus terminais remotos:

tar --exclude='./somefolder' -zc . | tee ":/run/user/1000/gvfs/sftp:host=mydomain.ending/storage/location/on/server/sth.tar" | sha256sum

No entanto, os resultados foram:

tee: 'sftp://mydomain.ending/storage/location/on/server/sth.tar': No such file or directory

e

tee: ':/run/user/1000/gvfs/sftp:host=mydomain.ending/storage/location/on/server/sth.tar': No such file or directory

respectivamente.

Como faço para armazenar a bola alcalina lá sem armazená-la localmente primeiro? De preferência, sem montar primeiro o recurso remoto em alguma pasta, para que possa ser usado com facilidade.

Eu uso o Ubuntu 16.04 (com o Linux 4.4.0).

    
por UTF-8 30.04.2017 / 21:16

2 respostas

1

O Nautilus usa gvfs para montar locais de armazenamento remotos, como o servidor SFTP em sua pergunta. Isso permite tratar o servidor remoto como se fosse parte do seu sistema de arquivos local. O caminho para o qual é montado geralmente é

/run/user/<your uid>/gvfs/<server specification>/<path>

Tenho quase certeza de que o prefixo é sempre

/run/user/<your uid>

para que você possa encontrar este ponto de montagem por ls ou Tab -ing por esse diretório.

Depois de encontrar este ponto de montagem, você pode usar tee como faria normalmente (com quebras de linha para clareza):

tar --exclude='./somefolder' -zc .  \
| tee "/run/user/1000/gvfs/sftp:host=mydomain.ending/storage/location/on/server/sth.tar"  \
| sha256sum

Como alternativa, você pode evitar uma montagem GVFS e ainda evitar a substituição de processo não portátil usando SSH em vez de SFTP:

tar --exclude='./somefolder' -zc .  \
| ssh mydomain.ending 'tee "/storage/location/on/server/sth.tar"' 2>/dev/null  \
| sha256sum

Infelizmente, sftp o programa não permite enviar arquivos para um host remoto através de uma única linha de comando, apenas recuperá-los.

Como aponta @rudimeier, o método ssh acima carrega e faz o download do arquivo para evitar o armazenamento local. Se você preferir não fazer o download novamente, talvez seja melhor fazer o sha256sum remotamente:

tar --exclude='./somefolder' -zc .  \
| ssh mydomain.ending 'tee "/storage/location/on/server/sth.tar" | sha256sum' 2>/dev/null
    
por 30.04.2017 / 21:56
2

Sem montagens gvfs ou sshfs sofisticadas, você precisa usar um cliente sftp. Eu escolho lftp > = 4.7 porque funciona com pipes FIFO ( scp e sftp não).

Isso funciona com bash no Linux:

tar --exclude='./somefolder' -zc . \
 | tee >(lftp -c 'connect sftp://user:pass@server/path/ ;put /dev/stdin -o sth.tar.gz;') \
 | sha256sum

Como alternativa, use ssh client (colchetes externos necessários para autenticação de senha interativa):

(tar --exclude='./somefolder' -zc . \
 | tee >(ssh user@server "cat > /path/sth.tar.gz") \
 | sha256sum)

Observe que o argumento tee's parece também um pouco exótico, mas isso não é possível com bash magic para evitar comandos adicionais de mkfifo , explicados em man bash :

Process Substitution

Process substitution is supported on systems that support named pipes (FIFOs) or the /dev/fd method of naming open files. It takes the form of <(list) or >(list). The process list is run with its input or output connected to a FIFO or some file in /dev/fd. The name of this file is passed as an argument to the current command as the result of the expansion. If the >(list) form is used, writing to the file will provide input for list. If the <(list) form is used, the file passed as an argument should be read to obtain the output of list.

    
por 30.04.2017 / 21:41

Tags