Pull to refresh
2728.3
RUVDS.com
VDS/VPS-хостинг. Скидка 15% по коду HABR15

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

Reading time4 min
Views15K
Original author: Vivek Gite

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"


▍ Дополнительные примеры использования 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/


Tags:
Hubs:
Total votes 45: ↑40 and ↓5+35
Comments24

Articles

Information

Website
ruvds.com
Registered
Founded
Employees
11–30 employees
Location
Россия
Representative
ruvds