dispatch_protocol_error: type 90 seq 5 [preauth]
Closed this issue · 2 comments
I had a host A,the info of host A was:
- exist a
node-ssh
server [the node-ssh version is 12.0.1] - ubuntu 18.04
- ssh version
OpenSSH_7.6p1 Ubuntu-4ubuntu0.5, OpenSSL 1.0.2n 7 Dec 2017
- it will create multiple SSH links triggered by different users
- the command's length would be very long. may be 100?
here is host B‘s info:
- Target host for SSH connection
- centos7
- ssh version
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017
Sometimes,we can conected host B through host A,
But Sometimes we can't.
When failed,
we have not received any information of failure through node-ssh
,
But,in host B,we found dispatch_protocol_error: type 90 seq 5 [preauth]
error in ssh's log file.
we tried set up an SSH connection directly in host A by ssh user@hostB
, Repeated attempts,this error didn't appear .
So we wondered if it was the problem of the node-ssh
?
But we don't know for sure.
So I opened this issue for help.
Thank s lot.
Here was the code for a major SSH service in HostA:
function initConnect(host,username,password){
const ssh = new NodeSSH();
ssh.connect({
host,
username,
password,
//tryKeyboard:true,
//onKeyboardInteractive(name, instructions, instructionsLang, prompts, finish) {
//console.log('prompts===>',prompts)
//if (prompts.length > 0 && prompts[0].prompt.toLowerCase().includes('password')) {
//finish([password])
// }
// }
});
const uid = uuidv1(); //the identifier of the connection
sshMap.set(uid,ssh);
return uid
}
//init a ssh connect
app.post("/init/connect",(req,res)=>{
const {host,user,password} = req.body;
const uid = initConnect(host,user,password);
console.log('uid===========>',uid)
res.send({
data:uid,
status:10200,
message:'success'
})
res.end();
});
app.ws("/exec/ssh/:uid",(ws,req)=>{
const uid = req.params.uid; //the uid was the identifier of the connection
console.log('uid=====>',uid)
const ssh = sshMap.get(uid); // we use map to store different ssh connection
console.log('is ssh connectSuccess?',ssh.isConnected());
ws.on("message",(data)=>{
console.log("command====>",data);//excute command like 'ls -al'
ssh.execCommand(data,{
cwd:'/home/',
onChannel(clientChannel){
console.log('clientChannel',clientChannel);
},
onStdout(chunk){
console.log('stdout=================>',chunk.toString('utf8'))
ws.send(chunk.toString('utf8'))
},
onStderr(chunk){
console.log('stderr=====>',chunk.toString('utf8'))
ws.send(chunk.toString('utf8'))
}
}).then(res=>{
ws.send(`code:${res.code}`);
ws.send(`signal:${res.signal}`)
if(res.code === 0){
ws.send('Command executed successful')
}else{
ws.send('Command executed fail')
}
// ws.send('Command executed')
}).catch(e=>{
ws.send(e.toString('utf-8'));
ws.close();
ssh.dispose();
sshMap.delete(uid);
console.log('delete uid====>',uid)
})
})
ws.on('close',(e)=>{
if(sshMap.has(uid)){
ssh.dispose();
sshMap.delete(uid);
console.log('close delete uid====>',uid)
}
console.log('end webscoket connect')
})
Hello! Thanks for the detailed post.
I think one misunderstanding here might be that isConnected
means it is in fact connected, It's a misleading name and what it actually means is isConnectingOrConnected
instead. I think you should try storing the connection promise somewhere and awaiting on it before trying to execute a command.
It's also entirely possible that my speculation is false, my knowledge in the underlying works of ssh2 is very limited. Please consult with the excellent mscdex over at https://github.com/mscdex/ssh2 for an indepth conversation
Thank you
Thanks very much!!!
I think one misunderstanding here might be that isConnected means it is in fact connected, It's a misleading name and what it actually means is isConnectingOrConnected instead. I think you should try storing the connection promise somewhere and awaiting on it before trying to execute a command.
you were right!
I always thought it was the SSH configuration and never realized I had a bug with my code.
Thank you for taking the time to reply!