Передача файлов в 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, которая поможет скопировать файлы с компьютера на удаленный сервер либо перенести их между удаленными серверами. Используйте опции и не забывайте проверять пути, чтобы случайно не перезаписать важные файлы.
Графический интерфейс 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.