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

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

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

решение1

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

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

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

решение2

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

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

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

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

решение3

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

решение4

Первая команда «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-and-stdout

Связанный контент