Я ежедневно создаю 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 🐻.