Поиск по сайту:

Безопасное копирование файлов с помощью команды SCP

Команда SCP (Secure Copy) — это неинтерактивная команда для безопасного копирования файлов и каталогов между двумя системами. SCP использует протокол SSH для шифрования и аутентификации, что делает его безопасным способом передачи файлов между удаленными серверами.

Если вы ищете отличное руководство по использованию команды SCP, не ищите дальше. В этом руководстве будут показаны примеры использования команд SCP, которые помогут вам стать уверенным пользователем SCP.

Готовый? Читайте дальше, чтобы поднять передачу файлов на новый уровень!

Предварительные условия

Этот урок будет практической демонстрацией. Если вы хотите следовать инструкциям, убедитесь, что у вас есть следующие требования.

  • Вам понадобятся два компьютера Linux, которые будут выступать в качестве источника копирования и места назначения копирования в одной или разных сетях. В этом руководстве будут использоваться компьютеры с Ubuntu 20.04, указанные в таблице ниже.
Computer Name

Наименование

ubuntu1

Исходный хост

ubuntu2

Хост назначения

  • Если на каждом компьютере или между двумя компьютерами установлен брандмауэр, убедитесь, что порт 22 открыт.
  • В этом руководстве предполагается, что вы уже открыли сеанс SSH и вошли в систему на обоих компьютерах.

Копирование файла с помощью команды SCP

Может быть много причин, по которым вам нужно скопировать файлы из одной системы в другую. Возможно, в целях резервного копирования, реплицируйте файлы конфигурации или просто хотите иметь копии файлов. Какой бы ни была причина, командование SCP вас поддержит.

Основной синтаксис команды SCP следующий.

scp [Option] [user1@]SRC_HOST:]your_file1 [user2@]DEST_HOST:]you_file2

Где :

  • Option — указывает любые используемые параметры, например шифрование или ограничение. В этом уроке вы будете использовать некоторые распространенные параметры.
  • user1 — имя пользователя на исходном хосте.
  • SRC_HOST — имя хоста или IP-адрес источника копии.
  • ваш_файл1 — путь и имя файла, который вы хотите скопировать.
  • DEST_HOST — имя хоста или IP-адрес назначения копии.
  • user2 — имя пользователя с доступом к хосту назначения.
  • ваш_файл2 — путь и имя файла, который вы хотите скопировать из ваш_файл1

Примечание. Вы можете указать пути к файлам, используя относительный или абсолютный путь в локальной системе. Но пути к файлам в удаленной системе должны использовать имя пользователя с абсолютным путем.

Теперь, когда вы понимаете основной синтаксис, вы можете начать с копирования файлов с помощью команды SCP.

1. Для начала создайте новый файл с именем backup.txt в домашнем каталоге ubuntu1.

# Change into the home directory
cd ~
# Create a text file with content
echo "This is my backup file" > backup.txt
# Display the file content to confirm
cat backup.txt
# Show the SHA1 hash 

2. Затем создайте новый каталог с именем backup в Ubuntu2. Этот каталог будет местом назначения для копирования файлов.

# Creat the backup directory
mkdir ~/backup && cd ~/backup
# Display the full path
pwd

3. Теперь запустите команду scp, указанную ниже, в Ubuntu1, чтобы скопировать backup.txt в каталог backup в Ubuntu2. Обязательно замените имя пользователя и путь на свои.

scp backup.txt ata@ubuntu2:/home/ata/backup

Если вы хотите скопировать файл под другим именем, добавьте новое имя файла к пути назначения. Пример: scp backup.txt ata@ubuntu2:/home/ata/backup/backup2.txt

4. Если вы впервые подключаетесь к хосту ubuntu2, введите yes в запросе подтверждения и нажмите Enter.

5. Затем введите пароль учетной записи пользователя в ubuntu2 и нажмите Enter. Как только вы введете правильный пароль, копирование файла продолжится.

6. После копирования файла переключитесь на терминал ubuntu2 и выполните приведенную ниже команду, чтобы просмотреть содержимое каталога.

ls

Убедитесь, что файл backup.txt существует и вы успешно скопировали его.

7. Затем отобразите содержимое скопированного файла, чтобы убедиться, что файл не поврежден в ubuntu2.

cat backup.txt

8. Наконец, чтобы убедиться в идентичности файлов, получите контрольную сумму SHA1 каждого файла на обоих компьютерах и сравните значения. Этот шаг является дополнительной мерой для проверки того, что целостность файла не изменилась во время передачи.

# on ubuntu1 and ubuntu2
sha1sum backup.txt

Выполнение рекурсивного копирования с помощью команды SCP

В предыдущем разделе вы научились копировать отдельные файлы из локальной системы в удаленную систему с помощью команды SCP. В реальных сценариях вам часто требуется скопировать весь каталог с его подкаталогами и файлами.

Копирование целых каталогов обычно применяется в сценариях резервного копирования. Предположим, на вашем сервере (ubuntu1) работает веб-сервер, файлы которого находятся в каталоге /var/www/. Ниже приведен пример древовидной структуры папок.

/var/www
├── html
│   └── index.html
└── your_domain
    └── index.html

Вы можете легко создать резервную копию всей папки в удаленном месте с помощью команды SCP.

В большинстве случаев операции резервного копирования выполняются с помощью сценариев автоматизации и запланированных задач или заданий cron. В этом примере показано, как вручную создать резервную копию всего каталога.

