我正试图在nodejs中创建一个交互式ssh服务器,它可以像在普通的linux ssh会话中一样处理客户端上的按键。我找到了ssh2包,但它只能在按下"回车"键后在服务器端解析数据。如何在不按回车键的情况下检测此演示代码中的y/n按键?
var fs = require('fs');
var username = null;
var ssh2 = require('ssh2');
new ssh2.Server({
hostKeys: [fs.readFileSync('ssh.key')]
}, function(client) {
console.log('Client connected!');
client.on('authentication', function(ctx) {
// auth
ctx.accept();
}).on('ready', function() {
console.log('Client authenticated!');
client.on('session', function(accept, reject) {
var session = accept();
session.once('shell', function(accept, reject, info) {
var stream = accept();
stream.write("Do you want to continue? Y/N ");
stream.on('data', function(data) {
var args = data.toString();
switch(args[0])
{
case "y":
stream.write("Your choice: yn");
break;
case "n":
stream.write("Your choice: nn");
break;
default:
stream.stderr.write("Error!n");
break;
}
if(typeof stream != 'undefined')
{
stream.write("$ ");
}
});
});
});
}).on('end', function() {
console.log('Client disconnected');
});
}).listen(2222, '127.0.0.1', function() {
console.log('Listening on port ' + this.address().port);
});
大多数SSH客户端只有在能够在服务器端分配伪TTY的情况下才会发送单独的击键。否则,他们认为服务器只能处理以行分隔的输入。
默认情况下,ssh2.Server
将自动拒绝代码未处理的任何请求,因此对于伪TTY请求,您需要侦听会话对象上的'pty'
事件并接受该请求。
请注意,通过接受这样的请求,您就承认您将能够适当地处理'pty'
请求中发送的特定于终端类型的任何特殊转义序列。