Linux. Команда scp

17.06.2023

Теги: CLILinuxSSHДиректорияКомандаФайл

Команда 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

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.