Php копирование файлов по ssh

Обновлено: 07.07.2024

В статье мы расскажем, как копировать файлы в Windows и Linux-системах, и покажем основные команды, с помощью которых происходит передача файлов по SSH.

В Linux и Windows-системах используют разные инструменты для копирования файлов по SSH.

В Linux для копирования данных по протоколу SSH используется утилита scp (Secure CoPy). Она входит в состав OpenSSH, поэтому для работы с утилитой устанавливать дополнительное ПО не нужно.

В Windows для загрузки файлов по SSH используется утилита pscp.exe. Её функционал схож с scp. Утилита входит в состав программы Putty (SSH-клиент для Windows). Putty не входит в стандартный набор Windows-программ, поэтому её нужно будет скачать с официального сайта.

Обратите внимание! Если файл, который вы хотите скопировать, уже существует на целевом хосте, при копировании он будет перезаписан.

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

Как скачать файл с сервера через SSH? На Linux копирование файлов по SSH делается с помощью команды scp. Команда может копировать файлы как с локального компьютера на удалённый сервер, так и с удалённого сервера на локальный компьютер.

Обратите внимание! Для подключения к удалённому серверу вам понадобится логин и пароль.

В общем виде команда выглядит так:

Как скопировать файл по SSH с локальной машины на удалённый сервер

Как загрузить файл на сервер по SSH? Для этой операции используется команда вида:

Например, команда может выглядеть так:

То есть файл test.txt будет скопирован на хост 123.123.123.123 в директорию «/directory».

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

При подключённом SSH скачать файл на локальный компьютер с удалённого сервера можно с помощью команды:

То есть файл test.txt будет загружен с сервера 123.123.123.123 на локальный компьютер в папку “/directory”.

Как скачать папку со всеми файлами и подпапками

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

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

Если не указывать порт, команда подключается к серверу по стандартному 22 порту. Но бывает, что для подключения по SSH нужно указать нестандартный порт. Чтобы это сделать, введите команду с ключём -P:

Установление соединения

Давайте начнем с подключения к службе SSH. Установление соединения выглядит просто:

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

Если при аутентификации вы используете имя пользователя или пароль, открытый или закрытый ключ, функции ssh2_auth_password () и ssh2_auth_pubkey_file () возвращают логическое значение, указывающее на то, была ли осуществлена проверка подлинности успешно.

Выполнение основных команд

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

При копировании файла на удаленный сервер с помощью дополнительного параметра в функции ssh2_scp_send () можно установить права доступа.
Большей функциональности можно добиться с использованием функции SFTP. Вы можете изменять права к файлу или директории, получать информацию о файле, создавать каталоги, переименовывать элементы, удалять элементы и т.д. Функция SFTP очень похожа на SCP, но дополнительное подключение через ssh2_sftp () должно быть сделано до начала использования функции:

Посредством ssh2_sftp () устанавливается подключение к ресурсу, и затем все операции проходят через SFTP-соединение, которое использует вызовы различных ssh2_sftp_* функций. Вызов функции возвращает логическое значение, что позволяет определить, было ли действие успешным.

Использование функции-оболочки

Когда определенной функции управления файлами для SFTP или SCP-протокола не существует, на помощь приходит оболочка. Ниже приведено несколько примеров:

Перед выполнением любой из этих операций соединение с сервером SSH и SFTP должно быть установлено, так как используется ранее созданная переменная $sftp.

Собираем все вместе

Теперь, когда вы научились подключаться, проверять аутентификацию и выполнять команды на сервере SSH, мы можем создать несколько вспомогательных классов для упрощения процесса выполнения этих команд: один — для выполнения SCP вызовов, один — для вызовов SFTP, родительский класс для общей функциональности и пару классов для инкапсуляции идентификационной информации (паролей и ключей).
Давайте создадим класс аутентификации первым, так как он будет использоваться другими классами:

