2017-09-16 60 views
0

我想在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」「」參數的錯誤這是不被承認的。我嘗試用雙\逃逸的空間或兩者,但仍錯誤分裂參數

回答

1

應該僅僅是:

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 –