Как можно отправить архив .tar по ssh без временного файла? Что такое опция «-f -» в tar?

391
Marco

Как сделать сжатие и распаковку архива с помощью команды 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, страница руководства бесполезна.

2

4 ответа на вопрос

1
Kamil Maciorowski

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

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

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

1
JakeGould

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

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

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

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

0
Sasha Golikov

Вот пример без создания сценария на стороне получателя. Для передачи файлов через несжатый поток с локального на удаленный 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
tonioc

Первая команда 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- и-стандартный вывод

Похожие вопросы