Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js:带有控制序列的远程shell_Javascript_Node.js_Sockets_Remote Access_Tty - Fatal编程技术网

Javascript Node.js:带有控制序列的远程shell

Javascript Node.js:带有控制序列的远程shell,javascript,node.js,sockets,remote-access,tty,Javascript,Node.js,Sockets,Remote Access,Tty,我正在尝试用Node.js编写一个远程shell。 以下是我目前得到的信息: 客户 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

我正在尝试用Node.js编写一个远程shell。 以下是我目前得到的信息:

客户

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或nano时,它就不能了,因为控制序列没有被发送。 我想让它表现得有点像宋承宪。 这可能吗?可能使用process.stdin.setRawMode(true)


谢谢,我找到了我要找的东西。 它叫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。

如果希望emacs弹出窗口,则可能需要设置DISPLAY环境变量。真正的问题是如何发送控制序列,如^C、^x、KeyUp、KeyDown。我试过setRawMode(true),它似乎不起作用