Les caractères d'échappement dans systemd ExecStart échouent

Oct 16 2020

J'ai l'extrait suivant pour extraire une valeur d'un fichier de configuration jnlp du serveur jenkins. Cela fonctionne directement dans le terminal, mais pas comme une unité. Je veux une unité pour pouvoir mettre la valeur quelque part et l'utiliser comme variable d'environnement. Cependant, j'obtiens toujours une erreur de séquence d'échappement. J'ai trouvé cela qui suggère que je n'ai qu'à me soucier des guillemets et des barres obliques, mais j'obtiens le même résultat. Voici ExecStartle fichier avec le sed inclus:

ExecStart=/bin/sh -c 'curl -L -s -X GET http://10.x.x.x:8080/computer/name-of-executor/slave-agent.jnlp | sed \"s/.*<application-desc main-class=\"hudson.remoting.jnlp.Main\"><argument>\([a-z0-9]*\).*/\1/\" >> /etc/build_environment'

J'ai essayé de nombreuses combinaisons de caractères d'échappement en vain. De plus, j'utilise un modèle identique pour extraire une valeur des métadonnées (en utilisant curl, piping, etc.) et cela fonctionne très bien. Certainement confus sur ce qui se passe ici

Réponses

1 meuh Oct 16 2020 at 18:53

Le moyen le plus simple de déboguer ceci est d'ajouter une option -vau sh -cafin de voir quel systemd le transmet réellement. Si nous faisons cela, nous pouvons voir que nous obtenons (réduit pour la lisibilité):

curl ... | sed "s/... main-class="hudson...">.../\1/" >>...

L'erreur de syntaxe est que la commande entre guillemets double donnée à sed contient à la "place de \". C'est parce que systemd remplace \"par "indistinctement dans la ExecStartchaîne.

Vous devez passer une barre oblique inverse à shen utilisant \\(auquel systemd se réduira \), puis le guillemet double:

ExecStart=/bin/sh -cv 'curl... | sed "s/...main-class=\\"hudson...