Вы можете использовать отличный модуль 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;
}
}