Подтвердить что ты не робот

Node.js Shell Script И аргументы

Мне нужно выполнить bash script в node.js. В принципе, script создаст учетную запись пользователя в системе. Я наткнулся на этот пример, который дает мне представление о том, как это сделать. Тем не менее, script сам нуждается в таких аргументах, как имя пользователя, пароль и настоящее имя пользователя. Я до сих пор не могу понять, как передать эти аргументы в script что-то вроде этого:

var commands = data.toString().split('\n').join(' && ');

Есть ли у кого-нибудь идея, как я могу передать эти аргументы и выполнить bash script внутри node.js через ssh-соединение. спасибо

4b9b3361

Ответ 1

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

Непосредственно из документации, с пояснениями комментариев inline

var util  = require('util'),
    spawn = require('child_process').spawn,
    ls    = spawn('ls', ['-lh', '/usr']); // the second arg is the command 
                                          // options

ls.stdout.on('data', function (data) {    // register one or more handlers
  console.log('stdout: ' + data);
});

ls.stderr.on('data', function (data) {
  console.log('stderr: ' + data);
});

ls.on('exit', function (code) {
  console.log('child process exited with code ' + code);
});

В то время как с exec

var util = require('util'),
    exec = require('child_process').exec,
    child;

child = exec('cat *.js bad_file | wc -l', // command line argument directly in string
  function (error, stdout, stderr) {      // one easy function to capture data/errors
    console.log('stdout: ' + stdout);
    console.log('stderr: ' + stderr);
    if (error !== null) {
      console.log('exec error: ' + error);
    }
});

Наконец, обратите внимание, что exec буферизирует вывод. Если вы хотите передать поток обратно клиенту, вы должны использовать spawn.

Ответ 2

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

var child = exec('cat *.js | wc -l', function(error, stdout, stderr) {
  if (error) console.log(error);
  process.stdout.write(stdout);
  process.stderr.write(stderr);
});

Этот способ лучше, потому что console.log будет печатать пустые строки.

Ответ 3

Вы можете использовать process.argv. Это массив, содержащий аргументы командной строки. Первый элемент будет node, второй элемент будет именем файла JavaScript. Все последующие элементы будут представлять собой любую дополнительную командную строку, которую вы указали.

Вы можете использовать его как:

var username = process.argv[2];
var password = process.argv[3];
var realname = process.argv[4];

Или итерации по массиву. Посмотрите на пример: http://nodejs.org/docs/latest/api/all.html#process.argv