SSH2Password и SSH2Key просто оборачивают соответствующие им данные аутентификации. Они имеют общий базовый класс, поэтому мы можем воспользоваться PHP для перехода от источника к получателю.
Двигаемся дальше. Давайте создадим протокол SSH2 для подключения и аутентификации на SSH сервере.

Будет создан очень простой SCP-класс, который расширяет функционал SSH2 и использует метод __call(). Это позволяет нам сделать две важные вещи: автоматически предварять «ssh_scp_» при вызове функции и поддерживать связь с переменной.

Класс SFTP схож в плане конструкции, хотя и перегружен вызовом функции ssh2_sftp (). Результаты будут храниться в защищенной переменной и автоматически добавляться ко всем вызовам SFTP-функции.

Эти классы могут быть использованы для вызова SCP- и SFTP-функций. Благодаря полезному методу __call в обоих классах нет необходимости заново открывать соединение или повторно вводить «ssh2_scp_» либо «ssh2_ftp_» при каждом вызове.

Заключение

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

Должен признаться, когда впервые увидел академическое определение принципа открытости/закрытости, его смысл был для меня удивительно ясен. Я отбросил из определения…

Среди программистов (включая и меня, так что здесь я публично признаю свою вину) бытует мнение о том, что Инверсия Управления…


Практические примеры SSH, которые выведут на новый уровень ваши навыки удалённого системного администратора. Команды и советы помогут не только использовать SSH , но и более грамотно перемещаться по сети.

Знание нескольких трюков ssh полезно любому системному администратору, сетевому инженеру или специалисту по безопасности.

Практические примеры SSH

Разбор командной строки SSH

