使用nodej自动化bash交互,就像从终端键入一样

ovfsdjhp  于 2023-02-15  发布在  Node.js
关注(0)|答案(1)|浏览(95)

我尝试使用“child_process”中的“spawn”与“ssh”实用程序通信(Ubuntu 20,bash 5.0,节点19.6),但收到消息“由于stdin不是终端,因此不会分配伪终端”(使用“-t -t”使它绕过stdout直接打印到终端)。在这种情况下我大概可以只使用一个专用模块,但我怀疑它是否是唯一一个对输入来自何处过于挑剔的程序,我希望将来能避免这个问题。

j2qf4p5b

j2qf4p5b1#

对于ssh man page,您应该使用-T禁用伪tty分配)而不是-t强制伪tty分配)。
此代码生成一个新的子进程,该进程使用提供的用户名和主机名运行ssh命令,然后侦听stdoutstderr流:

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命令:

ssh.stdin.write('ls\n');

要关闭会话,您可以:
1.关闭输入流以通知输入结束

ssh.stdin.end();

1.发送exit命令

ssh.stdin.write('exit\n');

记得相应地替换user@host,适当地处理错误和异常。

相关问题