¿Cómo se puede enviar un archivo .tar en ssh sin un archivo temporal? ¿Qué es la opción "-f -" en tar?

¿Cómo se puede enviar un archivo .tar en ssh sin un archivo temporal? ¿Qué es la opción "-f -" en tar?

¿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 -cescribiría en el archivo, tar -xextraerí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 taren tuberías. El comando del cliente canaliza tara ssh. En el lado remoto, el servidor SSH se ejecuta ./ScriptServer.shy 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 -fla 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 tares 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é manpágina estás mirando? ¿El de la línea de comando de su sistema a través de man taro 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 -fleerí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 stdinproviene 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

información relacionada