web-dev-qa-db-fra.com

Chaîne Grep avec un caractère spécial sur un serveur distant utilisant ssh

J'ai un fichier journal sur un serveur linux distant avec les informations suivantes:

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

J'essaie d'exécuter une commande sur le serveur distant pour grep l'identifiant du message: [email protected] La commande que j'exécute est la suivante:

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

Le problème est avec le $ dans l'identifiant du message. Si je l'envoie sur le serveur distant, je peux trouver l'identifiant dans les journaux en entourant l'identifiant du message avec '[email protected]', mais lorsque j'essaie d'exécuter la commande avec ssh, cela ne semble pas fonctionner.

6
seekerkanai

Citant et échappant sur SSH est un PITA, envoyez donc le modèle à grep via un tube:

$ 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

Utilisez l'option -F pour que grep ne le traite pas comme une regex. L'option -f - indique à grep de lire les motifs à partir de stdin.

Ou citer et échapper si vous devez:

$ 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

Pour exécuter une commande grep sur la machine distante contenant le signe $, vous avez besoin des éléments suivants:

  • Échapper le $ en utilisant \
  • Échapper au nouveau\en utilisant un autre \

c'est-à-dire en ajoutant \\ avant le signe $.

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