web-dev-qa-db-ja.com

sshを使用したリモートサーバー上の特殊文字を含むGrep文字列

リモートLinuxサーバーに次の情報を含むログファイルがあります。

Mar 29 18:15:06 mailserver amavis[12049]: (12049-13) Passed CLEAN {RelayedInbound}, [111.111.111.111]:25667 [111.111.111.111] <[email protected]> -> <[email protected]>,<[email protected]>, Queue-ID: 7711E18023F, Message-ID: <[email protected]>, mail_id: GQj-5bhH37Yi, Hits: -, size: 15551, queued_as: EE75C180429, 148 ms

リモートサーバーでコマンドを実行してメッセージIDをgrepしようとしています:[email protected]私が実行しているコマンドは次のとおりです。

ssh -t root@remoteserver grep [email protected] /root/log

問題は、メッセージIDの$にあります。リモートサーバーでgrepを実行すると、メッセージIDを'[email protected]'で囲むことでログ内のIDを見つけることができますが、sshを介してコマンドを実行しようとしても機能しないようです。

6
seekerkanai

SSHを介した引用とエスケープはPITAであるため、パイプを介してgrepにパターンを送信します。

$ echo '[email protected]' | ssh localhost grep -Ff - foo
Mar 29 18:15:06 mailserver amavis[12049]: (12049-13) Passed CLEAN {RelayedInbound}, [111.111.111.111]:25667 [111.111.111.111] <[email protected]> -> <[email protected]>,<[email protected]>, Queue-ID: 7711E18023F, Message-ID: <[email protected]>, mail_id: GQj-5bhH37Yi, Hits: -, size: 15551, queued_as: EE75C180429, 148 ms

-Fオプションを使用して、grepが正規表現として扱わないようにします。 -f -オプションは、grepにstdinからパターンを読み取るように指示します。

または、必要な場合は引用してエスケープします。

$ ssh "grep '0e1430\[email protected]' bar"
Mar 29 18:15:06 mailserver amavis[12049]: (12049-13) Passed CLEAN {RelayedInbound}, [111.111.111.111]:25667 [111.111.111.111] <[email protected]> -> <[email protected]>,<[email protected]>, Queue-ID: 7711E18023F, Message-ID: <[email protected]>, mail_id: GQj-5bhH37Yi, Hits: -, size: 15551, queued_as: EE75C180429, 148 ms
6
muru

$記号を保持するリモートマシンでgrepコマンドを実行するには、次のものが必要です。

  • \を使用して$をエスケープします
  • 別の\を使用して新しい\をエスケープします

つまり、$記号の前に\\を追加します。

ssh -t root@remoteserver grep 0e1430\\[email protected] /root/log
3
Yaron