我在远程 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