Кратко: scp — шифрованное копирование файлов
Ранее я писал небольшую заметку про csp в статье про openssh, но практика показала, что ее было недостаточно.
SCP это утилита для удаленного копирования фалов по сети между хостами, которая использует SSH для передачи данных.
Синтаксис:
scp <опции> <что копируем> <куда копируем>
Как скопировать файл с сервера на компьютер?
Следующая команда скачивает файл filefromsrv с сервера, который лежит в домашнем каталоге пользователя user в папку Downloads, в домашний каталог на компьютер:
scp [email protected]:~/filefromsrv ~/Downloads/
Вот как это будет выглядеть:
scp [email protected]:~/filefromsrv ~/Downloads/
[email protected]'s password:
filefromsrv 100% 6 5.5KB/s 00:00
# проверим, скопирован ли файл:
$ ls -lah Downloads/*
-rw-r--r-- 1 user user 6 янв 18 01:52 Downloads/filefromsrv
Как скопировать файл с компьютера на сервер?
scp ~/Downloads/filefrompc [email protected]:~/
Посмотрим наглядно:
scp ~/Downloads/filefrompc [email protected]:~/
[email protected]'s password:
filefrompc 100% 14 12.3KB/s 00:00
# проверим на сервере
$ ls -lah filefromp*
-rw-r--r-- 1 user user 14 Jan 18 01:59 filefrompc
Что делать если у меня другой порт?
Для этого есть ключ -P. Важно соблюдать синтаксис, опции должны быть указаны перед путями источника и назначения:
scp -P 2013 ./filefrompc [email protected]:~/
Живой пример:
scp -P 2013 ./filefrompc [email protected]:~/
[email protected]'s password:
filefrompc 100% 14 10.1KB/s 00:00
Как скопировать папку?
К примеру мы хотим скачать папку с файлами с сервера на свой ПК, для этого нам потребуется рекурсивное копирование каждого файла (по аналогии с командой cp):
scp -r [email protected]:~/dirfromsrv ~/Downloads/
Живой пример:
$ scp -r [email protected]:~/dirfromsrv ~/Donbloads/
[email protected]'s password:
file4 100% 0 0.0KB/s 00:00
file2 100% 0 0.0KB/s 00:00
file3 100% 0 0.0KB/s 00:00
file1 100% 0 0.0KB/s 00:00
file5 100% 0 0.0KB/s 00:00
Как скопировать файлы сохранив права и время изменения/доступа
Это бывает полезно, когда мы хостим скопировать файлы сохранив их атрибуты и для этого нам потребуется ключ -p:
scp -p -r [email protected]:~/dirfromsrv ~/Downloads/
Живой пример:
$ scp -p -r [email protected]:~/dirfromsrv ~/Downloads/
[email protected]'s password:
file4 100% 0 0.0KB/s 00:00
file2 100% 0 0.0KB/s 00:00
file3 100% 0 0.0KB/s 00:00
file1 100% 0 0.0KB/s 00:00
file5 100% 0 0.0KB/s 00:00
# Права должны быть 777, сами файлы были созданы в 19:37:
$ ls -lah dirfromsrv/
total 8,0K
drwxrwxrwx 2 user user 4,0K янв 17 19:37 .
drwxr-xr-x 6 user user 4,0K янв 18 02:28 ..
-rwxrwxrwx 1 user user 0 янв 17 19:37 file1
-rwxrwxrwx 1 user user 0 янв 17 19:37 file2
-rwxrwxrwx 1 user user 0 янв 17 19:37 file3
-rwxrwxrwx 1 user user 0 янв 17 19:37 file4
-rwxrwxrwx 1 user user 0 янв 17 19:37 file5
Как скопировать файлы с сервера на сервер?
Пример использования этой команды:
scp -rp [email protected]:~/dirfromsrv [email protected]:~/
Обратите внимание, файл будет копироваться с сервера на сервер минуя компьютер, на котором запускается команда. Но это не будет работать, если у серверов разные порты или один из них требует ключ авторизации, а чтобы это работало (данным способом), на каждом из них должен быть настроен необходимый алиас и авторизация по ключу (если она где-то требуется).
Обойти эту особенность можно указав серверы (можно и один из них) в виде uri:
scp -rp3 scp://[email protected]:666/~/2021-01-18 scp://[email protected]:2013/~/
Данный способ позволяет указать порт подклчения прямо в строке запроса, но есть два момента:
- этот способ работает только с ключем -3, который заставляет копироваться файлы с сервера на сервер через компьютер клиента
- путь до файла начинается после первого слэша (/). Например для указани полного пути должна быть строка вида scp://user@ip:port//var/log/somelogs
Да, этот способ мб и медленнее, но это решает нашу проблему и может решить проблему с доступами.
Есть еще один способ, который будет удобнее, но потребует дополнительной настройки алиаса в файле ~/.ssh/config. Вот пример самого конфига:
$ cat ~/.ssh/config
Host srv
HostName 10.10.20.7
Port 2013
User user
Host drv
HostName 10.10.20.15
Port 6222
User user
IdentityFile ~/.ssh/key-rsa
После проделанных настроек копировать файлы можно так:
scp -rp drv:~/dirfromsrv srv:~/
Выглядит удобнее :).
Как ограничить скорость копирования?
Бывает полезно, иногда ограничить скорость копирования, чтобы не занимать всю ширину канала, для этого потребуется указать ключ и скорось в Kbit/s:
scp -rp -l 8000 [email protected]:~/2021-01-18 ./
Живой пример:
scp -rp -l 8000 [email protected]:~/2021-01-18 ./
[email protected]'s password:
16-05-47.mp4.thumb 100% 26KB 855.6KB/s 00:00
13-46-35.mp4.thumb 100% 24KB 1.8MB/s 00:00
13-16-35.mp4 12% 4016KB 1.0MB/s 00:27 ETA
Как скопировать несколько файлов с сервера на компьютер?
Вот так:
scp user@server:~///{file1,file2,file3//} ./
Как скопировать несколько файлов с компьютера на сервер?
Вот как:
scp -rp ./file1 ~/Downloads/file2 /var/www/file3 user@server:~
Что делать, если у меня используется ключ авторизации?
Тут нам поможет опция -i. Эта опция дает возможность указать ключик для RSA-аутентификации.
scp -i /home/user/.ssh/id_rsa -P 2013 ~/filefromsrv [email protected]:~/
Естественно есть и второй вариант с заранее настроенным алиасом в ~/.ssh/config
. Пример конфига:
$ cat ~/.ssh/config
Host srv
HostName 10.10.20.7
Port 2013
User user
IdentityFile ~/.ssh/id_newsrv_rsa.pub
Host drv
HostName 10.10.20.15
Port 6222
User user
IdentityFile ~/.ssh/id_dvr_rsa.pub
Ну и копируем файл так:
scp -rp drv:~/dirfromsrv srv:~/
Что делать, если у меня proxy сервер
Тут скорее пример того, как можно использовать ключ -o (ssh_option). В нашем случае, для того, чтобы скопировать файл на удаленный хост, нам необходимо указать proxy сервер с помощью corkscrew. Сделать это все можно так:
scp -o "ProxyCommand corkscrew 10.0.10.6 3339 %h %p" -P 2013 ./filefromsrv [email protected]:~/
Естественно, есть вариант использовать алиас в ~/.ssh/config
. Пример конфига:
Host wa
HostName 10.20.20.22
User user
Port 2013
ProxyCommand corkscrew 10.0.10.6 3339 %h %p
Пример команды:
scp ./filefromsrv wa:~/
Выглядит куда проще. Естественно ssh_option есть куда больше, и подробнее о них можно прочитать набрав man scp.
Как изменить алгоритм шифрования для копирования файлов?
Иногда, в целях безопасности может потребоваться изменить алгоритм шифрования на наиболее сильный. Например, ниже мы изменим алгоритм шифрования с дефолтного AES-128 на AES-256, с помощью ключа -c:
scp -c aes256-ctr .filefromsrv wa:~/
В этом описании я постарался собрать наиболее часто используемые мною примеры использования scp. Если есть еще что-то интересное — пишите, буду рад добавить)
Источники
- https://superuser.com/questions/174160/scp-over-a-proxy-with-one-command-from-local-machine
- https://unix.stackexchange.com/questions/535852/how-to-specify-port-for-scp-for-a-remote-server
- https://linux-notes.org/kak-skopirovat-danny-e-cherez-scp-v-linux
- https://www.linuxtechi.com/scp-command-examples-in-linux
- https://phoenixnap.com/kb/how-to-use-linux-scp-command-examples
- https://www.techrepublic.com/article/how-to-use-secure-copy-with-ssh-key-authentication