Hay muchas formas de hacer lo que quieres. Lo más simple es usar una pipa:
tar zcvf - MyBackups | ssh user@server "cat > /path/to/backup/foo.tgz"
Aquí, la compresión está siendo manejada por tarqué llamadas gzip( zflag). También puede usar compress( Z) y bzip( j). Para 7zhacer esto:
tar cf - MyBackups | 7za a -si -mx=9 -ms=on MyBackups.tar.7z |
ssh user@server "cat > /path/to/backup/foo.7z"
La mejor manera, sin embargo, es probablemente rsync.
Rsync is a fast and extraordinarily versatile file copying tool. It can copy
locally, to/from another host over any remote shell, or to/from a remote rsync dae‐
mon. It offers a large number of options that control every aspect of its behavior
and permit very flexible specification of the set of files to be copied. It is
famous for its delta-transfer algorithm, which reduces the amount of data sent over
the network by sending only the differences between the source files and the exist‐
ing files in the destination. Rsync is widely used for backups and mirroring and
as an improved copy command for everyday use.
rsynctiene forma demasiadas opciones. Realmente vale la pena leerlos, pero a primera vista dan miedo. Sin embargo, los que le interesan en este contexto son:
-z, --compress compress file data during the transfer
--compress-level=NUM explicitly set compression level
-z, --compress
With this option, rsync compresses the file data as it is sent to the desti‐
nation machine, which reduces the amount of data being transmitted --
something that is useful over a slow connection.
Note that this option typically achieves better compression ratios than can
be achieved by using a compressing remote shell or a compressing transport
because it takes advantage of the implicit information in the matching data
blocks that are not explicitly sent over the connection.
Entonces, en su caso, querría algo como esto:
rsync -z MyBackups user@server:/path/to/backup/
Los archivos se comprimirían durante el tránsito y llegarían descomprimidos al destino.
Algunas opciones más:
scp en sí mismo puede comprimir los datos
-C Compression enable. Passes the -C flag to ssh(1) to
enable compression.
$ scp -C source user@server:/path/to/backup
Puede haber una manera de obtener rsyncy 7zajugar bien, pero no tiene sentido hacerlo. La ventaja rsynces que solo copiará los bits que han cambiado entre los archivos locales y remotos. Sin embargo, un pequeño cambio local puede dar como resultado un archivo comprimido muy diferente, por lo que no tiene sentido usarlo rsync. Simplemente complica las cosas sin beneficio. Simplemente use directo sshcomo se muestra arriba. Si realmente quieres hacer esto, puedes intentar dando una subshell como argumento para rsync. En mi sistema, no pude hacer que esto funcione 7zaporque no le permite escribir datos comprimidos en un terminal. Quizás su implementación es diferente. Pruebe algo como ( esto no funciona para mí ):
Una buena nota para agregar es que, a menos que esté transfiriendo a través de una red generalmente lenta, digamos Internet, es mejor evitar la compresión, ya que solo disminuye la velocidad de transferencia. En una LAN, -zes al menos el doble de lento. Para una mayor velocidad de la que rsyncing sobre ssh, configurar un demonio rsync rsync y el uso de -Wla bandera (archivos de copias conjunto (w / o algoritmo delta-xfer).
laebshade
2
¡Gracias! Voy a aceptar esta gran respuesta, pero por favor, agregue una línea de comando completa e independiente que use ambos rsyncy7za , con salida final al sistema de archivos remoto. Me gustó -zpero me gustaría desacoplar la etapa de compresión, así que ... ¿cómo lo usaría rsyncen ese caso, por favor?
Robottinosino
2
@Robottinosino ver respuesta actualizada. No tiene sentido usar rsynccon 7z. Se debe trabajar con rsync y una subshel como se muestra, pero no pude encontrar la manera de todos modos.
terdon
44
+1 para scp -C. No había suficiente espacio en el disco remoto para contener el archivo comprimido, por lo que no pude comprimir antes de la transferencia. Una pequeña opción de línea de comando hizo que mi problema desapareciera.
user37931
1
@knutole simplemente comprime el archivo primero, luego rsync. Haga una nueva pregunta si necesita más detalles.
terdon
13
Creo que este comando hará el truco
ssh user@host "cd /path/to/data/;tar zc directory_name" | tar zx
EDITAR: una versión anterior tenía dos opciones "f" incorrectas.
Ahora, antes que nada, debe ejecutar este comando desde el host de destino. Y detalles a explicar:
ssh user @ host abrirá la conexión a la máquina host, desde donde se transferirán los datos.
cd / path / to / data llevará al directorio donde se almacenan los datos requeridos
tar zc * iniciará la compresión y la pondrá en STDOUT
Ahora pipe (|) canalizará el STDOUT de la fuente al STDIN del destino donde se está ejecutando "tar zx" y descomprimirá continuamente el flujo de datos proveniente de la fuente.
Como puede ver, este comando comprime sobre la marcha y ahorra ancho de banda. También puede usar otras compresiones para obtener mejores resultados, pero recuerde que la compresión y la descompresión necesitan ciclos de CPU.
-z
es al menos el doble de lento. Para una mayor velocidad de la que rsyncing sobre ssh, configurar un demonio rsync rsync y el uso de-W
la bandera (archivos de copias conjunto (w / o algoritmo delta-xfer).rsync
y7za
, con salida final al sistema de archivos remoto. Me gustó-z
pero me gustaría desacoplar la etapa de compresión, así que ... ¿cómo lo usaríarsync
en ese caso, por favor?rsync
con7z
. Se debe trabajar con rsync y una subshel como se muestra, pero no pude encontrar la manera de todos modos.scp -C
. No había suficiente espacio en el disco remoto para contener el archivo comprimido, por lo que no pude comprimir antes de la transferencia. Una pequeña opción de línea de comando hizo que mi problema desapareciera.Creo que este comando hará el truco
EDITAR: una versión anterior tenía dos opciones "f" incorrectas.
Ahora, antes que nada, debe ejecutar este comando desde el host de destino. Y detalles a explicar:
Como puede ver, este comando comprime sobre la marcha y ahorra ancho de banda. También puede usar otras compresiones para obtener mejores resultados, pero recuerde que la compresión y la descompresión necesitan ciclos de CPU.
Referencia
fuente
Pequeña mejora para la respuesta de dkbhadeshiya : no tiene que hacerlo
cd dir
, simplemente especifique el directorio de trabajo en sutar
lugar:También puede cargar el directorio de la misma manera:
fuente