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/