enviar carpeta a través de ssh, luego comprimirla y enviarla de regreso

enviar carpeta a través de ssh, luego comprimirla y enviarla de regreso

Necesito enviar una carpeta con archivos eml de "A" a "B", luego comprimirlos con 7z y enviarlos de regreso a "A", lo que tengo es

ssh user@server "tar -cf - .folder" | 7z a -si compressed_folder.7z

pero crea tar.7z, por lo que necesito descomprimir tar antes de crear un archivo 7z. ¿Cómo lograrlo?

PD. No puedo comprimirlos en "A" debido a la poca RAM y CPU.

Respuesta1

Les prometo que es feo, pero lo probé y funciona en mi máquina Linux.

Supuestos: desea realizar una copia de seguridad de solo una carpeta (esto no se adaptará fácilmente a varias carpetas) y confía en no sobrescribir nada en el lado del cliente. La carpeta está en el directorio de inicio del servidor remoto. Probablemente quieras configurar la autenticación sin contraseña para ssh, o tendrás que escribir una contraseña dos veces.

Advertencias: puede haber peculiaridades específicas del sistema operativo en cómo se hace esto. Por ejemplo, si realiza crontab cosas, es posible que desee que sus rutas sean más específicas. Tal vez estés en un BSD, por lo que es posible que no lo tengas bashde forma predeterminada. Utilizo el comando de fecha para crear un nombre de archivo único para cargarlo nuevamente en el servidor, pero eso puede funcionar de manera diferente en diferentes hosts. Tampoco hay verificación de errores en esto, aunque es fácil de agregar en un script.

Creé algunas variables para simplificar las cosas. La variable $cssh me evita tener que repetir la cadena de conexión ssh. Tenga en cuenta que cambié el nombre de su carpeta a test/, pero como solo se usa una vez, no lo puse en una variable.

Lo estoy envolviendo todo en basho sh(generalmente son bastante intercambiables en Linux) para facilitar la supresión de la salida, pero si no le importa suprimir la salida, puede eliminarlo y hacerlo un poco menos largo.

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

Si usarlo sshes un requisito estricto y no desea, scppuede usarlo ddpara copiar el archivo a través de 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

Comprimí el archivo antes de transmitirlo al host local porque eso puede ahorrar mucho ancho de banda con archivos de texto sin formato. Puede eliminar la tubería a gzip -9c, pero si lo hace, deberá eliminar la descompresión correspondiente en el host local.gzip -d

O poner el primer comando en un script para que quede más 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

información relacionada