Статьи

Мул в раковине: соединитель SSH

Зачем мне это?

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

  • Изменения конфигурации (пароли, разрешения, учетные записи и т. Д.)
  • Предоставление ресурсов
  • Операции с файловой системой на дисках или папках, не связанных с FTP

Вы также можете использовать этот разъем в качестве шлюза безопасности. Предположим, вы системный администратор и отдыхаете в отеле «все включено» на Фиджи. Вы получили срочный звонок от своего босса, в котором говорилось, что возникла проблема, и вам нужно немедленно приступить к ее решению. Вы, вероятно, думаете, что если у вас есть ноутбук или смартфон, вы можете просто войти по SSH на сервер. Но что произойдет, если эта конечная точка SSH доступна только из корпоративного VPN, который недоступен с Фиджи? Используя этот разъем и мощь Mule, вы можете легко создать безопасный шлюз, который предоставляет SSH для внешнего мира в качестве веб-клиента, чат-бота или любого другого протокола, который вам нужен … Облако — это предел!

Что я могу с этим сделать?

Основные характеристики разъема:

  •  Полнодуплексная связь. По сути, SSH — это двунаправленный полнодуплексный протокол, который означает, что он не является синхронным, как HTTP, где вам нужно отправить сообщение для получения ответа. При использовании SSH удаленный хост может захотеть вам что-то сказать, даже если вы молчали. Этот соединитель использует подход потока обратных вызовов для отделения операции «отправка» от операции «получение».
  • Режим Shell: разъем предоставляет дополнительную возможность режима Shell. Если этот параметр включен, соединитель будет поддерживать удаленный сеанс, так что вы сможете выполнять несколько команд и поддерживать контекст, аналогично традиционному клиенту на основе терминала, например PuTTY. Использование режима оболочки действительно показывает мощь поддержки полного дуплекса. Если вы просто хотите выполнить одну команду, вы можете отключить ее и сохранить ресурсы.
  • Мультиплексирование подключений. Еще одна особенность SSH заключается в том, что на одном сервере может быть зарегистрировано несколько пользователей. Базовое соединение представлено концепцией сеанса, и каждый пользователь работает по каналу. Этот соединитель полностью скрывает эту сложность для вас, предоставляя аналогичную модель, в которой вы можете иметь несколько пользователей, работающих на одном клиенте.

Я продан! Как мне это использовать?

Во-первых, вам нужно посетить сайт Mule Forge и перейти по руководству по установке по этой ссылке .

Теперь, когда все готово, давайте начнем с добавления пространства имен:

<mule xmlns="http://www.mulesoft.org/schema/mule/core"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:ssh="http://www.mulesoft.org/schema/mule/sshmultiplexedconnector"
      xsi:schemaLocation="
        http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
        http://www.mulesoft.org/schema/mule/ssh http://www.mulesoft.org/schema/mule/sshmultiplexedconnector/1.0/mule-sshmultiplexedconnector.xsd">

Теперь мы настраиваем разъем:

<ssh:config host="ssh.mycompany.com" port="22" timeout="6000" callbackFlowName="callback" shellMode="true" />

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

  • хозяин
  • Порт TCP
  • Тайм-аут (в миллисекундах)
  • Имя потока обратного вызова (для поддержки полного дуплекса, продолжайте чтение для полного примера)
  • Shell Mode: логическое свойство, чтобы включить (или нет) режим оболочки. Мы будем использовать это в этом примере.

Теперь давайте отправим пару команд!

<flow name="exampleFlow">
 <ssh:send username="${ssh.user}" password="${ssh.pass}" content="cd test" breakLine="true" />
 <ssh:send username="${ssh.user}" password="${ssh.pass}" content="cat helloWorld.txt" breakLine="true"/>
</flow>

Итак, этот код выполняет переход к папке с именем test и выводит содержимое файла helloWorld.txt. Поскольку мы используем режим оболочки, вторая команда все еще знает о навигации, выполненной в первой команде, и поэтому может выводить файл. Если режим оболочки отключен, вторая команда не будет выполнена, поскольку местоположение пользователя будет снова установлено в $ HOME.

Теперь, когда мы понимаем, что делает этот поток, давайте подробнее рассмотрим параметры:

  • Имя пользователя и пароль: Помимо очевидного, приятной особенностью этих параметров является то, что соединитель будет использовать имя пользователя для мультиплексирования и повторного использования базового канала, связанного с этим именем пользователя.
  • Содержание: полезная нагрузка, которую вы хотите передать
  • breakLine: этот параметр является необязательным и по умолчанию имеет значение false. Если true, он добавит символ ‘\ n’ в конец содержимого. Это потому, что если вы хотите выполнить команду, удаленной оболочке нужно нажать Enter, чтобы завершить строку. Таким образом, если ваша полезная нагрузка зафиксирована, как в примере, добавление разрыва в конец строки автоматически пригодится. Если вы получаете контент из веб-клиента, канала чата или любого другого источника, который будет содержать разрыв строки, или если он вам просто не нужен, не устанавливайте это значение.

И как мне прочитать ответ? Определение потока обратного вызова, который был указан в конфигурации коннектора:

<flow name="callback">
   <logger message="sent to #[header:INBOUND:SSH_CALLBACK_USER], message says: #[payload]" />
</flow>

Об этом потоке нужно помнить две вещи:

  • Имя соответствует свойству config callbackFlowName
  • Полезная нагрузка сообщения содержит ответ сервера, а входящее свойство SSH_CALLBACK_USER содержит имя пользователя, которому было отправлено сообщение (помните, что соединения являются полнодуплексными и мультиплексированными, поэтому одновременность делает невозможным определение порядка поступления ответов)

Итак, мы почти закончили, последнее, что нужно сделать, это освободить соединение, как только мы закончим, используя его:

<flow name="release">
 <ssh:release username="${ssh.user}"/>
</flow>

Обратите внимание, что операция освобождения имеет имя пользователя в качестве обязательного параметра. Это связано с тем, что соединитель является мультиплексным, и хотя пользователь A может быть готов освободить некоторые ресурсы, пользователи B и C могут все еще работать.

Это все, ребята! Пожалуйста, посетите MuleForge  для получения дополнительной информации и не стесняйтесь поделиться вопросами или мыслями об этом соединителе. Мы с нетерпением ждем ваших отзывов.