gpt4 book ai didi

javascript - 为什么javascript ssh2在使用shell时会陷入无限循环

转载 作者:太空宇宙 更新时间:2023-11-04 01:57:29 28 4
gpt4 key购买 nike

我正在尝试使用 ssh2 npm 包让我的应用程序在另一个系统上执行 sudo 命令。我已经得到了最终结果,但由于某种原因,代码陷入了无限循环。我不明白这是怎么可能的,因为我认为关闭与 conn.end 的连接可以防止这种情况发生。任何人都可以帮助阐明为什么我陷入无限循环吗?

正在执行的主要代码:

function sshRunSudoCommand(user, pass, lanIP, command) {

return new Promise((resolve, reject) => {
var Connection = require('ssh2');
var pwSent = false;
var sudosu = false;
var password = pass;
var conn = new Connection();

conn.on('ready', function() {
console.log('Sudo Connection :: ready');
conn.shell( function(err, stream) {
if (err) throw err;
stream
.on('close', function() {
console.log('Sudo Stream :: close');
conn.end();
resolve();
})
.on('data', function(data) {
//handle sudo password prompt
stream.write(password + '\n');
stream.write(command + '\n');
console.log('Sudo STDOUT: ' + data);
resolve(data);
})
.on('exit', function(code, signal) {
let exitCode = 'Stream :: exit :: code: ' + code + ', signal: ' + signal;
conn.end();
resolve(exitCode);
})
.on('end', function() {
conn.end();
resolve('end');
})
.stderr.on('data', function(data) {
console.log('STDERR: ' + data);
conn.end();
resolve(data);
});

});
})
.on('keyboard-interactive',
function(name, instructions, instructionsLang, prompts, finish) {
// Pass answers to `prompts` to `finish()`. Typically `prompts.length === 1`
// with `prompts[0] === "Password: "`
console.log('pass before finish is ', pass);
finish([pass]);
}).on('ready', function() {
}).connect({
host: lanIP,
port: 22,
username: user,
password: pass,
readyTimeout: 99999,
tryKeyboard: true // this attempts keyboard-interactive auth
});
};
}

结果:(永远重复)

Sudo STDOUT: activedash:~ activeadmin$ s
Sudo STDOUT: udo
Sudo STDOUT: profiles -I -
Sudo STDOUT: F /Users/S
Sudo STDOUT: hared/Sym
Sudo STDOUT: ply/activ
Sudo STDOUT: e-uuid.
onfigpr
Sudo STDOUT: ofile

Sudo STDOUT: active
sudo profiles -I -F /Users/Shared/Symply/active-uuid.configprofile
active
sudo profiles -I -F /Users/Shared/Symply/active-uuid.configprofile
active
sudo profiles -I -F /Users/Shared/Symply/active-uuid.configprofile
active
sudo profiles -I -F /Users/Shared/Symply/active-uuid.configprofile
active
sudo profiles

最佳答案

所以我发现我需要做两件事来防止重复操作。

  1. 我需要向 Stream.write 添加“退出”命令,以告诉 shell 结束我使用 conn.shell 创建的 session

  2. 然后我可以将resolve()回调移至代码的.on('exit)部分,以便仅在成功运行exit命令后才返回。

最终的代码如下所示:

function sshRunSudoCommand(user, pass, lanIP, command) {

return new Promise((resolve, reject) => {
var Connection = require('ssh2');
var password = pass;
var conn = new Connection();

conn.on('ready', function() {
console.log('Sudo Connection :: ready');
conn.shell( function(err, stream) {
if (err) throw err;
stream
.on('close', function() {
console.log('Sudo Stream :: close');
conn.end();
resolve();
})
.on('data', function(data) {
//handle sudo password prompt
stream.write(password + '\n');
stream.write(command + '\n');
stream.write('exit\n');
})
.on('exit', function(code, signal) {
let exitCode = 'Stream :: exit :: code: ' + code + ', signal: ' + signal;
conn.end();
resolve(exitCode);
})
.on('end', function() {
conn.end();
resolve('end');
})
.stderr.on('data', function(data) {
console.log('STDERR: ' + data);
conn.end();
resolve(data);
});

});
})
.on('keyboard-interactive',
function(name, instructions, instructionsLang, prompts, finish) {
// Pass answers to `prompts` to `finish()`. Typically `prompts.length === 1`
// with `prompts[0] === "Password: "`
console.log('pass before finish is ', pass);
finish([pass]);
}).on('ready', function() {
}).connect({
host: lanIP,
port: 22,
username: user,
password: pass,
readyTimeout: 99999,
tryKeyboard: true // this attempts keyboard-interactive auth
});
};
}

关于javascript - 为什么javascript ssh2在使用shell时会陷入无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47319361/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com