2

Как сделать сжатие и распаковку архива с помощью команды ssh с помощью команды tar, не создавая временный файл:

У меня есть пример:

ScriptClient.sh

#!/bin/bash
tar -cf - myFile.txt | ssh $IP_SERVER ./ScriptServer.sh 

ScriptServer.sh

#!/bin/bash
tar -x -C ~/backups/ -f -

Этот фрагмент кода не мой, и я не понимаю, как -f - работает в команде tar, страница руководства бесполезна.

4 ответа4

1

С -f archive.tar , tar -c будет писать в архив, tar -x будет извлекать из него. -f - это специальный синтаксис, который означает "запись в стандартный вывод" (при создании) или "чтение из стандартного ввода" (при извлечении).

Это позволяет использовать tar в пайпах. Команда клиента отправляет tar в ssh . На удаленной стороне работает SSH сервер ./ScriptServer.sh и отправляет входящий поток на его стандартный ввод. tar -f - внутри скрипта читает этот поток.

Вы правы в том, что -f - не документировано в man 1 tar (по крайней мере, в руководствах, которые я читал). Без -f инструмент должен использовать stdout или stdin в любом случае. Поддержка нескольких других инструментов - как специальное "имя файла" для явного указания на stdout или stdin; Я полагаю, что поддержка -f - в tar - это всего лишь соответствие этому полустандарту.

1

Я не понимаю, как -f - работает в команде tar, страница руководства бесполезна.

На какую man страницу вы смотрите? Один из командной строки вашей системы через man tar или что-то еще? Проверка этой онлайновой справочной страницы на наличие tar - а также этой - показывает следующее:

-f, --file=ARCHIVE
use archive file or device ARCHIVE

Таким образом, -f будет читать входные данные из определенного файла ... Но что тогда - после -f? Это точно, черт возьми, это не файл. То есть в основном это специальный символ говорит команду, в данном случае, чтобы получить данные из stdin (стандартный ввод)... И это stdin происходит от первого сценария перенаправив вывод-ПОСРЕДСТВОМ | канал через SSH к получающему скрипту на месте назначения.

0

Вот пример без создания сценария на стороне получателя. Для передачи файлов через несжатый поток с локального на удаленный Unix:

LocalDir="./"
LocalFile="myFile.txt"
RemoteIP="192.168.1.1"
RemoteDir="~/backups/"

cd "$LocalDir"
tar -cf - "$LocalFile" | ssh $RemoteIP "cd '$RemoteDir'; tar -xf -"

POSIX Tar не сжимает файлы, только объединяет. Также вы можете добавить легкое сжатие таким образом

tar -cf - "$LocalFile" | gzip -1 | \
   ssh $RemoteIP "cd '$RemoteDir'; gzip -cd | tar -xf -"

Я не рекомендую вам добавлять глубокое сжатие из-за большего времени передачи.

Если вы хотите однострочник, вот он:

tar -cf - myFile.txt | gzip -1 | ssh 192.168.1.1 "cd backups; gzip -cd | tar -xf -"

Протестировано для передачи файла из RHEL6 в Solaris11 и обратно из Solaris в RHEL.

-1

Первая команда tar -cf - создаст tar для стандартного вывода (stdout) вместо обычного файла.

Это будет отправлено как stdin через ssh и использовано как таковое серверным скриптом.

Смотрите также: https://www.cyberciti.biz/faq/howto-use-tar-command-through-network-over-ssh-session/ и https://www.linuxjournal.com/content/working-stdin- и-стандартный вывод

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .