Node.js 在nodejs中生成参数中带有空格的unix命令
我想在Debian系统上使用nodejs Spawn执行以下命令: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']);
/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'])