2014-09-12 44 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一时的作品。