¿Cómo puedo realizar la compresión y descompresión de un archivo mediante ssh con el comando tar, sin crear un archivo temporal?
Tengo un ejemplo:
ScriptClient.sh
#!/bin/bash
tar -cf - myFile.txt | ssh $IP_SERVER ./ScriptServer.sh
ScriptServer.sh
#!/bin/bash
tar -x -C ~/backups/ -f -
Este fragmento de código no es mío y no entiendo cómo -f -
funciona en el comando tar, la página de manual es inútil.
Respuesta1
Con -f archive.tar
, tar -c
escribiría en el archivo, tar -x
extraería de él. -f -
es una sintaxis especial que significa "escribir en stdout" (si se crea) o "leer desde stdin" (si se extrae).
Esto permite su uso tar
en tuberías. El comando del cliente canaliza tar
a ssh
. En el lado remoto, el servidor SSH se ejecuta ./ScriptServer.sh
y envía la transmisión entrante a su entrada estándar. tar -f -
dentro del script se lee esta secuencia.
Tienes razón en que -f -
no está documentado man 1 tar
(al menos en los manuales que leí). Sin -f
la herramienta, debería usar stdout o stdin de todos modos. Pocas otras herramientas admiten -
un "nombre de archivo" especial para apuntar explícitamente a stdout o stdin; Supongo que el soporte de -f -
in tar
es simplemente un cumplimiento de este semiestándar.
Respuesta2
No entiendo cómo
-f -
funciona el comando tar, la página de manual es inútil.
¿Qué man
página estás mirando? ¿El de la línea de comando de su sistema a través de man tar
o algo más?Revisando esta página de manual en línea paratar
-tambiéncomo este—muestra lo siguiente:
-f, --file=ARCHIVE
use archive file or device ARCHIVE
Entonces -f
leería la entrada de un archivo específico... Pero, ¿qué es entonces -
después de -f
? Seguro que no es un archivo. Básicamente, se trata de un carácter especial que le dice al comando, en este caso, que obtenga los datos stdin
(entrada estándar)... Y eso stdin
proviene del primer script que canaliza la salida, a través de la |
tubería vía SSH, al script receptor en el destino.
Respuesta3
A continuación se muestra un ejemplo sin crear un script en el lado del receptor. Para transferir archivos mediante un flujo sin comprimir desde Unix local a 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 no comprime archivos, solo los concatena. También puedes agregar una ligera compresión de tal manera
tar -cf - "$LocalFile" | gzip -1 | \
ssh $RemoteIP "cd '$RemoteDir'; gzip -cd | tar -xf -"
No te recomiendo que agregues una compresión profunda debido al mayor tiempo de transferencia.
Si quieres una sola línea, aquí la tienes:
tar -cf - myFile.txt | gzip -1 | ssh 192.168.1.1 "cd backups; gzip -cd | tar -xf -"
Probado para transferir archivos de RHEL6 a Solaris11 y viceversa de Solaris a RHEL.
Respuesta4
El primer comando "tar -cf -" creará el tar en la salida estándar (stdout) en lugar de un archivo normal.
Esto se enviará como entrada estándar a través de ssh y el script del servidor lo utilizará como tal.
Ver también :https://www.cyberciti.biz/faq/howto-use-tar-command-through-network-over-ssh-session/yhttps://www.linuxjournal.com/content/working-stdin-and-stdout