Node.js Shell脚本和参数

42

我需要在node.js中执行一个bash脚本。基本上,该脚本将在系统上创建用户帐户。我看到了这个例子,让我有了思路。但是,脚本本身需要像用户名、密码和用户真实姓名之类的参数。我仍然不知道如何传递这些参数给脚本,类似于以下操作:

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

有没有人知道我如何在node.js中通过ssh连接传递参数并执行bash脚本。

谢谢

3个回答

68

请查看此处的文档链接。该文档详细说明了如何传递命令行参数。请注意,您可以使用execspawnspawn有一个特定的参数用于命令行参数,而使用exec时,您只需将参数作为要执行的命令字符串的一部分传递即可。

直接从文档中获得,内联有解释注释

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


谢谢您的回复。实际上我的意思是,该命令本身在一个需要参数的Bash脚本中。我不知道如何在读取Bash文件内容时使用Node.js传递这些参数。 - joque
1
@joque,我不知道你的意思。如果你是在CLI上调用脚本,你可以使用command arg1 arg2...来执行,就像示例中所示的那样,在node中也是同样适用的。 - hvgotcodes
嗨@hvgotcodes,我想按照[http://blog.nodejitsu.com/nodejs-cloud-server-in-three-minutes]中的步骤执行脚本,并**传递参数**。目前,除非我将其分解成一个个命令,否则我不知道该怎么做。你明白我的意思吗? - joque
2
我只是好奇,你为什么需要 util - KJ Price
@hvgotcodes 我该如何使用spawn来运行'sudo hcitool lescan --duplicates &'? - ozata

11
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将打印空行。


请查看以下关于将exec函数转换为Promise的答案:https://dev59.com/PF0a5IYBdhLWcg3wD1Ae#56095793 - What Would Be Cool

10

你可以使用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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接