
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/
