使用 ssh2shell node.js 为多个设备执行多个命令
Execute multiple commands for multiple devices using ssh2shell node.js
在我的项目中,我有一组设备 ip 和一组命令。
我需要为每个 devcie 打开新的 ssh shell,它在同一个 shell 中执行所有命令,因此它不会为每个命令打开新连接,这就是我使用 ssh2shell包。
问题是我需要等待所有这些结束,并且它需要是异步的,所以它不会在开始与其他设备的会话之前等待每个 ip 的回答。在获得所有响应后,它将所有数据保存在某个数组中,该数组中的每个单元格代表一个 ip 响应。
我知道它需要与 async
、await
或 Promise
一起使用,但我没有成功管理它。
主要代码:
function monitorDevices() {
const DEVICES_IPS = [ "10.10.10.1", "20.20.20.1", "30.30.30.1" ];
const COMMANDS = [ "cat /var/log/messages", "cat /proc/stat", "df -h /var/log", "free -t -m" ];
let data = [];
DEVICES_IPS.forEach(device => {
data.push(sshService.exec(device, COMMANDS));
});
console.log(data);
}
ssh服务代码:
function exec(device, commands) {
var host = {
server: {
host: device,
userName: process.env.USERNAME,
password: process.env.PASSWORD,
},
commands: commands
};
var SSH2Shell = require ('ssh2shell'),
SSH = new SSH2Shell(host),
callback = function(sessionText){
// if I console.log(sessionText) here, it gives my a good result.
return sessionText;
}
SSH.connect(callback);
}
谢谢!
这是我将 Promise-wrap SSH2Shell
和 SSH.connect
-
的方式
const SSH2Shell = require ('ssh2shell')
function exec(device, commands) {
const SSH = new SSH2Shell({
server: {
host: device,
userName: process.env.USERNAME,
password: process.env.PASSWORD,
},
commands: commands
})
return new Promise(resolve => SSH.connect(resolve))
}
现在我们把monitorDevices
写成async
函数。只需遍历 devices
、await
每个 sshService.exec
和 push
到 data
结果 -
async function monitorDevices() {
const devices =
[ "10.10.10.1", "20.20.20.1", "30.30.30.1" ]
const commands =
[ "cat /var/log/messages",
"cat /proc/stat",
"df -h /var/log",
"free -t -m"
]
const data = []
for (const d of devices)
data.push(await sshService.exec(d, commands))
return data
}
为了运行函数,我们写-
monitorDevices().then(console.log, console.error)
我的建议是 monitorDevices
函数的 devices
和 commands
参数 -
async function monitorDevices(devices, commands) { // parameters
const data = []
for (const d of devices)
data.push(await sshService.exec(d, commands))
return data
}
现在它可重复用于各种设备和命令 -
monitorDevices
( [ "10.10.10.1", ... ] // devices
, [ "cat /var/log/messages", ... ] // commands
)
.then(console.log, console.error)
最后,我们可能希望让我们的 exec
函数更健壮一些。我们可以通过连接到主机的 onError
属性 -
来添加一些错误处理
function exec(device, commands) {
return new Promise((resolve, reject) =>
new SSH2Shell({
server: {
host: device,
userName: process.env.USERNAME,
password: process.env.PASSWORD,
},
commands: commands,
callback: resolve, // <- resolve callback
onError: reject // <- reject error
})
}
在我的项目中,我有一组设备 ip 和一组命令。 我需要为每个 devcie 打开新的 ssh shell,它在同一个 shell 中执行所有命令,因此它不会为每个命令打开新连接,这就是我使用 ssh2shell包。
问题是我需要等待所有这些结束,并且它需要是异步的,所以它不会在开始与其他设备的会话之前等待每个 ip 的回答。在获得所有响应后,它将所有数据保存在某个数组中,该数组中的每个单元格代表一个 ip 响应。
我知道它需要与 async
、await
或 Promise
一起使用,但我没有成功管理它。
主要代码:
function monitorDevices() {
const DEVICES_IPS = [ "10.10.10.1", "20.20.20.1", "30.30.30.1" ];
const COMMANDS = [ "cat /var/log/messages", "cat /proc/stat", "df -h /var/log", "free -t -m" ];
let data = [];
DEVICES_IPS.forEach(device => {
data.push(sshService.exec(device, COMMANDS));
});
console.log(data);
}
ssh服务代码:
function exec(device, commands) {
var host = {
server: {
host: device,
userName: process.env.USERNAME,
password: process.env.PASSWORD,
},
commands: commands
};
var SSH2Shell = require ('ssh2shell'),
SSH = new SSH2Shell(host),
callback = function(sessionText){
// if I console.log(sessionText) here, it gives my a good result.
return sessionText;
}
SSH.connect(callback);
}
谢谢!
这是我将 Promise-wrap SSH2Shell
和 SSH.connect
-
const SSH2Shell = require ('ssh2shell')
function exec(device, commands) {
const SSH = new SSH2Shell({
server: {
host: device,
userName: process.env.USERNAME,
password: process.env.PASSWORD,
},
commands: commands
})
return new Promise(resolve => SSH.connect(resolve))
}
现在我们把monitorDevices
写成async
函数。只需遍历 devices
、await
每个 sshService.exec
和 push
到 data
结果 -
async function monitorDevices() {
const devices =
[ "10.10.10.1", "20.20.20.1", "30.30.30.1" ]
const commands =
[ "cat /var/log/messages",
"cat /proc/stat",
"df -h /var/log",
"free -t -m"
]
const data = []
for (const d of devices)
data.push(await sshService.exec(d, commands))
return data
}
为了运行函数,我们写-
monitorDevices().then(console.log, console.error)
我的建议是 monitorDevices
函数的 devices
和 commands
参数 -
async function monitorDevices(devices, commands) { // parameters
const data = []
for (const d of devices)
data.push(await sshService.exec(d, commands))
return data
}
现在它可重复用于各种设备和命令 -
monitorDevices
( [ "10.10.10.1", ... ] // devices
, [ "cat /var/log/messages", ... ] // commands
)
.then(console.log, console.error)
最后,我们可能希望让我们的 exec
函数更健壮一些。我们可以通过连接到主机的 onError
属性 -
function exec(device, commands) {
return new Promise((resolve, reject) =>
new SSH2Shell({
server: {
host: device,
userName: process.env.USERNAME,
password: process.env.PASSWORD,
},
commands: commands,
callback: resolve, // <- resolve callback
onError: reject // <- reject error
})
}