如何将 node.js child 进程连接到特定的 tty 设备?

How can I connect a node.js child process to a specific tty device?

我想生成一个 node.js child 进程并将其 stdio 附加到特定的 tty,比方说 /dev/ttyS0。我知道 { stdio: 'inherit' },但我不想将 child 连接到与 parent 相同的 tty。我知道 pty.js 但我不想让它连接到 psudotty,我希望它连接到 REAL tty。我已经尝试将 child 进程的 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。

我最终找到了如何做到这一点,最初是使用 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 等需要直接终端访问的命令可以完美运行。