В следующем примере используются обычные параметры, часто встречающиеся при подключении к удалённому серверу SSH .

  • -v : вывод отладочной информации особенно полезен при анализе проблем аутентификации. Можно использовать несколько раз для вывода дополнительной информации.
  • - p 22 : порт для подключения к удалённому серверу SSH. 22 не обязательно указывать, потому что это значение по умолчанию, но если протокол на каком-то другом порту, то указываем его с помощью параметра -p . Порт прослушивания указывается в файле sshd_config в формате Port 2222 .
  • -C : сжатие для соединения. Если у вас медленный канал или вы просматриваете много текста, это может ускорить связь.
  • neo@ : строка перед символом @ обозначает имя пользователя для аутентификации на удалённом сервере. Если не указать его, то по умолчанию будет использоваться имя пользователя учётной записи, в которую вы вошли в данный момент (

Использование файла конфигурации


Хотя многие знакомы с файлом sshd_config , есть ещё файл конфигурации клиента для команды ssh . Значение по умолчанию

/.ssh/config , но его можно определить как параметр для опции -F .


В приведённом выше примерном файле конфигурации ssh две записи хоста. Первая обозначает все хосты, для всех применяется параметр конфигурации Port 2222. Вторая говорит, что для хоста remoteserver следует использовать другое имя пользователя, порт, FQDN и IdentityFile.

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

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

SSH-клиент поставляется с двумя другими очень удобными инструментами для копирования файлов по зашифрованному ssh-соединению. Ниже см. пример стандартного использования команд scp и sftp. Обратите внимание, что многие параметры для ssh применяются и в этих командах.


В этом примере файл mypic.jpg скопирован на remoteserver в папку /media/data и переименован в mypic_2.jpg.

Не забывайте о разнице в параметре порта. На этом попадаются многие, кто запускает scp из командной строки. Здесь параметр порта -P , а не -p , как в ssh-клиенте! Вы забудете, но не волнуйтесь, все забывают.

Для тех, кто знаком с консольным ftp , многие из команд похожи в sftp . Вы можете сделать push, put и ls, как сердце пожелает.

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

1. SSH socks-прокси

Функция SSH Proxy под номером 1 по уважительной причине. Она более мощная, чем многие предполагают, и даёт вам доступ к любой системе, к которой имеет доступ удалённый сервер, используя практически любое приложение. Клиент ssh может туннелировать трафик через прокси-сервер SOCKS одной простой командой. Важно понимать, что трафик к удалённым системам будет исходить от удалённого сервера, так будет указано в логах веб-сервера.


Здесь мы запускаем socks-прокси на TCP-порту 8888, вторая команда проверяет, что порт активен в режиме прослушивания. 127.0.0.1 указывает, что служба работает только на localhost. Мы можем применить немного другую команду для прослушивания всех интерфейсов, включая ethernet или wifi, это позволит другим приложениям (браузерам и т д.) в нашей сети подключаться к прокси-сервису через ssh socks-прокси.


Теперь можем настроить браузер для подключения к socks-прокси. В Firefox выберите Настройки | Основные | Параметры сети. Укажите IP-адрес и порт для подключения.


Обратите внимание на опцию в нижней части формы, чтобы DNS-запросы браузера тоже шли через прокси SOCKS. Если используете прокси-сервер для шифрования веб-трафика в локальной сети, то наверняка захотите выбрать эту опцию, чтобы DNS-запросы туннелировались через SSH-соединение.

Активация socks-прокси в Chrome

Запуск Chrome с определёнными параметрами командной строки активирует socks-прокси, а также туннелирование DNS-запросов из браузера. Доверяй, но проверяй. Используйте tcpdump для проверки, что DNS-запросы больше не видны.

Использование других приложений с прокси

Имейте в виду, что многие другие приложения тоже могут использовать socks-прокси. Веб-браузер просто самое популярное из них. У некоторых приложений есть параметры конфигурации для активации прокси-сервера. Другим нужно немного помочь вспомогательной программой. Например, proxychains позволяет запустить через socks-прокси Microsoft RDP и др.


Параметры конфигурации socks-прокси задаются в файле конфигурации proxychains.

Подсказка: если используете удалённый рабочий стол из Linux на Windows? Попробуйте клиент FreeRDP. Это более современная реализация, чем rdesktop , с гораздо более плавным взаимодействием.

Вариант использования SSH через socks-прокси

Вы сидите в кафе или гостинице — и вынуждены использовать довольно ненадёжный WiFi. С ноутбука локально запускаем ssh-прокси и устанавливаем ssh-туннель в домашнюю сеть на локальный Rasberry Pi. Используя браузер или другие приложения, настроенные для socks-прокси, мы можем получить доступ к любым сетевым службам в нашей домашней сети или выйти в интернет через домашнее подключение. Всё между вашим ноутбуком и домашним сервером (через Wi-Fi и интернет до дома) зашифровано в туннеле SSH.

2. Туннель SSH (переадресация портов)

В простейшей форме SSH-туннель просто открывает порт в вашей локальной системе, который подключается к другому порту на другом конце туннеля.


Разберём параметр -L . Его можно представить как локальную сторону прослушивания. Таким образом, в примере выше порт 9999 прослушивается на стороне localhost и переадресуется через порт 80 на remoteserver. Обратите внимание, что 127.0.0.1 относится к localhost на удалённом сервере!

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


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

3. SSH-туннель на сторонний хост

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


В данном примере мы перенаправляем туннель от remoteserver к веб-серверу, работающему на 10.10.10.10. Трафик с remoteserver к 10.10.10.10 уже не в SSH-туннеле. Веб-сервер на 10.10.10.10 будет считать remoteserver источником веб-запросов.

4. Обратный SSH-туннель

Здесь настроим прослушивающий порт на удалённом сервере, который будет подключаться обратно к локальному порту на нашем localhost (или другой системе).


В этой SSH-сессии устанавливается соединение с порта 1999 на remoteserver к порту 902 на нашем локальном клиенте.

5. Обратный прокси SSH

В этом случае мы устанавливаем socks-прокси на нашем ssh-соединении, однако прокси слушает на удалённом конце сервера. Подключения к этому удалённому прокси теперь появляются из туннеля как трафик с нашего localhost.

Устранение проблем с удалёнными SSH-туннелями

Если у вас возникли проблемы с работой удалённых опций SSH, проверьте с помощью netstat , к каким ещё интерфейсам подключён порт прослушивания. Хотя мы в примерах указали 0.0.0.0, но если значение GatewayPorts в sshd_config установлено в значение no, то листенер будет привязан только к localhost (127.0.0.1).

Предупреждение безопасности


Обратите внимание, что при открытии туннелей и socks-прокси внутренние сетевые ресурсы могут быть доступны ненадёжным сетям (например, интернету!). Это может быть серьёзной угрозой безопасности, поэтому убедитесь, что вы понимаете, что представляет собой слушатель и к чему у него есть доступ.

6. Установка VPN по SSH

Общий термин среди спецов по методам атаки (пентестеры и проч.) — это «точка опоры в сети». После установления соединения в одной системе эта система становится шлюзом для дальнейшего доступа к сети. Точка опоры, которая позволяет двигаться вширь.

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

Метод использует ssh , iptables , tun interfaces и маршрутизацию.

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


Затем установим ssh-соединение, используя параметр, который запрашивает инициализацию tun-устройств.

Сторона клиента SSH:


Сторона сервера SSH:


Теперь у нас прямой маршрут к другому хосту ( route -n и ping 10.10.10.10 ).

Можно маршрутизировать любую подсеть через хост на другой стороне.


На удалённой стороне необходимо включить ip_forward и iptables .


Бум! VPN через туннель SSH на сетевом уровне 3. Вот это уже победа.

Если возникают какие-то проблемы, используйте tcpdump и ping , чтобы установить причину. Поскольку мы играем на уровне 3, то наши пакеты icmp пойдут через этот туннель.

7. Копирование ключа SSH (ssh-copy-id)


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

/.ssh/id_rsa.pub (или ключ по умолчанию) с вашей системы в

/.ssh/authorized_keys на удалённом сервере.

8. Удалённое выполнение команд (неинтерактивно)

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


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

Другой пример выполняет ту же самую функцию, что и ssh-copy-id из примера 7.

9. Удалённый перехват пакетов и просмотр в Wireshark

Я взял один из наших примеров по tcpdump. Используйте его для удалённого перехвата пакетов с выдачей результата непосредственно в GUI локального Wireshark.

10. Копирование локальной папки на удалённый сервер по SSH

Красивый трюк, который сжимает папку с помощью bzip2 (это параметр -j в команде tar ), а затем извлекает поток bzip2 на другой стороне, создавая на удалённом сервере дубликат папки.

11. Удалённые приложения GUI с переадресацией SSH X11

Если на клиенте и удалённом сервере установлены «иксы», то можно удалённо выполнить команду GUI, с окном на вашем локальном рабочем столе. Эта функция существует давным давно, но по-прежнему очень полезна. Запустите удалённый веб-браузер или даже консоль VMWawre Workstation, как я делаю в этом примере.


Требуется строка X11Forwarding yes в файле sshd_config .

12. Удалённое копирование файлов с помощью rsync и SSH

rsync во многом удобнее scp , если требуется периодическое резервное копирование каталога, большого количества файлов или очень больших файлов. Здесь есть функция восстановления после сбоя передачи и копирования только изменённых файлов, что сохраняет трафик и время.

В этом примере используется сжатие gzip (-z) и режим архивирования (-a), который включает рекурсивное копирование.

13. SSH через сеть Tor

Анонимная сеть Tor может туннелировать SSH-трафик с помощью команды torsocks . Следующая команда прокинет ssh-прокси через Tor.


Torsocks будет использовать для прокси порт 9050 на localhost. Как всегда при использовании Tor необходимо серьёзно проверять, какой трафик туннелируется и другие проблемы операционной безопасности (opsec). Куда идут ваши DNS-запросы?

14. SSH к инстансу EC2


Для подключения к инстансу EC2 необходим закрытый ключ. Скачайте его (расширение .pem) из панели управления Amazon EC2 и измените разрешения ( chmod 400 my-ec2-ssh-key.pem ). Храните ключ в надёжном месте или поместите его в свою папку


Параметр -i просто указывает ssh-клиенту использовать этот ключ. Файл

/.ssh/config идеально подходит для автоматической настройки использования ключа при подключении к хосту ec2.

15. Редактирование текстовых файлов с помощью VIM через ssh/scp

Для всех любителей vim этот совет сэкономит немного времени. С помощью vim файлы редактируются по scp одной командой. Этот метод просто создаёт файл локально в /tmp , а затем копирует его обратно, как только мы его сохранили из vim .


Примечание: формат немного отличается от обычного scp . После хоста у нас двойной // . Это ссылка на абсолютный путь. Один слэш будет означать путь относительно домашней папки users .


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

16. Монтирование удалённого SSH как локальной папки с SSHFS

При помощи sshfs — клиента файловой системы ssh — мы можем подключить локальный каталог к удалённому местоположению со всеми взаимодействиями файлов в зашифрованном сеансе ssh .


На Ubuntu и Debian установим пакет sshfs , а затем просто приимонтируем удалённое расположение к нашей системе.

17. Мультиплексирование SSH с помощью ControlPath

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


ControlPath указывает сокет для проверки новыми соединениями на предмет наличия активной сессии ssh . Последняя опция означает, что даже после выхода из консоли существующий сеанс останется открытым 10 минут, так что в течение этого времени вы сможете повторно подключиться по существующему сокету. Для дополнительной информации смотрите справку ssh_config man .

18. Потоковое видео по SSH с помощью VLC и SFTP

Даже давние пользователи ssh и vlc (Video Lan Client) не всегда знают об этой удобной опции, когда очень нужно посмотреть видео по сети. В настройках File | Open Network Stream программы vlc можно ввести местоположение как sftp:// . Если требуется пароль, появится запрос.

19. Двухфакторная аутентификация

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

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

20. Прыжки по хостам с ssh и -J

Если из-за сегментации сети приходится переходить через несколько хостов ssh, чтобы добраться до конечной сети назначения, вам сэкономит время ярлык -J.


Здесь главное понимать, что это не аналогично команде ssh host1 , затем user@host1:

$ ssh host2 и т. д. Параметр -J хитро использует переадресацию, чтобы localhost устанавливал сеанс со следующим хостом в цепочке. Таким образом, в приведённом выше примере наш localhost аутентифицируется на host4. То есть используются наши ключи localhost, а сеанс от localhost до host4 полностью зашифрован.

Для такой возможности в ssh_config укажите опцию конфигурации ProxyJump. Если регулярно приходится переходить через несколько хостов, то автоматизация через конфиг сэкономит массу времени.

21. Блокировка попыток брутфорса SSH с помощью iptables

С помощью iptables тоже можно легко блокировать попытки подключения к порту по достижении определённого порога. Простой способ сделать это — использовать OSSEC, поскольку он не только блокирует SSH, но выполняет кучу других мер по обнаружению вторжений на базе имени хоста (HIDS).

22. SSH Escape для изменения переадресации портов

Нажав enter , попробуйте ввести в консоли

C . Это управляющая последовательность в сессии, позволяющая вносить изменения в существующее соединение.


Здесь вы можете увидеть, что мы переадресовали наш локальный порт 1445 на хост Windows 2003, который нашли во внутренней сети. Теперь просто запустите msfconsole , и можно идти дальше (предполагая, что вы планируете использовать этот хост).

Эти примеры, советы и команды ssh должны дать отправную точку; дополнительная информация о каждой из команд и возможностей доступна на справочных страницах ( man ssh , man ssh_config , man sshd_config ).

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

Этичный хакинг и тестирование на проникновение, информационная безопасность

Оглавление

Копирование с удалённого компьютера и на удалённый компьютер (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:

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

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

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

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

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

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

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

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

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


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

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

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


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

Тихий режим

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

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

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

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

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


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

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

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

bye

cd [ПУТЬ]

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

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

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

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

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

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

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

df [-hi] [path]

exit

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

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

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

pwd

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

quit

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

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

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

-l ЛИМИТ

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

-P ПОРТ

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

-p

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

-q

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

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

-r

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

-v

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

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

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

Читайте также: