2014-09-12 65 views
1

我想用Node.js編寫遠程外殼。 這裏是我的時刻:Node.js:控制序列的遠程外殼

客戶

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一樣。 這樣的事情可能嗎?也許使用process.stdin.setRawMode(true)?

謝謝

+1

如果您希望emacs彈出一個窗口,您可能需要設置DISPLAY環境變量。 – marneborn 2014-09-12 16:49:35

+0

真正的問題是如何發送控制序列,如^ C,^ X,KeyUp,KeyDown。 我試過用setRawMode(true),它似乎沒有工作 – joni539 2014-09-12 17:24:14

回答

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一時的作品。