ssh与nodejs child_process,在服务器上找不到命令

我试图通过nodejs child_process运行一个简单的ssh命令。 当我通过nodejs代码运行命令,它失败,说我发送到服务器的命令没有find。 当我运行相同的命令只是复制和粘贴到我的terminal窗口,它运行良好。

这里是我想要做的命令行版本:

ssh user@example.com 'ls -lai' 

这里是使用child_process的相同ssh命令的nodejs版本

 var cproc = require('child_process'); var exec = cproc.exec; var spawn = cproc.spawn; var command = "ssh"; var args = ["user@example.com", "'ls -lai'"]; var child = spawn(command, args); child.stdout.on('data', function(data) { console.log('stdout: ' + data); }); child.stderr.on('data', function(data) { console.log('stderr: ' + data); }); child.on('close', function(code) { console.log('exit code: ' + code); process.exit(); }); 

从命令行版本的输出正是我所期望的…我得到的目录列表。 但是当我运行这个nodejs代码来执行相同的命令,stderrcallback代码踢,和命令返回代码127(命令未find)。

 $ node test-ssh.js stderr: bash: ls -lai: command not found exit code: 127 

根据这里的输出,'ls -lai'命令没有find…但是没有任何意义,因为当我从terminal提示符直接运行这个命令时,它工作的很好。

谁知道为什么通过nodejs运行ssh会导致这种情况发生?

原来在远程命令周围的单引号是问题。

var args = ["user@example.com", "ls -lai"];

它的工作

我也有这个问题,但是由于我一次尝试运行多个命令,所以我认为这些引用对我来说是必需的,我一直在试图find一个解决方法。

例如:

 var args = ["user@example.com", "'cd ~ && ls -lai'"] 

会打破。 但是,您仍然可以省略引号,并且所有内容都将通过SSH正确执行,因为child_process会将其作为单个parameter passing:

 var args = ["user@example.com", "cd ~ && ls -lai"]