ssh с nodejs child_process, команда не найдена на сервере

Я пытаюсь запустить простую команду ssh через nodejs child_process. когда я запускаю команду через код nodejs, он не говорит, что команда, которую я отправил на сервер, не найдена. когда я запускаю ту же команду, просто скопируйте и вставьте в окно терминала, все работает нормально.

вот версия командной строки того, что я пытаюсь сделать:

ssh [email protected] 'ls -lai'

а вот версия той же команды ssh для nodejs, использующая child_process

var cproc = require('child_process');
var exec = cproc.exec;
var spawn = cproc.spawn;

var command = "ssh";
var args = ["[email protected]", "'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 для выполнения той же команды, срабатывает код обратного вызова stderr, и команда возвращает код 127 (команда не найдена).

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

exit code: 127

судя по выходным данным, команда 'ls -lai' не найдена... но это не имеет смысла, так как она отлично работает, когда я запускаю ее напрямую из командной строки терминала.

кто-нибудь знает, почему запуск ssh через nodejs может привести к этому?


person Derick Bailey    schedule 27.12.2014    source источник


Ответы (2)


Оказывается, проблема заключалась в одинарных кавычках вокруг удаленной команды.

var args = ["[email protected]", "ls -lai"];

и это работает

person Derick Bailey    schedule 27.12.2014

У меня тоже была эта проблема, но я думал, что кавычки были для меня необходимостью из-за того, что я пытался запустить несколько команд одновременно, и я продолжал пытаться найти способ обойти это.

Например:

var args = ["[email protected]", "'cd ~ && ls -lai'"]

сломался бы. Однако вы все равно можете опустить кавычки, и через SSH все будет выполняться корректно, так как child_process передаст его как один аргумент:

var args = ["[email protected]", "cd ~ && ls -lai"]
person sjagr    schedule 16.10.2015