Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 在nodejs中生成参数中带有空格的unix命令_Node.js_Linux_Parameters_Spawn - Fatal编程技术网

Node.js 在nodejs中生成参数中带有空格的unix命令

Node.js 在nodejs中生成参数中带有空格的unix命令,node.js,linux,parameters,spawn,Node.js,Linux,Parameters,Spawn,我想在Debian系统上使用nodejs Spawn执行以下命令: /usr/bin/apt get升级-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']);

我想在Debian系统上使用nodejs Spawn执行以下命令:

/usr/bin/apt get升级-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\转义空格,或在两个参数中拆分参数,但仍有错误

它应该是:

const cut = spawn('cut', ['-f1', '-d ']);
没有双引号或反斜杠转义——它们是用于shell的,而不是
cut
,这里没有shell

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


(也就是说,当您告诉shell
cut-f1-d”“
时,它为启动
cut
进程而调用的实际系统调用在C语法中类似于
execve(“/usr/bin/cut”,{“cut”,“-f1”,“-d”,NULL},environ)
;引号是语法性的,当shell使用引号来决定
-d
后面的空格应该是同一个文本参数的一部分时,就会使用引号)。

谢谢Charles!这很有效,我也明白为什么;-)我忽略了shell需要的另一点:这意味着对于像
/bin/grep-P'^\d+graded'
这样的命令,我必须像
spawn('grep',['-P','^\\d+','graded'])那样编写它。
'^\d+graded'
被shell解析为单个字符串(这是语法单引号的效果之一),因此,用JavaScript编写相同的字符串应该是
spawn('grep',['-P','^\\d+graded'])