使用 ssh 在远程服务器上使用 Grep 包含特殊字符的字符串

使用 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

我正在尝试在远程服务器上运行命令来 grep 消息 id:[email protected]我正在运行的命令是:

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

问题出$在消息 ID 中。如果我在远程服务器上 grep 它,我能够通过在消息 ID 周围使用 来在日志中找到 ID,但是当我尝试通过 ssh 运行命令时,它似乎不起作用。'[email protected]'

答案1

通过 SSH 引用和转义很麻烦,因此通过管道将模式发送给 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

答案2

为了在包含 $ 符号的远程机器上执行 grep 命令,您需要:

  • 使用 \ 转义 $
  • 使用另一个 \ 转义新的 \

\\即在 $ 符号前添加。

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

相关内容