首页 > 解决方案 > ssh 和 nodejs 应用程序

问题描述

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

我有这个:

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

我需要这样的东西:

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

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

谢谢你

标签: node.jsssh

解决方案


您可以为 Node.js使用出色的ssh2模块。

npm install ssh2

然后你可以通过添加一个新函数来连接到你的远程系统execSSHCommand,而不是execCommand在文件 shell-commands.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;
  }

}

推荐阅读