2017-09-16 6 views
0

Debianシステムでnodejs Spawnを使用して次のコマンドを実行したいとします: /usr/bin/apt-get upgrade -s | tail -1 | cut -f1 -d' ' 将来はrootのみのコマンドを使用するため、私は(私が正しいコマンドでvisudoをファイルを更新します)フルシェルアクセスを許可したくない ここで私が原因で「-d」「」パラメータのエラーを持って一度実行私のコードunixコマンドのnode_sにspawnをパラメータに入れて

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(''); 

ですそれは認識されません。私はそれだけである必要があり、二重\でスペースをエスケープしてみてくださいまたは

答えて

1

を両方のパラメータを分割するが、それでもエラー:またはバックスラッシュはエスケープ

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

んが、二重引用符 - それらが使用するためではないシェルのではなく、cutであり、シェルはありません。

これは未知のファイル名(将来のユースケース)を特に簡単に扱います:あなたの文字列が引数として渡されたとき(私の実行中のeval相当のコードを後で悪用しないソフトウェアに)それらをデータとして渡す前に、引用、エスケープ、サニタイズ、またはその他の変更を行うことができます。

(つまり - あなたはあなたのシェルcut -f1 -d" "を伝える際に、実際のシステムコールは、それはCの構文でcutプロセスは、execve("/usr/bin/cut", {"cut", "-f1", "-d ", NULL}, environ)ようになっていることを開始するために呼び出します。引用符は、構文だった、それはそれらを使用する場合、シェルによって消費-dの後のスペースが同じ文字引数の一部でなければならないという決定を下す。

+0

ありがとうチャールズ!それは働いて、私も理解しました;-)私はシェルの必要性を逃しました もう一つのポイント:それは '/ bin/grep -P '^ \ d + upgraded''iのようなコマンドは' spawn 'grep'、['-P'、 '^ \\ d +'、 'upgraded' ']) '? –

+1

''^ \ d + upgraded''はシェルによって単一の文字列に構文解析されるので、' 'spawn(' grep '、[' -P '、'^\\ d + upgraded ']) 'JavaScriptで同じ文字列を書き込むことができます。 –

+0

いくつかの場所から始めます。シェル側での動作を理解するにはhttp://mywiki.wooledge.org/Quotesまたはhttp://wiki.bash-hackers.org/syntax/quoting、http:// mywiki.wooledge.org/BashParser –

関連する問題