[Перевод] Использование утилиты tar по сети через SSH

nt3mycynkatnvh-kdoxov3fkzzs.png


GNU-версию утилиты архивирования tar, равно как и её старые версии, можно использовать через сетевое подключение по протоколу ssh. От telnet/nc стоит отказаться, так как они не гарантируют безопасность соединения. Создавать архивы можно с помощью каналов (pipe) Unix/Linux, и ниже я продемонстрирую ряд примеров использования tar по ssh для архивирования в Linux, BSD/macOS или Unix-подобных системах.

Синтаксис использования tar по SSH


Установка соединения с хостом box по ssh и выполнение tar:

$ ssh user@box tar czf - /dir1/ > /destination/file.tar.gz


либо:

$ ssh user@box 'cd /dir1/ && tar -cf - file | gzip -9' >file.tar.gz


Следующая команда приведёт к созданию резервной копии каталога /wwwdata на хосте dumpserver.nixcraft.in (IP 192.168.1.201) по ssh:

# tar zcvf - /wwwdata | ssh user@dumpserver.nixcraft.in "cat > /backup/wwwdata.tar.gz"


либо:

# tar zcvf - /wwwdata | ssh vivek@192.168.1.201 "cat > /backup/wwwdata.tar.gz"


Образец вывода:

tar: Removing leading `/' from member names
/wwwdata/
/wwwdata/n/nixcraft.in/
/wwwdata/c/cyberciti.biz/
....
..
...
Password:


В следующем примере архивируем /data2/, попутно используя gpg:

$ tar zcf - /data2/ | gpg -e | ssh vivek@nas03 'cat - > data2-dd-mm-yyyy.tar.gz.gpg'


Обратите внимание, что при использовании sudo или любой другой команды, требующей аллокации псевдо-терминала, здесь может возникнуть ошибка:

sudo: sorry, you must have a tty to run sudo


Для её избежания нужно сопроводить команду ssh флагом -t:

# tar zcvf - /wwwdata | ssh -t vivek@192.168.1.201 "sudo cat > /backup/wwwdata.tar.gz"

Копирование с удалённой машины (server1.cyberciti.biz) в локальную систему выполняется так:

$ cd /path/local/dir/
$ ssh vivek@server1.cyberciti.biz 'tar zcf - /some/dir' | tar zxf -


▍ Резервное копирование/зеркалирование жёсткого диска под Linux


Команда для копирования всего HDD /dev/sdvf с локальной машины на облачный бэкап-сервер AWS EC2:

# dd if=/dev/sdvf | ssh backupimg@vpc-aws-mumbai-backup-001 'dd of=prod-disk-hostname-sdvf-dd-mm-yyyy.img'


Для восстановления локального диска из образа с сервера эту команду нужно реверсировать. Если продолжить пример выше, то выглядеть это будет так:

# ssh backupimg@vpc-aws-mumbai-backup-001 'dd if=prod-disk-hostname-sdvf-dd-mm-yyyy.img' | dd of=/dev/sdvf


▍ Перенос данных в новую систему Linux


Проблема с scp и другими командами, копирующими структуру каталогов, в том, что символические ссылки, специальные файлы устройств, сокеты, именованные каналы и прочие компоненты не копируются. Поэтому мы используем tar по ssh. Скопируем, к примеру, все данные из nuc-box.

Открываю терминал и выполняю команду ssh вместе с tar:

$ ssh vivek@nuc-box 'tar czf - /home/vivek' | tar xvzf - -C /home/vivek


▍ Применение tar по SSH к ленточному накопителю


В Linux по умолчанию первым ленточным накопителем SCSI является /dev/st0. Подробнее о соглашении именования таких накопителей в Linux можете почитать здесь (англ.). Для большей ясности можно использовать команду dd:

# tar cvzf - /wwwdata | ssh root@192.168.1.201 "dd of=/backup/wwwdata.tar.gz"


Также есть вариант отправить бэкап на удалённое ленточное устройство:

# tar cvzf - /wwwdata | ssh root@192.168.1.201 "cat > /dev/nst0"


С помощью команды mt можно перемотать плёнку, после чего сделать с неё дамп командой cat:

# tar cvzf - /wwwdata | ssh root@192.168.1.201 $(mt -f /dev/nst0 rewind; cat > /dev/nst0)$


▍ Извлечение tar по SSH


Синтаксис для этой операции весьма прост:

$ cat my-data.tar.gz | ssh user@server1.cyberciti.biz "tar zxvf -"
$ cat my-data.tar.gz | ssh user@server1.cyberciti.biz "cd /path/to/dest/; tar zxvf -"


В данном примере выполняется восстановление бэкапа с удалённой машины в локальный каталог по ssh:

# cd /
# ssh root@192.168.1.201 "cat /backup/wwwdata.tar.gz" | tar zxvf -


Если вы решите задействовать эту команду в задачах cron или скриптах, подумайте об использовании ключей ssh, чтобы исключить пароли.

▍ Создание архива с индикатором прогресса


По умолчанию утилита pv в вашей системе может отсутствовать. Если это так, то для её установки используйте команду apk в Alpine Linux, dnf/yum в RHEL & co, apt/apt-get в Debian и Ubuntu & co, zypper в SUSE/OpenSUSE, pacman в Arch Linux.


Команда pv позволяет наблюдать прогресс прохождения данных по каналу. Вот её синтаксис:

$ cd /dir/to/backup/
$ tar zcf - . | pv | ssh vivek@server1.cyberciti.biz "cat > /backups/box42/backup-dd-mm-yyyy.tgz"
$ cd /tmp/data/
$ tar zcf - . | \
pv | \
ssh vivek@centos7 "cat > /tmp/data.tgz"


e50uign8qcix4dhkiqclzfdifbs.gif


▍ Дополнительные примеры использования tar по SSH

$ tar cvjf - * | ssh vivek@nixcraft "(cd /dest/; tar xjf -)"
$ tar cvzf - mydir/ | ssh vivek@backupbox "cat > /backups/myfile.tgz"
$ tar cvzf - /var/www/html | ssh vivek@server1.cyberciti.biz "dd of=/backups/www.tar.gz"
$ ssh vivek@box2 "cat /backups/www.tar.gz" | tar xvzf -
$ tar cvjf - * | ssh root@home.nas02 "(cd /dest/; tar xjf - )"


Больше подробностей об использовании команд tar/ssh/bash можно узнать с помощью help или man:

$ man tar
$ man bash
$ man ssh


▍Примечание об SSHFS


С помощью sshfs можно монтировать удалённые каталоги и выполнять tar:

$ mkdir /data/
$ sshfs vivek@server1.cyberciti.biz:/ /data/
$ tar -zcvf /data/file.tar.gz /home/vivek/


▍ Заключение


В этой небольшой статье мы вкратце познакомились с возможностями использования tar в сеансах ssh для безопасной передачи архивов, файлов и образов. В некоторых случаях для ускорения передачи можно избежать сжатия на обеих сторонах. Например, так:

$ tar cvf - /wwwdata | ssh user@dumpserver.nixcraft.in "cat > /backup/wwwdata.tar"
$ ssh vivek@server1 'tar c .' | tar xvf - -C /home/vivek/

sz7jpfj8i1pa6ocj-eia09dev4q.png

© Habrahabr.ru