SSH (ч.5): Копирование файлов с помощью scp и sftp

Оглавление

Содержание «Полное руководство по SSH в Linux и Windows»

1. Что такое SSH. Утилиты SSH

2. Настройка сервера OpenSSH

3. Как подключиться к SSH. Настройка клиента OpenSSH

4. Создание и настройка ключей OpenSSH

5. Копирование файлов с помощью scp и sftp

5.1 Копирование с удалённого компьютера и на удалённый компьютер (scp и sftp)

5.2 Как пользоваться утилитой scp

5.2.1 Как скопировать файл с одного удалённого хоста на другой удалённый хост

5.2.2 Как выгрузить на сервер или скачать с сервера папку

5.2.3 Как указать порт для scp

5.2.4 Как использовать другой файл настройки для scp и как указать файл ключей аутентификации

5.2.5 Как ограничить скорость передачи данных в scp

5.2.6 Как сохранить метки времени при передаче по scp

5.2.7 Отключение строгой проверки имён файлов

5.2.8 Тихий режим

5.3 Как пользоваться sftp

5.3.1 Интерактивные команды sftp

5.3.2 Опции sftp

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

6. Подсказки и сложные случаи использования OpenSSH


Копирование с удалённого компьютера и на удалённый компьютер (scp и sftp)

Пакет OpenSSH также включает две программы, которые используют зашифрованный туннель SSH для копирования файлов по сети. Первая программа — scp («безопасное копирование») похожа на программу cp для копирования файлов.

Вторая программа для копирования файлов через SSH — это sftp. Как следует из её имени, она является безопасным заменителем ftp программ. sftp работает как и оригинальная ftp программа. Тем не менее вместо отправки данных в виде простого текста, она использует зашифрованный туннель SSH. Важным преимуществом sftp перед ftp является то, что для неё не требуется запущенный FTP сервер на удалённом хосте. Для неё требуется только SSH сервер. Это означает, что любая удалённая машина, на которой запущен SSH сервер, может также быть использована как FTP-подобный сервер.

Итак, обе команды:

  • работают через SSH соединения
  • передают данные по зашифрованным каналам
  • не требуют специального сервера или программ на удалённой машине кроме SSH сервера
  • используют все возможности SSH, например, аутентификацию по публичному ключу и сжатие передаваемых данных

Различия команд:

  • scp не работает в интерактивном режиме, а sftp умеет работать в интерактивном режиме и в автоматическом
  • в интерактивном режиме sftp поддерживает синтаксис FTP команд для различных действий в файловой системе (копирование и перемещение файлов, создание и удаление файлов и папок и т.д.)
  • sftp умеет дописывать частично переданные файлы, если произошёл обрыв при передаче большого файла (настраивается опцией)
  • sftp поддерживает пакетный режим — файлы, в которых последовательность действий определена последовательностью команд sftp
  • популярные файловые менеджеры понимают протокол sftp и могут интегрироваться с этой командой — подробности ниже
  • при рекурсивном скачивании или закачивании папок, по умолчанию scp следует по символическим ссылкам, а sftp — нет

Как пользоваться утилитой scp

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

scp ОПЦИИ ИСХОДНЫЙ-ФАЙЛ ПУНКТ-НАЗНАЧЕНИЯ

То есть всего имеется три элемента в команде. В качестве ИСХОДНОГО-ФАЙЛА может быть как файл на локальной системе, так и на удалённой. Аналогично, в качестве ПУНКТА-НАЗНАЧЕНИЯ может быть как файл на локальной системе, так и на удалённой.

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

Что касается файла на удалённой системе, то он может быть указан так:

[ПОЛЬЗОВАТЕЛЬ@]ХОСТ:[ПУТЬ_ДО_ФАЙЛА]

Или в виде URI в форме:

scp://[ПОЛЬЗОВАТЕЛЬ@]ХОСТ[:ПОРТ][/ПУТЬ_ДО_ФАЙЛА]

Следовательно, если мы копируем файл с удалённой системы на локальную, общий вид команды такой:

scp [ПОЛЬЗОВАТЕЛЬ@]ХОСТ:[ПУТЬ_ДО_ФАЙЛА] ./ПУТЬ/В/ЛОКАЛЬНОЙ/СИСТЕМЕ

В качестве ./ПУТЬ/В/ЛОКАЛЬНОЙ/СИСТЕМЕ можно указать просто . (точку) и тогда файл будет скопирован с текущим именем в текущий рабочий каталог.

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

