ssh和nodejs应用程序

时间:2019-06-11 11:03:52

标签: node.js ssh

我有一个运行一些shell命令的nodejs应用程序。我想通过使用ssh在另一台机器上执行这些命令。

我有这个:

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

我需要这样的东西:

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

该文件是.ts文件。我该怎么做?有什么建议么?这是我第一次看到nodejs应用程序。

谢谢

1 个答案:

答案 0 :(得分:0)

您可以将出色的ssh2模块用于Node.js。

npm install ssh2

然后您可以通过添加一个新功能execSSHCommand来连接到远程系统,该功能可以在shell-commands.ts文件中代替execCommand使用。

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;
  }

}