6

ssh経由のリモートコマンドで一重引用符をエスケープするための解決策を読みました。しかし、どんな仕事でも。

私はしようとしています

ssh root@server "ps uax|grep bac | grep -v grep | awk '{ print $2 }' > /tmp/back.tmp"

ぎこちなく働かないで

ssh root@server "ps uax|grep bac | grep -v grep | awk \'{ print $2 }\' > /tmp/back.tmp"
....
awk: '{
awk: ^ caracter ''' inválido en la expresión

そして、コマンドで単一のクォータを設定してみてくださいが、うまくいきません。

適切なヘルプ

4

2 に答える 2

9

このsshコマンドは、ホスト名の後に入力されたすべてのテキストを、実行するリモート コマンドとして扱います。これがあなたの質問にとって重要なことは、あなたが行ったようにコマンド全体を引用する必要がないということです。むしろ、あたかもリモート システム自体にいるかのように入力するようにコマンドを送信することができます。

これにより、使用する必要がある引用符の数が減るため、引用符の問題への対処が簡素化されます。引用符を使用しないため、bash の特殊文字はすべてバックスラッシュでエスケープする必要があります

あなたの状況では、次のように入力する必要があります。

ssh root@server ps uax \| grep ba[c] \| \'{ print \$2 }\' \> /tmp/back.tmp

または、エスケープする代わりに単一引用符を二重引用符で囲むこともできます (どちらの場合も、ドル記号をエスケープする必要があります)。

ssh root@server ps uax \| grep ba[c] \| "'{ print \$2 }'" \> /tmp/back.tmp

正直なところ、これはもう少し複雑に感じますが、引用符のより複雑な使用を伴うコマンドをリモート システムに送信する場合、この知識は非常に重要であることがわかりました。

于 2013-12-02T23:05:13.543 に答える
7

最初の試行では二重引用符を使用するため、文字"をエスケープする必要があります。$

ssh root@server "ps uax|grep bac | grep -v grep | awk '{ print \$2 }' > /tmp/back.tmp"
                                                               ▲

また、次を使用できます。

 ps uax | grep 'ba[c]' | ...

grep -v grepしたがって、ステップは必要ありません。

于 2013-03-22T10:22:44.947 に答える