Инструменты для монтирования файловой системы по SSH
Если вам приходится работать на удаленных серверах, то предлагаю вашему вниманию обзор инструментов для различных ОС, которые помогут упростить работу с файлами.
В веб-разработке это требуется довольно часто. Иногда требуется просто скачивать/закачивать файлы на удаленный сервер, а иногда еще и выполнять какие-то команды.
Немного теории об SSH, FTP и SFTP
Для соединения с удаленными серверами и управления ими существует протокол — SSH, но не все знают, что у этого протокола есть расширение для передачи файлов. Да, да, по SSH можно передавать файлы прямо как с помощью старого доброго FTP, только гораздо надежнее!
Это расширение называется SFTP (не путать с FTPS, это разные вещи) и работает оно поверх SSH соединения. При этом на сервере не требуется устанавливать и настраивать дополнительное ПО для организации передачи файлов, как это было в случае с FTP. Настройки по умолчанию при установке SSH сервера (пакет openssh-server ) вполне рабочие. В качестве пользователей используются пользователи ОС.
Впрочем, если требуются сложные схемы доступа, то без настроек, конечно, не обойтись, но в рамках этой статьи установку и настройку SSH мы рассматривать не будем, а сосредоточимся на клиентском ПО для SFTP соединений.
Пожалуй, нужно еще ответить на вопрос, а зачем вообще использовать SFTP, ведь есть FTP, и зачем придумывать что-то еще?
FTP до сих пор довольно распространен, однако этот протокол менее быстр, менее функционален, менее защищен и менее надежен, он не имеет никаких преимуществ перед SFTP.
SFTP же, в свою очередь, детально проработан для работы с файлами, не имеет проблем с кодировками, файлы не теряются, не бьются, установленное соединение просто так не разрывается, и может оставаться активным неделями. Одним словом, в SFTP решены многие проблемы, которые есть у FTP.
Клиентское ПО для работы с SFTP
Большинство актуальных программ для работы с FTP поддерживают и SFTP. Например, FileZilla (Windows, macOS, Linux), Cyberduck (Windows, macOS), Xftp (Windows), Transmit (macOS).
Принцип работы таких программ обычно предусматривает работу через встроенный в программу файловый менеджер. Это может затруднять взаимодействие со сторонними программами для просмотра и редактирования файлов. Не получится, например разархивировать архивы, просматривать папки с изображениями. Для простых задач, типа передачи файлов, функционала, в принципе, достаточно, но для разработки это не очень удобно.
Для разработки более интересно ПО, которое позволяет монтировать SFTP соединения как сетевой диск или как файловую систему. Для разных ОС есть различные варианты реализации такого подхода, как с помощью стандартных средств протокола SSH, так и с применением собственных алгоритмов.
Здесь, пожалуй, лучше начать с ПО для Linux. В Ubuntu (и скорее всего и в других дистрибутивах) можно примонтировать сетевой диск по SSH в стандартном файловом менеджере без установки какого-либо дополнительного ПО (естественно, пакет openssh-client должен быть установлен). Для этого нужно зайти в раздел «Other Locations» (актуально для версии 18.04, в старых версиях, по-моему, было как-то по-другому) и воспользоваться строкой «Connect to Server». Кстати, поддерживаются и другие протоколы.
Строка подключения выглядит следующим образом:
Также в Linux доступен пакет SSHFS, который работает в связке с пакетом Fuse, и позволяет монтировать SFTP соединения с помощью командной строки, в том числе автоматически при загрузке ОС.
Команда подключения будет примерно такой:
Поддерживаются различные дополнительные опции, например аутентификация по файлу-ключу.
Для macOS также существует SSHFS, и своя реализация Fuse (FUSE for macOS), работают они так же, как и в Linux.
Однако для этой платформы существует и масса GUI программ (программ с графическим интерфейсом) для удобного управления монтированием:
- Forklift
- Mountain Duck
- CloudMounter
- ExpanDrive
Я поработал со всеми этими программами и некоторыми другими. Очень удобно, что можно сохранять настройки соединений, и в пару кликов монтировать файловые системы. Но у всех них есть важная особенность, которая в моем случае являлась существенным недостатком. Так или иначе, все эти программы безапелляционно кешировали переданные файлы. Функция, конечно, полезная, но для разработки нужна возможность и каждый раз получать «свежие» файлы, не из кеша, так как они могут часто меняться на сервере в процессе работы, например при сборке CSS из SASS. В некоторых случаях наблюдались и случаи порчи файлов, хотя, возможно, в актуальных версиях это уже могли исправить.
На Windows ситуация примерно такая же, есть несколько программ с собственными алгоритмами монтирования, например WebDrive и тот же Mountain Duck. У WebDrive даже есть функция настройки параметров кеширования, но, к сожалению, полностью оно все равно не отключается.
Существует и вполне рабочая версия порта SSHFS для этой платформы — WinSshFS. Именно на ней я остановился, когда работал на Windows.
На macOS и Ubuntu я пользовался SSHFS, заготавливал в специальных файлах команды для подключения и вызывал их по необходимости.
GUI для SSHFS
Использовать длинные команды SSHFS в повседневной работе было все же не удобно. Даже если хранить их в исполняемых файлах, обращаться к ним долго, редактировать неудобно и нужно было что-то придумать.
Тогда я решил разработать графический интерфейс, визуальную оболочку, которая позволит генерировать команды подключения для SSHFS, хранить параметры соединений и удобно управлять ими.
Это был новый интересный опыт для меня, так как десктопных приложений до этого я не разрабатывал. При поиске подходящего стека технологий я руководствовался желанием сделать программу для macOS и Linux (так как интерфейс командной строки SSHFS есть только для этих платформ), но впоследствии от поддержки Linux пришлось отказаться.
В итоге, выбор пал на платформу Electron, которая позволяла создавать приложения с некоторыми нативными функциями с помощью HTML/CSS/JS. C JavaScript мне часто приходилось иметь дело, и процесс разработки занял всего порядка двух дней. Еще примерно столько же понадобилось, чтобы разобраться с самим Electron и его возможностями.
Приложение SSHFS Mounter доступно на GitHub.
Работу с программой здесь я описывать не буду, все должно быть интуитивно понятно.
Кстати, одной из причин отказа от поддержки Linux, было отсутствие в Electron встроенной возможности использовать нативные элементы интерфейса ОС. В последних версиях macOS интерфейс остается более-менее одинаковым, и я постарался воспроизвести его подобие с помощью CSS, но для различных оконных интерфейсов Linux, да еще и различных тем оформления, этого было бы непросто добиться.
Также к архитектурным минусам Electron можно отнести:
- большой размер приложения — порядка 50 Мб в сжатом виде, из которых код самого приложения занимает всего порядка 20 Кб в несжатом виде.
- ограниченная поддержка работы с командной строкой, из-за чего невозможно обрабатывать какие-либо интерактивные запросы, например ввод пароля, парольной фразы или запроса на добавление сервера в доверенный список.
Несмотря на это, я пользовался SSHFS Mounter практически ежедневно в течение нескольких месяцев.
Однако то, что практически при каждом монтировании мне было необходимо запускать еще и обычную SSH сессию (для выполнения команд на сервере), а также периодическая потребность в похожем инструменте для Linux, сподвигли меня на разработку нового инструмента управления соединениями — для командной строки (CLI).
Менеджер SSHFS соединений для CLI
После недолгого анализа языков программирования для CLI приложений, выбор PHP стал окончательным. Во-первых — это мой основной язык программирования, а во-вторых, другие языки не давали каких-то особых преимуществ. Последние версии PHP имеют полноценную поддержку разработки для CLI.
Что ж, за работу!
Поддержка Linux на этот раз была одним из главных требований, наряду с macOS.
При проектировании приложения хотелось сделать его максимально простым в работе. В качестве формата файлов для хранения параметров соедиений был выбран YAML, как один из самых дружественных для редактирования человеком. Основная концепция программы — для выполнения основных команд от пользователя требуется набирать минимальное количество символов, как это сделано, например, в Git или Drush.
Разработка заняла порядка двух недель в относительно свободном режиме. При этом рабочий вариант был готов уже на второй день.
Приложение SSHFS Mount Tool (SMT) также доступно на GitHub.
До этого у меня уже был опыт разработки консольных приложений на PHP и node.js, но это были скрипты для личного или служебного пользования: конвертор проприетарного векторного формата в SVG, программа для сортировки и конвертации музыкального архива, различного рода инструменты для пакетной обработки изображений для интернет-магазинов. Но эти программы не были рассчитаны на других пользователей, не было практически никакой обработки ошибок, различных вариантов передачи параметров или справки.
В SMT же мне пришлось проектировать вполне себе полноценную архитектуру приложения, такой опыт был впервые, и насколько он успешен судить уже не мне.
Для SMT я предусмотрел несколько сценариев использования, основываясь на собственном рабочем процессе.
Основные команды предназначены для монтирования/размонтирования, а так же для управления параметрами соединений, здесь все довольно стандартно.
Если добавлено несколько соединений (а для этого программа и предназначена), то можно передать команде ID соединения в качестве аргумента, либо выполнить команду без аргумента, и программа предложит выбрать соединение из списка.
Пример команды монтирования:
Соединения можно добавлять при помощи встроенного мастера (команда smt add ), либо редактируя файл конфигурации напрямую. Можно использовать глобальный файл конфигурации в папке пользователя, либо файл smt.yml в текущей папке.
Использование глобального файла удобно для хранения нескольких часто используемых соединений.
Использования отдельных файлов конфигурации удобно, например, для хранения настроек соединения в папке проекта. Если запускать программу из этой папки, то будет использован находящийся в ней файл конфигурации.
Если создано только одно соединение, то оно автоматически будет использовано в качестве аргумента для команд.
SMT лишен недостатков графического варианта программы, имеет небольшой размер, способен отображать интерактивные запросы пароля и парольной фразы, а добавление сервера в список доверенных не требуется. Также реализован более надежный алгоритм проверки статуса монтирования.
В качестве дополнения, для стандартных терминалов Ubuntu и macOS есть возможность открывать папку монтирования и запускать SSH соединение в новой вкладке терминала.
Работая над программой, было прочитано множество материалов по способам работы с аргументами, вывода результатов, организации справки (команды help ). Были попытки использования сторонних библиотек, но в итоге их использование я счел оправданным только для работы с YAML форматом и отображения вывода в табличном виде. Обработка аргументов и генерация справки написаны с нуля. Возможно, использованные методы не самые оптимальные, и тут я был бы рад услышать конструктивную критику и предложения по улучшению.
Текущая версия (на момент написания статьи это 1.0.0) полностью готова к работе, и ждет своих первых пользователей.
Но разработка на этом не заканчивается, в планах есть как доработка существующего функционала, так и добавление нового.
Обновление
По совету и не без помощи @yozk (Ivan Ch), я полностью переписал SMT на базе компонента Symfony/Console.
Это второй по популярности компонент Symfony и самый популярный инструмент для разработки PHP CLI програм. К слову, Composer, Drush 9 и Drupal Console так же базируется на нем.
Console предоставляет множество полезных возможностей, среди которых:
- объявление и обслуживание аргументов и опций;
- управление выводом, в том числе форматами и цветами;
- автоматическую генерацию справки.
Все эти, и некоторые другие, возможности используются в SMT версии 2.x, и вот что это дало, по сравнению с первой версией:
- дополнительные способы передачи аргументов и опций;
- единый стиль запросов на ввод данных (как в Composer);
- валидация ввода и при необходимости повторный запрос на ввод;
- более широкое использование цветов для разметки вывода;
- различные форматы вывода результатов;
- улучшенная справка и уровни подробности вывода;
- общее повышение стабильности приложения за счет обработки ошибок и применения оттестированных компонентов и функций Symfony.
В отличии от версии 1.x, где я был волен выбирать варианты реализации по своему усмотрению, в Console повсеместно применяется ООП. Это, конечно, немного усложнило процесс для меня, пришлось разобраться с документацией и примерами реализации в других приложениях, но в итоге я остался очень доволен результатами, и еще раз хочу поблагодарить Ivan Ch за помощь и советы.
Синтаксис команд, формат конфигурационного файла и варианты использования полностью сохранились. Хотя Symfony/Console более строг к порядку аргументов, в этом отношении первая версия была более добра к пользователю.
Также размер приложения увеличился примерно в 3 раза (1.5 Мб), и хоть на скорости работы это, на мой взгляд, не сказалось, первая версия может послужить более легковесной альтернативой.
Вместо итога
Если в работе вам часто приходится выполнять одни и те же рутинные операции, то разработка удобного инструмента для автоматизации их выполнения — это отличный способ на реальном примере погрузиться в разработку, изучить что-то новое и получить обратную связь от коллег по цеху. Именно этих принципов я придерживался при разработке своих программ, надеюсь они окажутся полезны и вам!
Sshfs windows сетевой диск
SSHFS-Win · SSHFS for Windows
Download
GUI Frontends
SSHFS-Win is a minimal port of SSHFS to Windows. Under the hood it uses Cygwin for the POSIX environment and WinFsp for the FUSE functionality.
- Install the latest version of WinFsp.
- Install the latest version of SSHFS-Win. Choose the x64 or x86 installer according to your computer’s architecture.
Once you have installed WinFsp and SSHFS-Win you can map a network drive to a directory on an SSHFS host using Windows Explorer or the net use command.
In Windows Explorer select This PC > Map Network Drive and enter the desired drive letter and SSHFS path using the following UNC syntax:
The first time you map a particular SSHFS path you will be prompted for the SSHFS username and password. You may choose to save these credentials with the Windows Credential Manager in which case you will not be prompted again.
In order to unmap the drive, right-click on the drive icon in Windows Explorer and select Disconnect.
You can map a network drive from the command line using the net use command:
You can list your net use drives:
Finally you can unmap the drive as follows:
The complete UNC syntax is as follows:
- REMUSER is the remote user (i.e. the user on the SSHFS host whose credentials are being used for access).
- HOST is the SSHFS host.
- PORT is the remote port on the SSHFS host (optional; default is 22).
- PATH is the remote path. This is interpreted as follows:
- The sshfs prefix maps to HOST:
REMUSER/PATH on the SSHFS host (i.e. relative to REMUSER ‘s home directory).
- The sshfs.r prefix maps to HOST:/PATH on the SSHFS host (i.e. relative to the HOST ‘s root directory).
- The sshfs.k prefix maps to HOST:
REMUSER/PATH and uses the ssh key in %USERPROFILE%/.ssh/id_rsa (where %USERPROFILE% is the home directory of the local Windows user).
- The sshfs.kr prefix maps to HOST:/PATH and uses the ssh key in %USERPROFILE%/.ssh/id_rsa .
- Please note that this functionality is rarely necessary with latest versions of WinFsp.
There are currently 2 GUI front ends for SSHFS-Win: SiriKali and SSHFS-Win-Manager.
SiriKali is a GUI front end for SSHFS-Win (and other file systems). Instructions on setting up SiriKali for SSHFS-Win can be found at this link. Please report problems with SiriKali in its issues page.
- Password authentication.
- Public key authentication.
- Key Agents and KeePass 2.
SSHFS-Win-Manager is a new GUI front end specifically for SSHFS-Win with a user-friendly and intuitive interface. SSHFS-Win-Manager integrates well with Windows and can be closed to the system tray. Please report problems with SSHFS-Win-Manager in its issues page.
- Password authentication.
- Public key authentication.
It is possible to use the sshfs-win.exe and sshfs.exe programs directly for advanced usage scenarios. Both programs can be found in the bin subdirectory of the SSHFS-Win installation (usually \Program Files\SSHFS-Win\bin ).
The sshfs-win.exe program is useful to launch sshfs.exe from a cmd.exe prompt ( sshfs-win cmd ) or to launch sshfs.exe under the control of the WinFsp Launcher ( sshfs-win svc ). The sshfs-win.exe program SHOULD NOT be used from Cygwin. The sshfs-win.exe program has the following usage:
The sshfs.exe program can be used with an existing Cygwin installation, but it requires prior installation of FUSE for Cygwin on that Cygwin installation. FUSE for Cygwin is included with WinFsp and can be installed on a Cygwin installation by executing the command:
This is a simple project:
- sshfs is a submodule pointing to the original SSHFS project.
- sshfs-win.c is a simple wrapper around the sshfs program that is used to implement the «Map Network Drive» functionality.
- sshfs-win.wxs is a the Wix file that describes the SSHFS-Win installer.
- patches is a directory with a couple of simple patches over SSHFS.
- Makefile drives the overall process of building SSHFS-Win and packaging it into an MSI.
In order to build SSHFS-Win you will need Cygwin and the following Cygwin packages:
You will also need:
FUSE for Cygwin. It is included with WinFsp and can be installed on a Cygwin installation by executing the command:
Wix toolset. This is a native Windows package that is used to build the SSHFS-Win MSI installer.
- Open a Cygwin prompt.
- Change directory to the sshfs-win repository.
- Issue make .
- The sshfs-win repository includes the upstream SSHFS project as a submodule; if you have not already done so, you must initialize it with git submodule update —init sshfs .
SSHFS-Win uses the same license as SSHFS, which is GPLv2+. It interfaces with WinFsp which is GPLv3 with a FLOSS exception.
It also packages the following components:
- Cygwin: LGPLv3
- GLib2: LGPLv2
- SSH: «all components are under a BSD licence, or a licence more free than that»