scp ./ПУТЬ/В/ЛОКАЛЬНОЙ/СИСТЕМЕ [ПОЛЬЗОВАТЕЛЬ@]ХОСТ:[ПУТЬ_ДО_ФАЙЛА]

Синтаксис обращения к удалённому хосту схож с SSH: ПОЛЬЗОВАТЕЛЬ@ХОСТ, отличие только в том, что после двоеточия указывается путь до файла (или просто имя файла). При использовании URI, после двоеточия указывается порт (если он отличается от стандартного), а путь до файла указывается после слэша.

Рассмотрим пример выполнения команды на удалённой системы и скачаем этот файл на локальную систему:

# удалим файл на локальной машине, если он есть
rm dirlist.txt
# создадим файл на удалённой машине
ssh root@192.168.1.68 'ls > dirlist.txt'
# проверим его наличие
ssh root@192.168.1.68 'ls -l'
# скопируем его на локальную машину
scp root@192.168.1.68:dirlist.txt .
# проверим его содержимое
cat dirlist.txt

В scp команде ИСХОДНЫЙ-ФАЙЛ обозначен как root@192.168.1.68:dirlist.txt — здесь до двоеточия идёт имя пользователя на удалённой системе и адрес хоста — та информация, которая необходима для подключения по SSH. Затем двоеточием отделён файл, который должен быть скачен.

ПУНКТ-НАЗНАЧЕНИЯ в этой команде обозначен как . (точка) — что означает текущую рабочую директорию (в локальной системе).

Теперь рассмотрим пример копирования файла с локальной машины на удалённую:

# создаём новый файл
touch nfile.txt
# отправляем файл
scp nfile.txt root@192.168.1.68:.
# проверяем наличие файла на удалённой машине
ssh root@192.168.1.68 'ls -l'

В команде отправки scp:

  • nfile.txt — имя файла,
  • root@192.168.1.68 — имя пользователя и удалённый хост (как в команде подключения по SSH),
  • . (точка) означает, что файл нужно скопировать в текущую рабочую директорию на удалённом сервере, при этом имя файла останется прежним, т. е. nfile.txt

Как скопировать файл с одного удалённого хоста на другой удалённый хост

Программа scp умеет копировать между двумя удалёнными хостами. Если используется URI формат, порт можно указать только для цели если используется опция -3.

По умолчанию данные копируются напрямую между двумя удалёнными хостами. Если указать опцию -3, то данные между двумя хостами будут переданы через локальный хост. Эта опция отключает шкалу прогресса.

Как выгрузить на сервер или скачать с сервера папку

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

Как указать порт для scp

Указать другой порт, отличный от стандартного 22, можно с помощью опции -P ПОРТ. Обратите внимание, что эта опция написана заглавной ‘P’, поскольку -p уже занята для другой настройки (сохраняет время и режимы файла).

Как использовать другой файл настройки для scp и как указать файл ключей аутентификации

Программа scp работает вместе с ssh, то есть подключение происходит с помощью ssh и применяются все настройки этой программы. У ssh есть свои настройки по умолчанию, а также она считывает информацию из своих конфигурационных файлов. При желании, можно указать другой файл для использования, это делается опцией -F — она задаёт альтернативный конфигурационный файл пользователя для ssh. Эта опция напрямую передаётся в ssh.

Если настроен вход без пароля (по ключу), то программа ssh считывает приватный ключ в соответствии со своими настройками или из пути по умолчанию. С помощью опции -i можно выбрать другой файл с идентификатором (приватный ключ) для аутентификации по публичному ключу на сервере. Эта опция также напрямую передаётся в ssh.

Как ограничить скорость передачи данных в scp

По умолчанию передача файла происходит на максимально возможной скорости. Если по каким-то причинам нужно уменьшить лимит скорости, то используйте опцию -l, после которой укажите значение в Kbit/s.

Как сохранить метки времени при передаче по scp

С помощью опции -p (не путайте её с опцией -P, которая изменяет порт подключения) можно сохранить время модификации, время последнего доступа к файлу и режимы оригинального файла. Дополнительно о метках времени смотрите в статье «Время создания, доступа и изменения файла: что это, как их узнать и изменить. Как найти файлы по их времени создания, изменения или последнему открытию».

Отключение строгой проверки имён файлов

