Периодически в своей работе сталкиваюсь с необходимостью передать файлы с одного сервера на другой, или скачать с удаленного сервера на свой рабочий компьютер. Хочется это делать быстро и подручными средствами без использования графического нагромождения в виде десктопных клиентов по типу 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