web-dev-qa-db-ja.com

エスケープクォート内のエスケープクォート内のエスケープクォート内のクォートをエスケープすることは可能ですか?

私がやろうとしているのは、内部でコマンドを実行することです...

su - someuser -c "ssh someplace \"if ( ! grep <b>[WHAT DO I PUT HERE?]</b>some thing<b>[WHAT DO I PUT HERE]</b> /etc/somefile ); then doSomething; fi\""

私を混乱させているのはgrep文字列の引用符です。今のところ、スペースのないものをgrepすることで回避しますが、grepしたいものをgrepしたいと思います。

4
Peter Turner

3つの引用符を実行しても効果はありません。引用符を外し、引用符を付けて、もう一度引用符を外します。サブシェルも必要ありません。

あなたが本当に欲しいのは:

su - someuser -c 'ssh someplace "if ! grep \"some thing\" /etc/somefile; then doSomething; fi"'

この種のアプローチはすぐに扱いにくくなる可能性があります。サーバーにスクリプトを配置して実行することを検討してください。それはあなたをネストされた引用地獄から遠くに遠ざけるでしょう。

3
Chris Down

ヒアドキュメントを使用できます。

su -someuser -c '<&1 >&2 ssh you@machine sh' 1<<\SCRIPT
    if   ! grep 'some spaces or whatever' /etc/somefile
    then : do something
    fi
#END
SCRIPT

suから読み取った最初のパスワードを通過する必要があり、suは2を超えるファイル記述子を渡さないため、このソリューションでは少しfdジャグリングが必要です。認証されたsusshはI/Oに失敗しないため、すぐに再割り当てを実行して、もう一方の端で呼び出されたシェルにstdinを読み取らせることができます。

3
mikeserv