Linux. Команда scp
Команда scp
(secure copy) предназначена безопасного копирования файлов с локального компьютера на удаленный сервер, с удаленного сервера на локальный компьютер или между двумя удаленными серверами. Все, что нужно для работы команды — чтобы на удаленном хосте был установлен ssh-сервер + пароль для доступа (или ssh-ключ).
$ scp [опции] источник приемник
Примеры использования
Копирование файла с локального компьютера на удаленный сервер
$ scp /local/path/data.txt username@123.123.123.123:/remote/path $ scp /local/path/data.txt username@123.123.123.123:/remote/path/copy.txt
Копирование файла с удаленного сервера на локальный компьютер
$ scp username@123.123.123.123:/remote/path/data.txt /local/path $ scp username@123.123.123.123:/remote/path/data.txt /local/path/copy.txt
Копирование директории с локального компьютера на удаленный сервер
$ scp -r /local/path/source username@123.123.123.123:/remote/path/target
Обратите внимание, что содержимое директории /local/path/source
окажется внутри директории /remote/path/target/source
. Чтобы содержимое директории /local/path/source
оказалось внутри директории /remote/path/target
— нужно немного изменить команду.
$ scp -rs /local/path/source/. username@123.123.123.123:/remote/path/target
scp
использует устаревший протокол SCP, который небезопасен. Чтобы устранить уязвимость — разработчики в какой-то момент запретили использовать точку. Чтобы это обойти, нужно использовать опцию -s
— для работы по протоколу SFTP вместо SCP.
Копирование директории с удаленного сервера на локальный компьютер
$ scp -r username@123.123.123.123:/remote/path/source /local/path/target
Обратите внимание, что содержимое директории /remote/path/source
окажется внутри директории /local/path/target/source
. Чтобы содержимое директории /remote/path/source
оказалось внутри директории /local/path/target
— нужно немного изменить команду.
$ scp -sr username@123.123.123.123:/remote/path/source/. /local/path/target
Копирование файла с одного удаленного сервера на другой удаленный сервер
$ scp one-user@111.111.111.111:/remote/path/one/data.txt two-user@222.222.222.222:/remote/path/two two-user@222.222.222.222's password: пароль one-user@111.111.111.111's password: пароль
Копирование директории с одного удаленного сервера на другой удаленный сервер
$ scp -r one-user@111.111.111.111:/remote/path/one two-user@222.222.222.222:/remote/path/two two-user@222.222.222.222's password: пароль one-user@111.111.111.111's password: пароль
-3
можно передавать трафик между двумя удаленными хостами не напрямую, а через компьютер, на котором запущена команда.
Некоторые опции команды
Это не все опции, а только наиболее часто используемые.
-C
— использовать сжатие при передаче файлов-F
— файл конфигурации ssh-клиента вместо дефолтного-i
— файл ssh-ключа при аутентификации по ключу-l
— установить ограничение скорости, кбит/сек-o
— добавить опцию ssh как в/etc/ssh/ssh_config
-p
— сохранение времени изменения файлов-P
— ssh-порт, если используется не 22-ой-r
— использование рекурсивного копирования папок-v
— переход в более развернутый режим
Использование ssh-ключей
1. Копирование с локального на сервер
Начнем с простого — копирование файла с локального компьютера на удаленный сервер и обратно. Первым делом на локальном компьютере создаем пару ключей.
$ ssh-keygen -t ed25519 Generating public/private ed25519 key pair. Enter file in which to save the key (/home/evgeniy/.ssh/id_ed25519): one-server-ed25519 Enter passphrase (empty for no passphrase): Enter Enter same passphrase again: Enter Your identification has been saved in one-server-ed25519 Your public key has been saved in one-server-ed25519.pub The key fingerprint is: SHA256:hEConqbIX4oBKyqPd8D4dIT6wQzn/V6mLvqmagZ/nGg evgeniy@ubuntu-client The key's randomart image is: +--[ED25519 256]--+ | oo | | . . . | | . . . . | |o o . . | |oX.o S | |==O o | |O* * + o | |*=E X .+ | |B*=X.++ | +----[SHA256]-----+
Копируем публичный ключ на сервер
$ ssh-copy-id -i ~/.ssh/one-server-ed25519 one-user@111.111.111.111 /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "one-server-ed25519.pub" /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys one-user@111.111.111.111's password: пароль Number of key(s) added: 1 Now try logging into the machine, with: "ssh one-user@111.111.111.111" and check to make sure that only the key(s) you wanted were added.
На сервере разрешаем аутентификацию по ключу
$ sudo nano /etc/ssh/sshd_config
# разрешаем аутентификацию по ключу PubkeyAuthentication yes # запрещаем аутентификацию по паролю PasswordAuthentication no
$ sudo systemctl restart ssh.service
Пробуем подключиться по ключу
$ ssh -i ~/.ssh/one-server-ed25519 one-user@111.111.111.111 Welcome to Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-73-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage This system has been minimized by removing packages and content that are not required on a system that users do not log into. To restore this content, you can run the 'unminimize' command. Last login: Sun Jun 18 09:23:08 2023 from 192.168.110.2 $ exit
Все, можно копировать файл на сервер или с сервера
$ scp -i ~/.ssh/one-server-ed25519 /local/path/data.txt one-user@111.111.111.111:/remote/path
$ scp -i ~/.ssh/one-server-ed25519 one-user@111.111.111.111:/remote/path/data.txt /local/path
2. Копирование с сервера на сервер
Создаем пару ключей на локальном компьютере и копируем публичный ключ на второй сервер. И создадим файл конфигурации ssh-клиента на локальном компьютере. Вообще говоря, необязательно для работы с каждым новым сервером создавать новую пару ключей. Можно создать только одну пару и копировать публичный ключ на все сервера, с которыми надо работать. Просто мне так удобнее.
$ ssh-keygen -t ed25519
$ nano /home/evgeniy/.ssh/config
# вход по ключу на сервер 111.111.111.111 Host one-server User one-user HostName 111.111.111.111 Port 22 IdentityFile /home/evgeniy/.ssh/one-server-ed25519 # вход по ключу на сервер 222.222.222.222 Host two-server User two-user HostName 222.222.222.222 Port 22 IdentityFile /home/evgeniy/.ssh/two-server-ed25519
Пробуем подключиться по ключу к первому и второму серверу
$ ssh one-server .......... $ exit
$ ssh two-server .......... $ exit
Все, можно копировать файл c первого сервера на второй и обратно
$ scp one-server:/remote/path/one/data.txt two-server:/remote/path/two
$ scp two-server:/remote/path/two/data.txt one-server:/remote/path/one
Поиск: CLI • Linux • SSH • Директория • Команда • Файл • scp