【问题标题】:How can I connect a node.js child process to a specific tty device?如何将 node.js 子进程连接到特定的 tty 设备?
【发布时间】:2022-01-15 11:47:32
【问题描述】:

我想生成一个 node.js 子进程并将它的 stdio 附加到一个特定的 tty,比如说/dev/ttyS0。我知道{ stdio: 'inherit' },但我不想将孩子连接到与父母相同的tty。我知道pty.js,但我不想让它连接到一个伪终端,我希望它连接到一个真实的终端。我尝试将子进程的 stdio 通过管道传输到我使用 serialport 模块打开的 tty:

var SerialPort = require('serialport');
var tty = new SerialPort('/dev/ttyS0');
var cp = require('child_process');
var myprocess = cp.spawn('myprocess');
myprocess.stdout.pipe(tty);
myprocess.stderr.pipe(tty);
tty.pipe(myprocess.stdin);

但它不适用于需要访问真实 tty 的进程,例如 sudo。但是,我实际上并不打算专门使用 sudo。

【问题讨论】:

    标签: node.js tty


    【解决方案1】:

    我最终发现了如何做到这一点,最初是使用 tty 模块,但后来我发现任何旧的 WriteStream 和 ReadStream 都可以,而不仅仅是 tty.Read/WriteStream。最初我尝试通过两次打开文件来创建ReadStreamWriteStream,但这不起作用,因为我只需要在r+ 模式下打开文件一次。这就是我所做的:

    var fs = require('fs');
    var cp = require('child_process');
    var ttyFd = fs.open('/dev/ttyS0', 'r+');
    var readStream = fs.createReadStream(null, {fd: ttyFd});
    var writeStream = fs.createWriteStream(null, {fd: ttyFd});
    cp.spawn('myprocess', [], {stdio: [writeStream, readStream, writeStream]});
    

    现在,当我将 tty 命令放入 cp.spawn() 时,它会将终端名称打印到终端。 sudoman 等需要直接终端访问的命令可以完美运行。

    【讨论】:

      猜你喜欢
      • 2015-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-29
      • 2015-10-30
      • 2012-10-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多