我想在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 \来转义空格,或者在两者中拆分参数但仍然存在错误
答案 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使用。