Как использовать команду SCP для безопасной передачи файлов

Передача файлов в Linux с помощью SCP

Linux-администратор должен уверенно владеть интерфейсом командной строки, так как на большинстве Linux-серверов не устанавливается графическая оболочка. SSH является наиболее популярным протоколом, который обеспечивает администратору возможность безопасного удаленного управления сервером. Для безопасного копирования файлов между серверами с использованием этого протокола используется команда scp (secure copy – безопасное копирование). В данном руководстве мы рассмотрим основы работы с командой scp и наиболее важные опции.

Команда scp выглядит следующим образом

Данная команда выполняет копирование указанного файла (имя_файла) в конкретную директорию (директория_назначения) на узле назначения (узел_назначения) с использованием учетной записи определенного пользователя (пользователь).
Подробная информация о процессе копирования
При запуске без параметров команда scp будет копировать файлы в фоновом режиме. Пользователь ничего не видит, пока процесс не будет завершен, или не возникнет какая-либо ошибка. Для вывода подробной информации о процессе копирования на экран можно воспользоваться параметром –v. Это может помочь в отладке проблем соединения, аутентификации и конфигурации.

Синтаксис команд SCP

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

scp Синтаксис команда имеет следующий вид:

  • OPTION — параметры scp, такие как шифр, конфигурация ssh, порт ssh, лимит, рекурсивное копирование и т. д.
  • [user@]SRC_HOST:]file1 — Исходный файл.
  • [user@]DEST_HOST:]file2 — Файл назначения

scp предоставляет ряд опций, которые контролируют каждый аспект его поведения. Наиболее широко используемые варианты:

  • -P — Определяет удаленный хост ssh порт.
  • -p — Сохраняет файлы модификации и время доступа.
  • -q — Используйте эту опцию, если вы хотите отключить индикатор выполнения и сообщения об ошибках.
  • -C — Эта опция принудительно scp сжимает данные при их отправке на конечный компьютер.
  • -r — Эта опция говорит scp рекурсивно копировать каталоги.

Необходимость в SSH-сервере

Перед началом разбора необходимо остановиться на таком понятии, как SSH-сервер. Он необходим для работы SCP в Linux, поскольку утилита использует именно этот протокол. Вам понадобится установить SSH-протокол и настроить его. Кроме того, важно знать пароль или ключ для подключения, о чем более детально читайте в статье по следующей ссылке.

Это общий синтаксис утилиты, который необходимо использовать при вводе команды в Терминале, чтобы она выполнилась успешно и обработала ваш запрос. Как видно, ничего в этом трудного нет, однако нужно подробнее разобрать доступные опции (они же options в строке синтаксиса):

-1 – в этом случае используется протокол SSH1;

-2 – то же самое, но с версией SSH2;

-B – активация пакетного режима, когда нужно передать сразу пачку файлов;

-C – использовать сжатие при отправке;

— l – установка ограничения в кбит/сек (значение задается пользователем вручную);

-o – добавление опций SSH;

-p – сохранение времени изменений файлов;

-r – использование рекурсивного копирования папок;

-v – переход в более развернутый режим.

Некоторые из перечисленных опций, возможно, пригодятся вам в работе, поэтому рекомендую запомнить их или где-то сохранить с понятными для вас пометками, чтобы знать, когда и что использовать. Далее я развернуто расскажу о популярных опциях и их практическом применении.

Выбор пользователя

Так выглядит стандартное копирование файлов SCP без применения дополнительных опций. То есть вы указываете путь к файлу (user замените на свое имя пользователя), затем добавляете путь назначения. Одно важное замечание: у пользователя должно быть разрешение на запись в указанную папку, иначе операция прервется.

Копирование директории

Если вы ознакомились с описанным выше списком опций, то уже знаете, что SCP предлагает передачу целых директорий с использованием опции -r. В таком случае строка в Терминале обретает вид:

Копирование папки при помощи утилиты SCP

Если нужно передать все файлы из определенной папки, замените строку на следующую:

Только не забудьте изменить путь к файлу и место назначения. Как видно, добавилась только косая черта после последней директории и значок *, обозначающий копирование всех элементов.

Копирование всех файлов в папке SCP

Копирование с сервера на компьютер

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

Копирование с удаленного сервера на компьютер через утилиту SCP

