菌种中的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
之后的空格应该是相同文字参数的一部分)。
谢谢Charles!这工作,我也明白为什么;-)我错过了壳的需求 另一点:这意味着像'/ bin/grep -P'^ \ d +升级''i这样的命令将不得不像'spawn( 'grep',['-P','“^ \\ d +','upgraded''])'? –
''^ \ d + upgraded''被shell解析为单个字符串(这是语法单引号的效果之一),所以它会被'spawn'('grep',['-P','^\\ d +升级'])'在JavaScript中编写相同的单个字符串。 –
有些地方开始重新:理解这如何在shell一边工作可能是http://mywiki.wooledge.org/Quotes或http://wiki.bash-hackers.org/syntax/quoting和http:// mywiki.wooledge.org/BashParser –