Est-il possible d'échapper des citations dans les citations d'échappement dans les citations d'échappement dans les citations d'échappement?

Je suppose que quelqu'un me dira que je fais quelque chose de mal et de stupide et noobish, mais j'essaie de script quelque chose de la méthode la plus simple possible et utiliser les commands sudo pour faire quelque chose de spécifique, donc je pense que je fais la bonne chose (où la meilleure alternative réelle serait d'utiliser ansible).

Donc, ce que j'essaie de faire est d'exécuter une command à l'intérieur d'un …

su - someuser -c "ssh someplace \"if ( ! grep <b>[WHAT DO I PUT HERE?]</b>some thing<b>[WHAT DO I PUT HERE]</b> /etc/somefile ); then doSomething; fi\"" 

Ce sont ces citations pour la string de grep qui me déroutent, je vais contourner en grepping pour quelque chose sans espaces pour le moment, mais je préfère grep pour la chose que je veux grep pour.

Donc, si c'est impossible, s'il vous plaît faites le moi savoir.

Faire trois citations n'aide pas, vous venez de décountr, citer, et ne pas citer à nouveau. Vous n'avez pas non plus besoin du sous-shell.

Ce que vous voulez vraiment, c'est:

 su - someuser -c 'ssh someplace "if ! grep \"some thing\" /etc/somefile; then doSomething; fi"' 

Ce type d'approche peut devenir fastidieux rapidement – envisagez simplement de mettre un script sur votre server et de l'exécuter. Cela vous garderait loin de l'enfer citation nichée.

Vous pouvez simplement utiliser un document ici.

 su -someuser -c '<&1 >&2 ssh you@machine sh' 1<<\SCRIPT if ! grep 'some spaces or whatever' /etc/somefile then : do something fi #END SCRIPT 

La solution nécessite un peu de jonglage fd parce que vous aurez besoin de dépasser le mot de passe initial lu à partir de su et su ne transmettra aucun descripteur de file au dessus de 2. Mais une fois que vous avez authentifié su , i / o et donc vous pouvez faire la réaffectation immédiatement et laisser votre shell invoqué à l'autre extrémité lire stdin.