通过 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.write
和 process.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
.
已解决:
我必须在 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.write
和 process.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
.