2014-09-12 2 views
1

Я пытаюсь закодировать удаленную оболочку с помощью Node.js. Вот что я на данный момент:Node.js: Удаленная оболочка с контрольными последовательностями

Client

var net = require('net'); 

var client = net.connect({port: 1234}, function(){ 
    process.stdin.pipe(client); 
    client.pipe(process.stdout); 
}); 

Сервер

var net = require('net'), 
    spawn = require('child_process').spawn; 

var server = net.createServer(function(socket){ 
    var sh = spawn('/bin/sh'); 
    sh.stdout.pipe(socket); 
    sh.stderr.pipe(socket); 
    socket.pipe(sh.stdin); 
}); 
server.listen(1234); 

Она работает довольно хорошо с простыми командами, но когда я запускаю Emacs или нано это не потому, что управляющие последовательности не отправляются. Я хотел бы заставить его вести себя как ssh. Возможно ли такое? Может быть, using process.stdin.setRawMode (true)?

Thanks

+1

Если вы ожидаете появления emacs, вы, вероятно, должны установить переменную среды DISPLAY. – marneborn

+0

Настоящая проблема заключается в том, как отправлять управляющие последовательности, такие как^C,^X, KeyUp, KeyDown. Я пробовал с setRawMode (правда), он, похоже, не работает – joni539

ответ

1

Я нашел то, что искал. Это называется pty.js.

сторона сервера:

var net = require('net');                   
var pty = require('pty.js'); 

var server = net.createServer(); 

server.on('connection', function(socket){ 
    var term = pty.spawn('bash', [], { 
    name: 'xterm-color', 
    cols: 80, 
    rows: 40, 
    cwd: process.env.HOME, 
    env: process.env 
    }); 
    socket.pipe(term); 
    term.pipe(socket); 
}); 
server.listen(1234); 

стороны клиента:

var net = require('net'); 

var client = net.connect(1234); 

client.on('connect', function(){ 
    process.stdin.setRawMode(true); 
    process.stdin.pipe(client); 
    client.pipe(process.stdout); 
}); 

client.on('end', function(){ 
    console.log('[Connection closed by peer]'); 
    process.stdin.setRawMode(false); 
    process.exit(); 
}); 

работает только с узлом v0.10.x на данный момент.

Смежные вопросы