Я ежедневно создаю IoT-приложения в РАЗРЛАБ, и время от времени мне нужны внутренние инструменты для выполнения некоторых функций на серверах, будь то выполнение команд или перенаправление портов. Для этого я нашел небольшой удобный инструмент node-ssh, который помогает устанавливать ssh-туннели к серверам с аутентификацией по ключу.

Давайте начнем

Давайте создадим новую папку и настроим новый репозиторий npm.

npm init --y

Установить зависимости

Мы собираемся использовать следующие зависимости:

  • node-ssh — чрезвычайно легкая оболочка Promise для ssh2
  • dotenv — модуль с нулевой зависимостью, который загружает переменные окружения из файла .env в process.env.

Переменные среды

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

Я бы рекомендовал использовать управление доступом к SSH-ключам ваших облачных провайдеров для безопасного управления доступом к вашим серверам. Нажмите здесь, чтобы узнать, как управлять доступом к ключу SSH через Digital Ocean.

Теперь давайте укажем пути и информацию в файле .env

# .env
SSH_host=
SSH_user=
SSH_privatekey=
SSH_passphrase=

Определения переменных среды:

  • SSH_host : IP-адрес хоста или DNS-имя сервера.
  • SSH_user : Имя пользователя хоста для входа в систему
  • SSH_privatekey : путь к закрытому ключу
  • SSH_passphrase : парольная фраза для ключа для дополнительного уровня безопасности.

Испытательная установка

Мы получим доступ к серверу и установим сервер Redis. Мы будем использовать машину с Ubuntu и использовать менеджер пакетов apt для установки сервера Redis.

  • SSH, как всегда 😁
ssh <username>@<host>
  • Установить Redis-сервер
sudo apt-get install redis-server

Это загрузит и установит Redis и его зависимости. Он также экспортирует приложение CLI под названием redis-cli для взаимодействия с сервером Redis.

Погнали

Теперь, когда мы сделали настройку. Давайте напишем минимальный клиент, который будет переходить в каталог и получать доступ к redis-cli, чтобы пинговать сервер Redis.

const node_ssh = require('node-ssh');
const ssh = new node_ssh();
require('dotenv').config();
ssh
  .connect({
    host: process.env.SSH_host,
    username: process.env.SSH_user,
    privateKey: process.env.SSH_privatekey,
    passphrase: process.env.SSH_passphrase
  })
  .then(() => {
    ssh.execCommand('redis-cli ping', { cwd: '/var/www' }).then((result) => {
      console.log('STDOUT: ' + result.stdout);
      console.log('STDERR: ' + result.stderr);
    });
  });

Как вы можете видеть в приведенном выше примере, мы читаем вывод из STDOUT и STDERR для вывода и ошибок соответственно после запуска команды ping через redis-cli. Отличительной особенностью node-ssh является то, что это простая оболочка Promise, и, следовательно, вы можете использовать с ней логику async/await.

STDOUT: PONG;

Теперь, когда вы смогли подключиться к удаленному серверу по SSH и запустить команды CLI, следующим шагом будет сойти с ума 😝. Теперь у вас есть бесконечные возможности автоматизации развертывания и выполнения команд на ваших серверах, используя возможности создания сложных приложений с помощью Node.js.

Подробнее читайте в Grizzlybit 🐻.