Кратко: scp — шифрованное копирование файлов

Ранее я писал небольшую заметку про csp в статье про openssh, но практика показала, что ее было недостаточно.

Кратко: scp - шифрованное копирование файлов

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