A string do Grep com caractere especial no servidor remoto usando o ssh

6

Eu tenho um arquivo de log em um servidor Linux remoto com as seguintes informações:

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

Eu estou tentando executar um comando no servidor remoto para grep o ID da mensagem: [email protected] O comando que estou executando é:

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

O problema é com o $ no id da mensagem. Se eu o grep no servidor remoto, eu posso encontrar o id nos logs, cercando o id da mensagem com '[email protected]' , mas quando tento executar o comando através do ssh, parece que não funciona.

    
por seekerkanai 30.03.2017 / 09:30

2 respostas

6

Citar e escapar por SSH é um PITA, então envie o padrão para grep em um pipe:

$ 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

Use a opção -F para que o grep não a trate como regex. A opção -f - diz ao grep para ler padrões de stdin.

Ou cite e escape se precisar:

$ ssh "grep '[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
    
por muru 30.03.2017 / 09:38
3

Para executar um comando grep na máquina remota que contém o sinal $, você precisa:

  • Escape do $ usando \
  • Escape do novo \ usando outro \

i.e. adicionando \ antes do sinal $.

ssh -t root@remoteserver grep 0e1430\[email protected] /root/log
    
por Yaron 30.03.2017 / 09:36