Опция -T отключает строгую проверку имени файла. По умолчанию при копировании файлов с удалённого хоста в локальный каталог scp проверяет, соответствуют ли полученные имена файлов тем, которые запрашиваются в командной строке, чтобы предотвратить отправку удаленным хостом неожиданных или нежелательных файлов. Из-за различий в том, как различные операционные системы и оболочки интерпретируют подстановочные символы имени файла, эти проверки могут привести к отклонению нужных файлов. Эта опция отключает эти проверки за счёт полного доверия, что сервер не будет отправлять неожиданные имена файлов.

Тихий режим

Опция -q включает тихий режим: отключает шкалу прогресса, а также предупреждения и диагностические сообщения от ssh.

Как пользоваться sftp

Адресат может быть указан как [ПОЛЬЗОВАТЕЛЬ@]ХОСТ[:ПУТЬ] или как URI в форме sftp://[ПОЛЬЗОВАТЕЛЬ@]ХОСТ[:ПОРТ][/ПУТЬ]

Если место назначения содержит ПУТЬ, который не является каталогом, sftp автоматически получит файлы, если используется неинтерактивный метод аутентификации; в противном случае это будет сделано после успешной интерактивной аутентификации.

Если путь не указан или путь является каталогом, sftp войдёт в систему на указанном хосте и перейдёт в интерактивный командный режим, зайдя в удалённый каталог, если он был указан. Дополнительная конечная косая черта может использоваться, чтобы принудительно интерпретировать путь как каталог.

Вот пример сессии:

sftp root@192.168.1.68

Connected to root@192.168.1.68.
sftp> ls
bin                                     dirlist.txt                             
go                                      nfile.txt                               
results                                 Видео                              
Документы                      Загрузки                        
Изображения                  Музыка                            
Общедоступные              Рабочий стол                 
Шаблоны    
sftp> lls
dirlist.txt  nfile.txt
sftp> ls temp
temp/TakeMeHome
sftp> cd temp/
sftp> get TakeMeHome
Fetching /root/temp/TakeMeHome to TakeMeHome
sftp> bye

Интерактивные команды sftp

При входе в интерактивный режим, sftp понимает набор команд, схожих с командами для ftp(1). Команды не чувствительны к регистру. Пути и имена файлов, которые содержат пробелы, должны быть заключены в кавычки.

Любые специальные символы, содержащиеся внутри имён путей, которые распознаются в glob(3), должны быть экранированы обратным слэшом (‘\’).

bye

Выйти из sftp.

cd [ПУТЬ]


Изменить удалённую директорию на ПУТЬ. Если ПУТЬ не указан, то директория будет сменена на ту, с которой началась текущая сессия.

chgrp [-h] ГРУППА ПУТЬ

Изменить группу файлов ПУТЬ на ГРУППА. Если указан флаг -h, тогда не будет производиться переход по символическим ссылкам. Пути могут содержать подстановочные символы (glob) и могут соответствовать нескольким файлам. ГРУППА должна быть числовым GID.

chmod [-h] РЕЖИМ ПУТЬ

Изменить права доступа ПУТЬ на РЕЖИМ. Если указан флаг -h, то не будет производиться переход по символическим ссылкам, пути могут содержать подстановочные символы (glob) и могут совпадать с несколькими файлами.

chown [-h] ВЛАДЕЛЕЦ ПУТЬ

Изменяет владельца файла ПУТЬ на ВЛАДЕЛЕЦ. Если указан флаг -h, то не будет производиться переход по символическим ссылкам, пути могут содержать подстановочные символы (glob) и могут совпадать с несколькими файлами. ВЛАДЕЛЕЦ должен быть указан цифровым UID.

df [-hi] [path]

Показать информацию об использовании для файловой системы, содержащей текущий каталог (или путь, если указан). Если указан флаг -h, информация о ёмкости будет отображаться с использованием «удобочитаемых» суффиксов. Флаг -i запрашивает отображение информации об узле в дополнение к информации о ёмкости. Эта команда поддерживается только на серверах, которые реализуют расширение «statvfs@openssh.com».

exit

Выйти из sftp.

get [-afPpr] УДАЛЁННЫЙ-ПУТЬ [ЛОКАЛЬНЫЙ-ПУТЬ]

Получает УДАЛЁННЫЙ-ПУТЬ и сохраняет этот файл на локальной машине. Если имя ЛОКАЛЬНЫЙ-ПУТЬ не указано, то файлу сохраняется его прежнее имя, которое он имел на удалённой машине. УДАЛЁННЫЙ-ПУТЬ может содержать подстановочные символы (glob) и может совпадать с несколькими файлами. Если это так и указан ЛОКАЛЬНЫЙ-ПУТЬ, то ЛОКАЛЬНЫЙ-ПУТЬ должен быть директорией.

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

Если указан флаг -f, тогда после завершения передачи файла будет вызвана fsync(2) для записи файла на диск (flush the file to disk) — имеется ввиду, что файл не просто будет помещён в кэш и поставлен в очередь на запись, а действительно в этот момент будет записан на физический диск.

Если указан флаг -P или флаг -p, тогда также полностью будут скопированы права доступа к файлу и метки времени.

Если указан флаг -r, тогда директории будут скопированы рекурсивно. Обратите внимание, что sftp не следует по символическим ссылкам, когда выполняет рекурсивную передачу файлов.

help

Показывает текст помощи по использованию программой.

lcd [ПУТЬ]

Меняет рабочую директорию на локальной машине (а не на удалённой!) на ПУТЬ. Если ПУТЬ не указан, то меняет директорию на домашнюю папку локального пользователя.

lls [ОПЦИИ-ls [ПУТЬ]]

Показывает листинг локальной директории указанную как ПУТЬ или текущей рабочей директории, если ПУТЬ не указан. ОПЦИИ-ls могут содержать любые флаги, которые поддерживаются командой ls на локальной системе. ПУТЬ может содержать подстановочные символы (glob) и может соответствовать нескольким файлам.

lmkdir ПУТЬ

Создаёт директорию ПУТЬ на локальной системе.

ln [-s] СТАРЫЙ-ПУТЬ НОВЫЙ-ПУТЬ

Создаёт ссылку из СТАРЫЙ-ПУТЬ в НОВЫЙ-ПУТЬ. Если указан флаг -s, создаваемая ссылка будет символической, в противном случае будет жёсткой ссылкой.

lpwd

Печатает текущую рабочую директорию на локальной машине.

ls [-1afhlnrSt] [ПУТЬ]

Показывает список файлов удалённой директории указанного ПУТИ или текущей директории, если ПУТЬ не установлен. ПУТЬ может содержать подстановочные символы (glob) и может совпадать с несколькими файлами.

Следующие флаги распознаются командой ls и соответственно меняют её поведение:

-1

Информация выводится в один столбик.

-a

Добавляет в список файлы, которые начинаются на точку (‘.’).

-f

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

-h

Когда используется с опцией длинного формата, использует суффиксы единиц: Байт, Килобайт, Мегабайт, Гигабайт, Терабайт, Петабайт и Эксабайт чтобы уменьшить количество цифр до четырёх или менее, используя ступени 2 для размеров (K=1024, M=1048576 и т.д.).

-l

Показывает дополнительные подробности, включая информацию о разрешениях и владельце.

-n

Создаёт длинный список с информацией о пользователях и группах в числовом формате.

-r

Обратный порядок сортировки списка.

-S

Сортирует список по размеру файла.

-t

Сортирует список по времени последней модификации.

lumask umask

Устанавливает локальную umask на umask.

mkdir ПУТЬ

Создаёт удалённую директорию, определённую как ПУТЬ.

progress

Переключает отображение индикатора прогресса.

put [-afPpr] ЛОКАЛЬНЫЙ-ПУТЬ [УДАЛЁННЫЙ-ПУТЬ]

Выгружает ЛОКАЛЬНЫЙ-ПУТЬ сохраняет на удалённой машине. Если имя УДАЛЁННЫЙ-ПУТЬ не указано, то файлам даётся такое же имя, как и на локальной машине. ЛОКАЛЬНЫЙ-ПУТЬ может содержать подстановочные символы (glob) и может совпадать с несколькими файлами. Если это так и указан УДАЛЁННЫЙ-ПУТЬ, то УДАЛЁННЫЙ-ПУТЬ должен быть директорией.

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

Если указан флаг -f, тогда после завершения передачи файла будет вызвана fsync(2) для записи файла на диск (flush the file to disk) — имеется ввиду, что файл не просто будет помещён в кэш и поставлен в очередь на запись, а действительно в этот момент будет записан на физический диск. Обратите внимание, что это поддерживается только серверами, где реализовано расширение "fsync@openssh.com".

Если указан флаг -P или флаг -p, тогда также полностью будут скопированы права доступа к файлу и метки времени.

