Передача данных между серверами LinuxПериодически в своей работе сталкиваюсь с необходимостью передать файлы с одного сервера на другой, или скачать с удаленного сервера на свой рабочий компьютер. Хочется это делать быстро и подручными средствами без использования графического нагромождения в виде десктопных клиентов по типу WinSCP и FileZilla, несмотря на всю прелесть GUI. Чтобы каждый раз не гуглить эти элементарные команды, зафиксирую их в этой краткой инструкции.
RSYNC (remote synchronization) - утилита для синхронизации данных.
На удаленном и локальном хостах обязательно должна быть установлена утилита
rsync.
Скачать файл с удаленного хоста в директорию на локальном:
rsync -av user@host:/remote/path/to/file /local/path/directory
Скачать все файлы из директории на удаленном хосте в директорию на локальном хосте:
rsync -av user@host:/remote/directory/* /local/path/directory
Загрузить файл с локального хоста в директорию на удаленный:
rsync -av /local/path/file user@remote_host:/remote/path/to/directory
К тому же можно копировать файлы из одной директории в другую только на локальном хосте, это может быть удобно например для CI/CD, когда нам нужно синхронизировать файлы из репозитория с директорией на локальном хосте:
rsync -av --delete /local/path/directory/* /local/app
Опции:
-a: режим архивации - передача метаинформации о владельце, группе и правах-v: включить детальный вывод-z: сжимать файлы перед отправкой, требует ресурсов CPU и может быть менее эффективно чем передавать сырые данные по сети--progress: показывать шкалу прогресса--delete: удалить лишние файлы в директории назначения (куда копируем)SCP (secure copy) - утилита и протокол защищенного копирования данных через SSH.
Скачать файл с удаленного хоста на локальный:
scp user@host:/remote/path/to/file /local/path/directory
Загрузить файл с локального хоста на удаленный:
scp /local/path/file user@remote_host:/remote/path/to/directory
Для рекурсивного скачивания/загрузки директории нужно использовать опцию -r:
scp -r user@host:/remote/directory /local/directory
Опции:
-r: рекурсивно загружать-C: сжимать при передаче (может быть неэффективно на очень больших файлах)-i: приватный ключ SSH-p: сохранять метаинформацию файлов (владелец, группа, права)-P: порт SSH-v: детальный выводSFTP (SSH File Transfer Protocol) реализуется как подсистема ssh-сервера. Для OpenSSH SFTP включен по умолчанию, в файле /etc/ssh/sshd_config можно найти такую строку:
Subsystem sftp /usr/lib/openssh/sftp-server
Для подключения используем sftp-клиент:
sftp app@192.168.1.15
sftp>
Если видим приглашение к вводу sftp> значит получилось подключиться и мы можем начать взаимодействовать с сервером. Например, скачаем файл:
# текущая рабочая директория на локальном хосте
sftp> lpwd
Local working directory: /home/byurrer/test
# текущая рабочая директория на сервере
sftp> pwd
Remote working directory: /home/app
# список файлов на сервере
sftp> ls
test
# список файлов на локальном хосте (пусто)
sftp> lls
# список файлов на сервере в директории test
sftp> ls test
test/1.txt test/2.txt
# скачать с сервера на локальный хост файл
sftp> get test/1.txt
Fetching /home/app/test/1.txt to 1.txt
# список файлов на локальном хосте
sftp> lls
1.txt
Не трудно заметить что команды для удаленного и локального хостов очень похожи, но для локального хоста всегда нужно подставлять символ l.
Для вызова справки используйте ? или help.
Оказывается, можно смонтировать удаленную директорию на локальный хост и работать с ней как с локальной, при помощи sshfs:
# создаем директорию для монтирования
mkdir ~/remote_dir
# монтируем удаленную директорию в локальную
# опция -o reconnect позволяет переподключаться в случае потери соединения
sshfs user@remote_host:/remote/path ~/remote_dir -o reconnect
# делаем что нужно
# отмонтируем удаленную директорию при завершинии работ
umount ~/remote_dir
Удобно передавать файлы в графическом интерфейсе, а псевдографический MC позволяет это делать. Для этого нужно выбрать панель (правую или левую) как на скриншоте:

И выбрать например Shell-соединение или SFTP-соединение, ввести user@host и на выбранной панели появится список файлов и директорий на удаленном хосте:


Было замечено, что в MC через
SFTP-соединениеподключиться не ко всем серверам, даже если через обычныйsftp-клиентсоединение успешно. Причина мне пока не известна.
В Midnight Commander реализован vfs с поддержкой некоторых форматов, именно поэтому в нем можно просматривать многие форматы файлов, например, можно просматривать сжатые архивы. Кроме того в MC реализован FISH, при помощи которого можно делать такие трюки:
cd sh://app@192.168.1.15