【问题标题】:Node.js: Remote shell with control sequencesNode.js:带有控制序列的远程外壳
【发布时间】:2014-09-12 15:19:29
【问题描述】:

我正在尝试使用 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 时却不行,因为没有发送控制序列。 我想让它的行为有点像 ssh。 这样的事情可能吗?也许使用 process.stdin.setRawMode(true) ?

谢谢

【问题讨论】:

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

标签: javascript node.js sockets remote-access tty


【解决方案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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    • 2011-06-12
    • 2022-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多