1. Сначала создайте каталог web-server-backup в ubuntu2.

# Create the backup directory on ubuntu2
mkdir ~/web-server-backup
# Display the full backup directory path
realpath ~/web-server-backup

2. Затем вернитесь к терминалу ubuntu1 и выполните приведенную ниже команду SCP. Переключатель -r включает режим рекурсивного копирования, что означает, что SCP скопирует весь /var/www/ из верхней папки до последнего файла.

scp -r /var/www/ ata@ubuntu2:/home/ata/web-server-backup

3. Теперь запустите команду дерева в обеих системах, чтобы сравнить структуру каталогов. В ubuntu1 вы отобразите дерево каталогов для /var/www. В Ubuntu2 вы отобразите дерево каталогов для каталога резервного копирования, которым в этом примере является /home/ata/web-server-backup.

# on ubuntu1
tree /var/www/

# on ubuntu2
tree /home/ata/web-server-backup

Фильтрация расширений файлов для копирования

Предположим, у вас есть каталог в вашей локальной системе, содержащий файлы разных типов с разными расширениями. В рамках вашей работы вы должны скопировать все файлы из этой папки на удаленный компьютер с помощью команды SCP. Вы уже знаете, как копировать целые каталоги.

Но при условии, что вы должны копировать только все файлы с расширением *.txt. Не паникуйте; вы все еще на правильном пути, и решение недалеко от того, что вы уже сделали в предыдущих разделах. Чтобы отфильтровать файлы для копирования, вы будете использовать подстановочные знаки.

Общими подстановочными знаками являются звездочка (*), обозначающая ноль, один или несколько символов, и вопросительный знак (?), обозначающий один символ.

1. Сначала создайте папку с образцами и файлы в Ubuntu1, которые вы будете копировать позже. Запустите команду ниже, чтобы создать папку foo и файлы с расширениями *.txt, *.doc и *.ppt.

# Create a directory named foo
mkdir foo && cd foo
# Create five *.txt files
touch {1..5}.txt
# Create five *.doc files
touch {1..5}.doc
# Create five *.ppt files
touch {1..5}.ppt
# List all the files in the directory

2. Затем переключитесь на терминал Ubuntu2 и создайте каталог с именем bar. Этот каталог будет местом назначения вашей копии.

# Create the folder
mkdir bar
# Display the new folder's full path
realpath bar

3. Вернитесь к терминалу ubuntu1 и выполните приведенную ниже команду SCP. Обратите внимание, что на этот раз вместо указания конкретной папки в качестве источника ваш источник содержит подстановочный знак, который соответствует любым файлам с расширением txt внутри папки foo.

scp *.txt ata@ubuntu2:/home/ata/bar/

Введите пароль учетной записи, и копирование должно продолжиться. Как вы можете видеть ниже, команда SCP скопировала только файлы txt, несмотря на то, что в исходной папке есть файлы других типов.

4. Наконец, переключитесь на терминал ubuntu2 и перечислите файлы в каталоге bar.

ls -l bar/

Результат должен подтвердить, что в каталоге существуют только файлы *.txt.

Включение аутентификации на основе ключей

Ввод пароля целевой учетной записи может быть утомительным и обременительным. Кроме того, аутентификация на основе пароля менее безопасна и не подходит для автоматизации. Какова альтернатива? Включите аутентификацию на основе ключей.

Как вы знаете, команда SCP «под капотом» использует SSH. А SSH дает вам возможность проходить аутентификацию с использованием ключей SSH вместо паролей. Шаги по настройке SCP с аутентификацией по ключу SSH следующие.

1. В ubuntu1 сгенерируйте пару ключей SSH, выполнив команду ssh-keygen.

ssh-keygen -t rsa

2. Нажмите Enter, чтобы принять путь по умолчанию для сохранения ключа. Наконец, нажмите Enter два раза, чтобы не добавлять парольную фразу к ключу.

Как вы можете видеть ниже, команда создала два файла. Файл id_rsa — это ваш закрытый ключ, который останется на исходном компьютере. И наоборот, вам следует скопировать id_rsa.pub на целевой хост.

3. Запустите приведенную ниже команду, чтобы скопировать ваш открытый ключ на удаленный хост ubuntu2.

ssh-copy-id ata@ubuntu2

Введите пароль целевой учетной записи в ответ на запрос, чтобы продолжить копирование открытого ключа.

4. Теперь, когда вы сгенерировали пару ключей SSH, выполните приведенную ниже команду, чтобы безопасно скопировать файл backup.txt из ubuntu1 в ubuntu2. . Аргумент -i ~/.ssh/id_rsa указывает команде SCP выполнить аутентификацию с использованием файла ключей SSH.

scp -i ~/.ssh/id_rsa backup.txt ata@ubuntu2:backup3.txt

Команда SCP больше не запрашивает пароль, как вы можете видеть ниже.

Вот и все! Вы избавились от надоедливого запроса пароля и сделали сеанс SSH еще более безопасным.

Заключение

В этой статье вы узнали, как использовать команду SCP для безопасного копирования файлов между двумя системами Linux. Вы также узнали, как использовать SCP с ключами SSH для аутентификации. Теперь, когда вы узнали о команде SCP, попробуйте ее в следующий раз, когда вам понадобится скопировать ее в большие файлы между компьютерами.

Статьи по данной тематике