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