2 votes

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

J'ai l'extrait suivant pour extraire une valeur d'un fichier de configuration jnlp d'un serveur jenkins. Il fonctionne dans le terminal mais pas en tant qu'unité. Je veux une unité pour pouvoir mettre la valeur quelque part et l'utiliser comme variable d'environnement. Cependant, je continue à obtenir une erreur de séquence d'échappement. J'ai trouvé qui suggère que je ne dois me préoccuper que des guillemets et des barres obliques, mais j'obtiens le même résultat. Voici le résultat ExecStart du 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, sans succès. De plus, j'utilise un modèle identique pour extraire une valeur des métadonnées (en utilisant curl, piping, etc.) et cela fonctionne bien. Je ne comprends vraiment pas ce qui se passe ici

1voto

user8026 Points 11

La façon la plus simple de déboguer ce problème est d'ajouter l'option -v a la sh -c afin de voir ce que systemd lui transmet. Si nous faisons cela, nous pouvons voir que nous obtenons (réduit pour plus de lisibilité) :

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

L'erreur de syntaxe réside dans le fait que la commande entre guillemets donnée à sed contient les éléments suivants " au lieu de \" . En effet, systemd remplace \" por " sans distinction dans les ExecStart chaîne de caractères.

Vous devez passer une barre oblique inverse à sh en utilisant \\ (que systemd réduira à \ ), puis le guillemet double :

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X