在nodejs中为参数中带空格的unix命令生成

时间:2017-09-16 13:49:22

标签: node.js linux parameters spawn

我想在Debian系统上使用nodejs Spawn执行以下命令: /usr/bin/apt-get upgrade -s | tail -1 | cut -f1 -d' ' 我想使用spawn而不是exec,因为将来只使用root命令,我不想允许完全shell访问(我将用正确的命令更新visudo文件) 这是我的代码

  const apt = spawn('/usr/bin/apt-get', ['upgrade', '-s']);
  const tail = spawn('tail', ['-1']);
  const cut = spawn('cut', ['-f1', '-d" "']);

  apt.stdout.on('data', (data) => {
    tail.stdin.write(data);
  });

  tail.stdout.on('data', (data) => {
    cut.stdin.write(data);
  });

  cut.stdout.on('data', (data) => {
    console.log(data.toString());
  });


  apt.stderr.on('data', (data) => {
    console.log("apt stderr: ${data}");
  });

  tail.stderr.on('data', (data) => {
    console.log("tail stderr: ${data}");
  });

  cut.stderr.on('data', (data) => {
    console.log("cut stderr: ${data}");
  });

  apt.on('close', (code) => {
    if (code !== 0) {
      console.log("apt process exited with code ${code}");
    }
  });

  tail.on('close', (code) => {
    if (code !== 0) {
      console.log("tail process exited with code ${code}");
    }
  });

  cut.on('close', (code) => {
    if (code !== 0) {
      console.log("cut process exited with code ${code}");
    }
  });

  res.status(200).json('');

一旦执行,我就会因为' -d"而出错。 "'无法识别的参数。我尝试使用double \来转义空格,或者在两者中拆分参数但仍然存在错误

1 个答案:

答案 0 :(得分:1)

应该是:

const cut = spawn('cut', ['-f1', '-d ']);

没有双引号反斜杠转义 - 那些是用于的,而不是cut,而且这里没有shell

这使得处理未知文件名(对于您将来的用例)变得特别容易:当您的字符串作为参数传递时(对于不会滥用它们的软件我运行eval - 稍后的等效代码),在将数据作为数据传递之前,您不需要引用,转义,清理或修改它们。

(也就是说 - 当你告诉你的shell cut -f1 -d" "时,它调用的实际系统调用以C语法开始cut进程,看起来像execve("/usr/bin/cut", {"cut", "-f1", "-d ", NULL}, environ);引号是语法的,当shell使用它们来决定-d之后的空格应该是同一个文字参数的一部分时,它被shell使用。