Ранее я писал небольшую заметку про 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://[email protected]: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 [email protected]:~///{file1,file2,file3//} ./
Как скопировать несколько файлов с компьютера на сервер?
Вот как:
scp -rp ./file1 ~/Downloads/file2 /var/www/file3 [email protected]:~
Что делать, если у меня используется ключ авторизации?
Тут нам поможет опция -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