приложение ssh и nodejs - PullRequest
0 голосов
/ 11 июня 2019

У меня есть приложение nodejs, которое запускает некоторые команды оболочки. Я хочу выполнить эти команды на другом компьютере с помощью SSH.

У меня есть это:

snapInfo(snapName: string) {
    return `snap info ${snapName}`;
}

Мне нужно что-то вроде этого:

snapInfo(snapName: string) {
    return `ssh user@host snap info ${snapName}`;
}

файл является файлом .ts. Как мне это сделать? Какие-либо предложения? Это первый раз, когда я вижу приложение nodejs.

Спасибо за

1 Ответ

0 голосов
/ 11 июня 2019

Вы можете использовать отличный модуль ssh2 для Node.js.

npm install ssh2

И затем вы можете подключиться к удаленной системе, добавивновая функция execSSHCommand, которую можно использовать вместо execCommand в файле shell-command.ts.

import { Injectable } from '@nestjs/common';
import { promisify } from 'util';
import { exec } from 'child_process';
import { Client } from 'ssh2'

const exec_promise = promisify(exec);

function execute_over_ssh(cmd: string): Promise<{ stdout: string; stderr: string; }> {
  return new Promise<{ stdout: string; stderr: string; }>((resolve, reject) => {
    let conn = new Client();
    conn.on('ready', function () {
      let stdout = "", stderr = "";
      conn.exec(cmd, function (err, stream) {
        if (err) reject(err);
        stream.on('close', function (code, signal) {
          resolve({ stdout, stderr });
          conn.end();
        }).on('data', function (data) {
          stdout += data.toString('utf8');
        }).stderr.on('data', function (data) {
          stderr += data.toString('utf8');
        });
      });

    }).connect({ host: '127.0.0.1', port: 22, username: 'user', password: 'pass' });
  });
}


@Injectable()
export class ShellService {

  async execCommand(cmd: string, password?: string): Promise<string> {
    if (password) {
      // TODO: Possibly remove
      const command = `echo ${password} | sudo -S ${cmd}`;
      const { stdout, stderr } = await exec_promise(command);
      return stdout;
    } else {
      const command = `${cmd}`;
      const { stdout, stderr } = await exec_promise(command);
      return stdout;
    }
  }

  async execSSHCommand(cmd: string): Promise<string> {
    const command = `${cmd}`;
    const { stdout, stderr } = await execute_over_ssh(command);
    return stdout;
  }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...