菌种中的NodeJS的unix命令与参数空间

问题描述:

我想在Debian系统上执行使用的NodeJS菌种以下命令: /usr/bin/apt-get upgrade -s | tail -1 | cut -f1 -d' ' 我想用产卵并没有因为根的未来重复使用exec命令只和我不想让一个完整的shell访问(我将更新与正确的命令visudo命令文件) 这里是我的代码菌种中的NodeJS的unix命令与参数空间

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”“”参数的错误这是不被承认的。我尝试用双\逃逸的空间或两者,但仍错误分裂参数

应该仅仅是:

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

没有双引号反斜杠 - 这些都是使用的外壳,而不是cut,这里没有外壳。

这使得处理未知文件名(为你将来的使用情况)特别容易:当你的字符串作为参数(软件不晚滥用他们我跑步eval换算后的代码)过去了,你不需要引用,转义,消毒或以其他方式修改它们,然后才能将其作为数据传递。

(也就是说 - 当你告诉你的shell cut -f1 -d" ",它调用来启动cut过程中的实际系统调用,在C语法,看起来就像execve("/usr/bin/cut", {"cut", "-f1", "-d ", NULL}, environ);引号是语法,由壳消耗时,它使用了他们以决定-d之后的空格应该是相同文字参数的一部分)。

+0

谢谢Charles!这工作,我也明白为什么;-)我错过了壳的需求 另一点:这意味着像'/ bin/grep -P'^ \ d +升级''i这样的命令将不得不像'spawn( 'grep',['-P','“^ \\ d +','upgraded''])'? –

+1

''^ \ d + upgraded''被shell解析为单个字符串(这是语法单引号的效果之一),所以它会被'spawn'('grep',['-P','^\\ d +升级'])'在JavaScript中编写相同的单个字符串。 –

+0

有些地方开始重新:理解这如何在shell一边工作可能是http://mywiki.wooledge.org/Quotes或http://wiki.bash-hackers.org/syntax/quoting和http:// mywiki.wooledge.org/BashParser –