Мы просто поменяли местами пути в команде. Вы можете использовать все те же опции, осуществляя копирование с разными атрибутами или передавая целые каталоги.

Если файлы передаются с одного удаленного сервера на другой, то их адреса указываются следующим образом:

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

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

Графический интерфейс SFTP

SCP и SFTP являются не только утилитами, но и протоколами. То есть другие программы могут поддерживать работу с ними и использоваться в качестве удобного графического интерфейса. Благодаря этому вы сможете управлять файлами на сервере, например, через FileZilla или привычные файловые менеджеры. Подробности смотрите в статье «Как скачивать файлы по SSH».

    (100%) (55.3%) (55.3%) (55.3%) (55.3%) (RANDOM — 50.6%)

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

Копирование файлов

Передача файлов на сервер иногда может утомлять. Помимо возни с sftp и прочими странными вещами, ssh предоставляет нам команду scp, которая осуществляет копирование файла через ssh-сессию.

scp path/myfile user@8.8.8.8:/full/path/to/new/location/

Обратно тоже можно:
scp user@8.8.8.8:/full/path/to/file /path/to/put/here

Fish warning: Не смотря на то, что mc умеет делать соединение по ssh, копировать большие файлы будет очень мучительно, т.к. fish (модуль mc для работы с ssh как с виртуальной fs) работает очень медленно. 100-200кб — предел, дальше начинается испытание терпения. (Я вспомнил свою очень раннюю молодость, когда не зная про scp, я копировал ~5Гб через fish в mc, заняло это чуть больше 12 часов на FastEthernet).

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

Что такое SCP?

Команда scp — это утилита, которая работает по протоколу SSH, а значит, все что вам нужно для передачи файла на компьютер, это чтобы на нем был запущен SSH сервер, а также вы должны знать логин и пароль для подключения к нему. С помощью команды scp вы можете не только перемещать файлы между локальной и удаленной системой, но и между двумя удаленными системами. Для этого тоже будет достаточно знать пароли от них. И в отличие от Rsync вам не нужно авторизоваться на одном из серверов.

Эта статья рассчитана в первую очередь на начинающих, поэтому я попытаюсь объяснять все как можно подробнее. Перед тем, как мы перейдем к практике, нужно рассмотреть общий синтаксис команды:

$ scp опции пользователь1@хост1 : файл пользователь2@хост2: файл

Опции утилиты больше касаются протокола SSH и настраивают общее ее поведение. Дальше следует адрес первого и второго файла. Каждый из них может быть расположен как на локальной, так и на удаленной машине. А теперь рассмотрим основные опции, которые могут нам понадобиться:

  • -1 — использовать протокол SSH1;
  • -2 — использовать протокол SSH2;
  • -B — пакетный режим для передачи нескольких файлов;
  • -C — включить сжатие;
  • — l — установить ограничение скорости в кбит/сек;
  • -o — задать нужную опцию SSH;
  • -p — сохранять время модификации;
  • -r — рекурсивное копирование директорий;
  • -v — более подробный режим.

scp /home/sergiy/file root@losst.ru:/root/

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

С помощью опции -r вы можете скопировать на удаленную машину целый каталог. Команда будет выглядеть вот так:

scp -r /home/sergiy/photos root@losst.ru:/root/

Убедитесь, что у исходного каталога нет косой черты, а у каталога назначения она должна обязательно быть. Немного изменив синтаксис с косой чертой можно передать все файлы из каталога на удаленный сервер:

