通过 child_process 使用脚本 + 屏幕

Using script + screen through child_process

已解决: 我必须在 program.stdin.write(data) 处添加 \r\n(类似于 program.stdin.write(data+'\r\n'))并且它有效。

看来如果我不输入\r\n,它不会触发,这就像在不按回车键的情况下输入一行,所以它永远不会被处理。

============================================= ==============================

我需要通过 child_process 访问屏幕,但它不能正常工作。 首先我尝试使用 spawn 访问。

const {spawn} = require('child_process');
const program = spawn('screen',['-x User/Aplication']);

program.stdout.on('data',data=>{
//Something
})

function writeTo(data){
program.stdin.write(data);
}

但是我收到错误“必须连接到终端错误”。经过一些研究,我找到了解决方案,使用 script+spawn 制作一个伪控制台。

const {spawn} = require('child_process');
const program = spawn('script',['/dev/null']);//Pseudo-console
program.stdin.write('screen -x User/Aplication');//I access to screen through the pseudo-console, and it works.

program.stdout.on('data',data=>{
//Something
})

function writeTo(data){
program.stdin.write(data);
}

但是...当我尝试使用 writeTo 时,它不起作用。

writeTo('Some command here')//Does nothing.

不知何故,当我通过管道输入控制台时,它起作用了!

process.stdin.pipe(program.stdin);

然后我在我的控制台中输入一些内容,它正确地代理连接 screen

问题:使用program.stdin.write时它不能正确代理,但不知何故,当我通过管道传输我的控制台时它可以工作process.stdin.pipe(program.stdin)

观察 1:我制作了一个简短的回显程序,它适用于 program.stdin.writeprocess.stdin.pipe(program.stdin)

echo.js

process.stdin.on('data',data=>{
console.log(`[Input]${data}`);
})

main.js

const {spawn} = require('child_process');
const program = spawn('node',['echo.js']);

program.stdout.pipe(process.stdout);

function writeTo(data){
program.stdin.write(data);
}

writeTo('Test');//Output: [Input]Test
process.stdin.pipe(program.stdin);//I type 'something'. Output: [Input]something

观察 2:当使用 script+screen 和管道我的控制台时,program.stdin.write 只有 'buffers' 和 process.stdin.pipe 加载该缓冲区并将其与我键入的内容一起发送。

program.stdin.write('He');//screen receives nothing
program.stdin.write('llo');//screen receives nothing
process.stdin.pipe(program.stdin);//I type ' world!'. screen receives 'Hello world!'

这可能不是全部问题,但 spawn 的第二个参数应该在单独的数组元素中包含每个参数。

const program = spawn('screen',['-x', 'User/Aplication']);

我必须在 program.stdin.write(data) 处添加 \r\n(类似 program.stdin.write(data+'\r\n') 的内容)并且成功了。

似乎如果我不输入 \r\n,它不会作为换行触发,也不会发送,就像输入 all commands in a line without pressing enter so it will never be processed.