我尝试使用“child_process”中的“spawn”与“ssh”实用程序通信(Ubuntu 20,bash 5.0,节点19.6),但收到消息“由于stdin不是终端,因此不会分配伪终端”(使用“-t -t”使它绕过stdout直接打印到终端)。在这种情况下我大概可以只使用一个专用模块,但我怀疑它是否是唯一一个对输入来自何处过于挑剔的程序,我希望将来能避免这个问题。
j2qf4p5b1#
对于ssh man page,您应该使用-T(禁用伪tty分配)而不是-t(强制伪tty分配)。此代码生成一个新的子进程,该进程使用提供的用户名和主机名运行ssh命令,然后侦听stdout和stderr流:
-T
-t
ssh
stdout
stderr
const { spawn } = require('child_process'); // define the SSH command to execute and its arguments const ssh = spawn('ssh', ['-T', 'user@host']); // handle SSH output events ssh.stdout.on('data', (data) => console.log(`stdout: ${data}`)); ssh.stderr.on('data', (data) => console.error(`stderr: ${data}`)); ssh.on('close', (code) => console.log(`child process exited with code ${code}`));
要与SSH服务器交互,可以写子进程的stdin流,例如发送ls命令:
stdin
ls
ssh.stdin.write('ls\n');
要关闭会话,您可以:1.关闭输入流以通知输入结束
ssh.stdin.end();
1.发送exit命令
exit
ssh.stdin.write('exit\n');
记得相应地替换user@host,适当地处理错误和异常。
user@host
1条答案
按热度按时间j2qf4p5b1#
对于ssh man page,您应该使用
-T
(禁用伪tty分配)而不是-t
(强制伪tty分配)。此代码生成一个新的子进程,该进程使用提供的用户名和主机名运行
ssh
命令,然后侦听stdout
和stderr
流:要与SSH服务器交互,可以写子进程的
stdin
流,例如发送ls
命令:要关闭会话,您可以:
1.关闭输入流以通知输入结束
1.发送
exit
命令记得相应地替换
user@host
,适当地处理错误和异常。