scp -r /home/sergiy/photos/* root@losst.ru:/root/

Если поменять местами локальный путь и сервер, то вы сможете копировать файлы scp c удаленного сервера на локальный компьютер:

scp root@losst.ru:/root/file /home/sergiy/

Таким же самым образом вы можете копирование файлов scp или папок с сервера:

scp -r root@losst.ru:/root/photos /home/sergiy/

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

Чтобы скачать файл scp из одного сервера на другой, просто необходимо указать данные аутентификации на каждом из них. Например, скопируем один файл:

scp root@losst.ru:/home/root/index.html root@losst.ru:/home/root/www/

Скопируем папку с того же удаленного сервера:

scp root@losst.ru:/root/photos root@losst.ru:/home/root/www/

Команды для работы с файлами

ls — просмотр содержимого каталога

Команда выводит перечень видимых файлов и папок: [username@server domains]$ ls
domain.ru site.ru

Чтобы получить полную информацию о содержимом каталога, пригодятся ключи:

  • -l — вывести подробную информацию о файле;
  • -a — отобразить скрытые файлы;
  • -h — отобразить размер файла в удобном формате (по умолчанию выводится в байтах).

[username@server domains]$ ls -lah
итого 16K
drwxr-xr-x. 4 username username 4,0K янв 23 12:11 .
drwx—x—. 4 username service 4,0K дек 25 18:45 ..
drwxr-xr-x. 3 username username 4,0K дек 3 07:01 domain.ru
drwxrwxr-x. 3 username username 4,0K янв 23 12:12 site.ru

pwd — показать полный путь до директории

Команда выводит полный путь до каталога, в котором вы находитесь: [username@server domains]$ pwd
/home/username/domains

cd — переход по директориям

Для перехода между каталогами используйте команду cd. В качестве аргумента укажите путь до папки, куда нужно переместиться: [username@server ~]$ cd domains/domain.ru/public_html/ // Переходим в каталог domains/domain.ru/public_html/ .

// Проверяем:
[username@server public_html]$ pwd // Выводим путь до текущего каталога.
/home/username/domains/domain.ru/public_html // Готово. Переход осуществлен.

Чтобы перейти на уровень вверх относительно текущего каталога, введите cd ..: [username@server public_html]$ cd ..
[username@server domain.ru]$ pwd // Выводим путь до текущего каталога.
/home/username/domains/domain.ru // Мы перешли на уровень выше.

cd — — шаг назад (вернуться к предыдущему каталогу): [username@server domain.ru]$ cd —
/home/username/domains/domain.ru/public_html // Перешли к каталогу public_html, где были ранее.

cd (без параметров) — перейти в домашний каталог: [username@server public_html]$ cd
[username@server ~]$ pwd // Выводим путь до текущего каталога.
/home/username // Вернулись в домашний каталог пользователя username.

mkdir — создание папки

Команда имеет вид: mkdir путь_до_каталога, где «путь_до_каталога» — путь к создаваемой папке, в конце указывается ее имя.

Например: [username@server ~]$ mkdir domains/site.ru/example // Создаем каталог example по пути domains/site.ru/.

Если вы создаете каталог в том же месте, где находитесь, полный путь указывать не нужно: [username@server ~]$ cd domains/site.ru/ // Переходим в каталог site.ru.
[username@server site.ru]$ mkdir example2 // Создаем каталог example2 в текущем каталоге.

// Проверяем:
[username@server site.ru]$ ls // Выводим список файлов.
example2 public_html // Каталог example2 создан.

touch — создание файла

touch создаёт пустой файл с именем и расширением, которое вы укажете, или обновляет дату модификации существующего файла: [username@server domains]$ touch example.txt // Создаем файл example.txt в текущем каталоге.

// Проверяем:
[username@server domains]$ ls // Выводим список файлов.
example.txt // Файл example.txt создан.

rm — удаление папок и файлов

Для удаления файла достаточно указать путь до него: [username@server public_html]$ rm example.txt

Чтобы удалить директорию, используйте ключи -r (рекурсивно) и -f (без подтверждения): [username@server public_html]$ rm -rf example1

Очистить текущий каталог от всех файлов и папок можно с помощью команды: [username@server public_html]$ rm -rf *

cp — копирование файлов/папок

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

Чтобы скопировать папку со всем ее содержимым, укажите ключ -r (рекурсивно): [username@server]$ cp -r /home/username/domains/site.ru/public_html/example /home/username/domains/domain.ru // Копируем папку example из domains/site.ru/public_html в domains/domain.ru.

Если вы находитесь в том же каталоге, где и объект, который нужно скопировать, полный путь до него указывать не нужно: [username@server public_html]$ cp -r example2 /home/username/domains/domain.ru // Копируем папку example2 из domains/site.ru/public_html в domains/domain.ru.

// Проверяем:
[username@server public_html]$ cd /home/username/domains/domain.ru // Переходим в каталог domains/domain.ru.
[username@server domain.ru]$ ls // Выводим список файлов.
example2 public_html // Папка скопирована.

mv — перемещение или переименование файлов и папок

Синтаксис команды mv такой же как, и у cp (копирование). Укажите сначала полный путь до файла, который нужно перенести, а затем путь до каталога, куда будут перемещены данные.

Пример: [username@server domain.ru]$ mv primer.txt /home/username/domains/site.ru/public_html // Переносим файл primer.txt из domains/domain.ru/ в domains/site.ru.

//Проверяем:
[username@server domain.ru]$ ls // Выводим список файлов в каталоге domain.ru.
example2 public_html // Проверяем, что в списке нет файла primer.txt.
[username@server domain.ru]$ cd /home/username/domains/site.ru/public_html // Переходим в каталог domains/site.ru/public_html.
[username@server public_html]$ ls // Выводим список файлов.
primer.txt // Файл перенесен.

Чтобы переименовать файл, введите сначала текущее имя, а затем — новое: [username@server public_html]$ ls // Выводим список файлов в текущем каталоге.
example.txt
[username@server public_html]$ mv example.txt primer.txt // Изменяем имя example.txt на primer.txt.

// Проверяем:
[username@server public_html]$ ls // Выводим список файлов.
primer.txt // Файл переименован.

wget — получение файлов со сторонних сайтов

Скачивайте файлы на ваш аккаунт хостинга со сторонних ресурсов с помощью утилиты wget.

Wget работает с протоколами HTTP, HTTPS и FTP. С ее помощью удобно скачивать архивы, установочные пакеты в нужную директорию на дисковом пространстве аккаунта. Чтобы начать процесс закачки, выполните команду: [username@server ~]$ wget http://domain.ru/archive.zip

scp — передача файлов с компьютера

Команда scp поможет передать файлы с вашего устройства на unix на аккаунт. Заранее устаналивать соединение по SSH для использования этой утилиты не нужно. Выполните команду: [user@mycomputer ~] $ scp /home/user/desktop/file.txt username@domain.ru:domains/domain.ru/public_html Здесь /home/user/desktop/file.txt — путь до файла на копьютере, username@domain.ru — логин аккаунта на хостинге и доменное имя или IP-адрес сервера, domains/domain.ru/public_html — путь до директории, куда нужно загрузить файл.

Чтобы передать каталог, используйте ключ -r (рекурсивно):

[user@mycomputer ~] $ scp -r /home/user/desktop/folder username@domain.ru:domains/domain.ru/public_html

du — получение информации о занятом дисковом пространстве

По умолчанию команда выводит информацию о весе каждого каталога и подкаталога в байтах и пути до них: [username@server domains]$ du
4 ./site.ru/example
4 ./site.ru/public_html
12 ./site.ru
20 ./domain.ru
36 .

Чтобы читать результат работы команды было проще, добавьте ключи:

  • -s — вывести общий объем каталога;
  • -h — отобразить размер файла в удобном формате (Кб, Мб или Гб).

В качестве аргумента укажите символ «*»: команда посчитает размер каждого каталога и файла в директории: [username@server ~]$ du -sh *
70M domains
4,0K example2
4,0K tmp
12K username_wor00.sql.bz2.gz
16K username_wor1.sql

find — поиск файлов/папок

Команда имеет вид: find путь_до_каталога -ключи , где «путь_до_каталога» — папка, с которой начинается поиск.

Рекомендуем ознакомиться с руководством (man) для find, так как она обладает обширным набором ключей. Мы рассмотрим основные:

  • -name — поиск файлов, имена которых соответствуют заданному шаблону;
  • -type — поиск файлов определенного типа:
    • f — обычный файл;
    • d — каталог;
    • l — символическая ссылка.

    Примеры

    Найти все файлы с расширением .php в текущем каталоге (обозначается символом «.») и подкаталогах: [username@server ~]$ find . -name «*.php»

    Найти все файлы с расширением .php, а также файлы, имена которых начинаются с точки в каталоге public_html: [username@server ~]$ find ./public_html -name «*.php» -o -name «.*»

    Найти все каталоги, имена которых начинаются с «w» в текущей папке: [username@server ~]$ find . -name «w*» -type d

    Количество файлов

    С помощью find можно посчитать количество файлов на аккаунте. Выполните команду: [username@server ~]$ find . | wc -l

    grep — поиск файлов по их содержимому

    Команда имеет вид: grep «текст» путь_до_файла, где «текст» — информация, которую нужно найти, «путь_до_файла» — путь к файлу, по которому производится поиск.

    Узнаем с помощью grep, какая база данных используется сайтом: [username@server domain.ru]$ grep «username_» -R // username_ — начало имени базы данных. Замените «username» на логин вашего аккаунта, -R — рекурсивный поиск.
    public_html/example.php:define(‘DB_NAME’, ‘username_wor00’);
    public_html/example.php:define(‘DB_USER’, ‘username_wor00’);

    stat — подробная информация о файле

    Выполните команду stat, чтобы узнать, когда файл был создан и изменялся: [username@server public_html]$ stat example.php
    Файл: «example.php»
    Размер: 3317 // Размер в байтах.
    Inode: 57804829 // Уникальный индексный дескриптор.
    Доступ: (0644/-rw-r—r—) // Права доступа.
    Uid: ( 3645/username) // ID и имя владельца.
    Gid: ( 3646/username) // ID и имя группы владельца.
    Доступ: 2018-01-23 12:03:21.829402333 +0300 // Дата последнего обращения.
    Модифицирован: 2017-12-20 13:34:11.831201546 +0300 // Дата внесения последних изменений в содержимое файла.
    Изменён: 2018-01-23 12:03:41.231474591 +0300 // Дата последнего изменения имени файла или прав доступа.

    ln — создание ссылки на файл

    Чаще всего применяется для создания символических ссылок (ярлыков). Используйте их, если необходимо, например, изменить путь до корневой директории сайта.

    Команда имеет вид: ln -s исходный_файл целевой_файл, где «целевой_файл» будет ссылкой на «исходный_файл». Всегда указывайте полный путь к исходному файлу: [username@server domains]$ ln -s /home/username/domains/domain.ru/public_html/example1 /home/username/domains/site.ru/public_html/example2

    // Проверяем:
    [username@server domains]$ ls -la site.ru/public_html/example2 // Выводим полную информацию о каталоге example2.
    1 username username 53 янв 23 12:14 example1 -> /home/username/domains/domain.ru/public_html/example1

    Для удаления символической ссылки перейдите в каталог, где сохранен «целевой_файл» и удалите созданный ярлык: [username@server public_html]$ cd /home/username/domains/domain.ru/public_html/ // Переходим в каталог, где расположена папка example1.
    [username@server public_html]$ ls -la // Проверяем наличие символической ссылки: выводим полную информацию о каталоге.
    drwxrwxr-x. 2 username username 4096 янв 23 12:08 example1
    lrwxrwxrwx. 1 username username 53 янв 23 12:09 example2 -> /home/username/domains/domain.ru/public_html/example1
    [username@server public_html]$ rm example2 // Удаляем ярлык.
    [username@server public_html]$ ls -la // Еще раз выводим список файлов и проверяем, удалена ли символическая ссылка.
    drwxrwxr-x. 2 username username 4096 янв 23 12:08 example1

    сhmod — изменение прав доступа

    Изменить права на файл или папку можно с помощью команды chmod xxx путь_до_файла , где xxx — права, «путь_до_файла» — путь до папки или файла. Чтобы изменить права и на папку, и на ее содержимое, добавьте ключ -R (рекурсивно).

    Пример

    [username@server domains]$ chmod -R 777 /home/username/example2 // Устанавливаем права 777 для папки example2 и ее содержимого.

    // Проверяем:
    [username@server ~]$ stat example2 // Смотрим статус.
    Файл: «example2»
    Доступ: (0777/drwxrwxrwx) // Права для каталога example2 изменены на 777.
    [username@server ~]$ cd example2/ // Переходим в example2.
    [username@server example2]$ ls // Выводим содержимое каталога.
    copytest.txt example1
    [username@server example2]$ stat copytest.txt // Смотрим статус файла copytest.txt.
    Файл: «copytest.txt»
    Доступ: (0777/-rwxrwxrwx) // Права доступа к файлу изменены на 777.

    mc — Midnight Commander

    Midnight Commander — файловый менеджер с текстовым интерфейсом, встроенный в консоль. Для запуска введите в команду mc.

Adblock
detector