Если указан флаг -r, тогда директории будут скопированы рекурсивно. Обратите внимание, что sftp не следует по символическим ссылкам, когда выполняет рекурсивную передачу файлов.

pwd

Показать удалённую рабочую директорию.

quit

Выйти из sftp.

reget [-Ppr] УДАЛЁННЫЙ-ПУТЬ [ЛОКАЛЬНЫЙ-ПУТЬ]

Возобновить загрузку УДАЛЁННЫЙ-ПУТЬ. Эквивалент команды get с установленным флагом -a.

reput [-Ppr] [ЛОКАЛЬНЫЙ-ПУТЬ] УДАЛЁННЫЙ-ПУТЬ

Возобновить выгрузку [ЛОКАЛЬНЫЙ-ПУТЬ]. Эквивалент команды put с установленным флагом -a.

rename СТАРЫЙ-ПУТЬ НОВЫЙ-ПУТЬ

Переименовать удалённый файл со СТАРЫЙ-ПУТЬ на НОВЫЙ-ПУТЬ.

rm ПУТЬ

Удалить удалённый файл указанный как ПУТЬ.

rmdir ПУТЬ

Удалить удалённую директорию указанную как ПУТЬ.

symlink СТАРЫЙ-ПУТЬ НОВЫЙ-ПУТЬ

Создать символическую ссылку из СТАРЫЙ-ПУТЬ в НОВЫЙ-ПУТЬ.

version

Показать версию sftp протокола.

!КОМАНДА

Выполнить КОМАНДУ в локальном шелле.

!

Символ экранирования для передачи в локальную оболочку.

?

Синоним для help.

Опции sftp

Следующие опции указываются в строке команды запуска клиента sftp. Они оказывают влияние как на запущенный sftp в интерактивной сессии, так и без интерактивного режима.

-a

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

-B РАЗМЕР_БУФЕРА

Устанавливает размер буфера, который использует sftp при передаче файлов. Большие буферы требуют меньше циклов обработки за счёт более высокого потребления памяти. Значение по умолчанию равно 32768 байтам.

-b ПАКЕТНЫЙ_ФАЙЛ

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

ПАКЕТНЫЙ_ФАЙЛ в виде ‘-’ может использоваться для обозначения стандартного ввода. Работа sftp будет прекращена, если какая-либо из следующих команд потерпит неудачу: get, put, reget, reput, rename, ln, rm, mkdir, chdir, ls, lchdir, chmod, chown, chgrp, lpwd, df, symlink и lmkdir.

Завершение в случае ошибки может быть подавлено для каждой команды в отдельности путём добавления к команде префикса с символом «-» (например, -rm /tmp/blah*). Вывод команд может быть подавлен, если перед ней поставить символ ‘@’. Эти два префикса могут сочетаться в любом порядке, например, -@ls /bsd.

-C

Включить сжатие (через флаг -C в ssh).

-D sftp_server_path

Подключиться напрямую к локальному sftp серверу (а не через ssh). Эта опция может быть полезной при отладке клиента и сервера.

-F КОНФИГУРАЦИЯ_SSH

Указывает альтернативный пользовательский конфигурационный файл для ssh. Эта опция напрямую отправляется в ssh.

-f

Требует, чтобы файлы были записаны на диск сразу после передачи. При загрузке файлов эта функция включается только в том случае, если на сервере реализовано расширение «fsync@openssh.com».

-i ФАЙЛ_ИДЕНТИФИКАЦИИ

Выбирает файл, из которого читается идентификатор (закрытый ключ) для аутентификации с открытым ключом. Эта опция напрямую передаётся в ssh.

-l ЛИМИТ

Ограничивает используемую пропускную способность, указанную в Кбит/с.

-P ПОРТ

Указывает порт для подключения на удаленном хосте.

-p

Сохраняет время модификации, время доступа и режимы из исходных переданных файлов.

-q

Тихий режим: отключает индикатор хода выполнения, а также предупреждающие и диагностические сообщения от ssh.

-R КОЛИЧЕСТВО_ЗАПРОСОВ

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

-r

Рекурсивно копировать целые каталоги при загрузке и скачивании. Обратите внимание, что sftp не следует по символическим ссылкам, встречающимся в обходе дерева.

-v

Поднимите уровень вербальности. Эта опция также передаётся в ssh.

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

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

Рекомендуется Вам:

Добавить комментарий

Ваш e-mail не будет опубликован.