Node.js是child_process exec,stdin没有被传递给ssh

Jus*_*tin 3 javascript ssh stdin child-process node.js

我有以下Node.js代码ssh到服务器,它很好地转发stdout,但每当我输入任何东西它不转发到服务器.如何将本地stdin转发到ssh连接stdin?

var command = 'ssh -tt -i ' + keyPath + ' -o StrictHostKeyChecking=no ubuntu@' + hostIp;

var ssh = child_proc.exec(command, {
    env: process.env
});

ssh.stdout.on('data', function (data) {
    console.log(data.toString());
});

ssh.stderr.on('data', function (data) {
    console.error(data.toString());
});

ssh.on('exit', function (code) {
    process.exit(code);
});
Run Code Online (Sandbox Code Playgroud)

msc*_*dex 7

如果要将process.stdin子流程传递给子进程,有两种方法可以实现:

  • 子进程具有stdin表示子进程的标准输入的属性.所以你需要做的就是添加process.stdin.pipe(ssh.stdin)

  • 您可以stdio在生成进程时指定自定义,以告诉它为子进程的stdin使用什么:

    child_proc.exec(command, { env: process.env, stdio: [process.stdin, 'pipe', 'pipe'] })
    
    Run Code Online (Sandbox Code Playgroud)

此外,在半相关的说明中,如果您想避免产生子进程并且具有更多编程控制和/或具有更轻量级的ssh/sftp连接,则存在该ssh2模块.

  • 将`ssh.stdout`和`ssh.stderr`处理程序分别改为pipe,`ssh.stdout.pipe(process.stdout)`和`ssh.stderr.pipe(proces.stderr)`.原因是`console.*`方法在输出中附加换行符. (3认同)