Preciso enviar uma pasta com arquivos eml de "A" para "B", depois compactá-los com 7z e enviar de volta para "A" o que tenho é
ssh user@server "tar -cf - .folder" | 7z a -si compressed_folder.7z
mas faz tar.7z, então preciso descompactar o tar antes de criar o arquivo 7z. Como conseguir isso?
obs. Não consigo compactá-los em "A" por causa da pouca memória RAM e CPU
Responder1
Eu prometo que é feio, mas testei e funciona na minha máquina Linux.
Suposições: você deseja fazer backup de apenas uma pasta (isso não será facilmente adaptado a várias pastas) e confia que não está sobrescrevendo nada no lado do cliente. A pasta está no diretório inicial do servidor remoto. Você provavelmente deseja configurar a autenticação sem senha para ssh, caso contrário terá que digitar uma senha duas vezes.
Avisos: pode haver peculiaridades específicas do sistema operacional na forma como isso é feito. Por exemplo, se você crontab coisas, você pode querer tornar seus caminhos mais específicos. Talvez você esteja em um BSD, então talvez não tenha bash
por padrão. Eu uso o comando date para criar um nome de arquivo exclusivo para fazer upload de volta ao servidor, mas isso pode funcionar de maneira diferente em hosts diferentes. Também não há verificação de erros nisso, embora seja fácil adicionar um script.
Criei algumas variáveis para simplificar as coisas. A variável $cssh evita que eu tenha que repetir a string de conexão ssh. Observe que mudei o nome da sua pasta para test/, mas como ela só é usada uma vez, não a coloquei em uma variável.
Estou agrupando tudo bash
ou sh
(geralmente eles são bastante intercambiáveis no Linux) para facilitar a supressão da saída, mas se você não se importa em suprimir a saída, pode removê-la e torná-la um pouco menos longa.
bash -c 'file=bu$(date +\%Y-\%m-\%d-\%Hh\%Mm\%Ss_\%A).7z; cssh="user@host"; folder=`ssh $cssh "tar -cf - test/ | gzip -9c" | gzip -d | tar -xvf - | head -n 1`; 7z a $file $folder && scp $file $cssh:~ && rm $file && rm -r $folder' > /dev/null 2>&1
Se o uso ssh
for um requisito difícil e você não quiser, scp
você pode usar dd
para copiar o arquivo pelo ssh:
sh -c 'file=bu$(date +\%Y-\%m-\%d-\%Hh\%Mm\%Ss_\%A).7z; cssh="user@host"; folder=`ssh $cssh "tar -cf - test/ | gzip -9c" | gzip -d | tar -xvf - | head -n 1`; 7z a $file $folder && dd if=$file | ssh $cssh "dd of=$file" && rm $file && rm -r $folder' > /dev/null 2>&1
Compactei o arquivo antes de transmiti-lo para o host local porque isso pode economizar muita largura de banda com arquivos de texto simples. Você pode remover o pipe para gzip -9c
, mas se precisar remover a descompactação correspondente no host localgzip -d
Ou coloque o primeiro comando em um script para torná-lo mais claro:
#!/bin/sh
# make a unique file name to temporarily use for storing 7z'd folder
# will look something like bu2019-09-29-00h18m49s_Sunday.7z
file=bu$(date +\%Y-\%m-\%d-\%Hh\%Mm\%Ss_\%A).7z;
# SSH connection strong
cssh="user@host";
# downloads the remote folder and gets the name of the folder in one variable
folder=`ssh $cssh "tar -cf - test/ | gzip -9c" | gzip -d | tar -xvf - | head -n 1`;
# compress, upload, remove folder, remove file
7z a $file $folder && scp $file $cssh:~ && rm $file && rm -r $folder