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