我有一个运行一些shell命令的nodejs应用程序。我想通过使用ssh在另一台机器上执行这些命令。
我有这个:
snapInfo(snapName: string) {
return `snap info ${snapName}`;
}
我需要这样的东西:
snapInfo(snapName: string) {
return `ssh user@host snap info ${snapName}`;
}
该文件是.ts文件。我该怎么做?有什么建议么?这是我第一次看到nodejs应用程序。
谢谢
答案 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;
}
}