在使用nodejs ssh2的shell函数时,我们用conn.write和conn.end发送命令,经常会遇到命令发送不过去的情况,我自己也遇到这种情况,纠结了很久,最后把write,end发送命令的代码,放在接收到第一个data事件之后去发送,就不会出现这种发不过去的情况了。后来咨询了一下写nodejs ssh2代码的作者,才知道当建立stream连接后,数据的缓冲区可能没有准备好,如果此时对缓冲区里面写入数据,那么写入的数据将会被忽略,这也就是为什么有时候发送数据不成功的原因。当接收到第一个data事件后,此时数据缓冲区已经准备好了,那么此时我们可以向缓冲区write或者end数据了。
conn.shell(function(err, stream){
if(err){
dosomething();
}else{
var buf = '';
var bData = false;
stream.on('data', function(data){
if(bData == false) {
bData = true;
stream.write(cmd);
stream.end();
}
buf = buf + data;
console.log('stdout: ' + data);
}).on('close', function(){
dosomething();
}).stderr.on('data', function(data) {
console.log('stderr: ' + data);
});
}
});