Escape-Zeichen in systemd ExecStart schlagen fehl

Oct 16 2020

Ich habe das folgende Snippet, um einen Wert aus einer jnlp-Konfigurationsdatei des Jenkins-Servers zu extrahieren. Es funktioniert sofort im Terminal, aber nicht als Einheit. Ich möchte eine Einheit, damit ich den Wert irgendwo platzieren und als Umgebungsvariable verwenden kann. Ich erhalte jedoch immer wieder einen Escape-Sequenzfehler. Ich habe dies gefunden, was darauf hindeutet, dass ich mich nur um Anführungszeichen und Schrägstriche kümmern muss, aber ich erhalte das gleiche Ergebnis. Hier ist die ExecStartDatei mit dem Sed enthalten:

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'

Ich habe viele Kombinationen von Escape-Charakteren ohne Erfolg ausprobiert. Außerdem verwende ich ein identisches Muster, um einen Wert aus Metadaten zu extrahieren (mithilfe von Curl, Piping usw.), und das funktioniert einwandfrei. Auf jeden Fall verwirrt darüber, was hier passiert

Antworten

1 meuh Oct 16 2020 at 18:53

Die einfache Möglichkeit, dies zu debuggen, besteht darin, dem eine Option hinzuzufügen -v, sh -cum zu sehen, welches Systemd es tatsächlich übergibt. Wenn wir dies tun, können wir sehen, dass wir bekommen (aus Gründen der Lesbarkeit reduziert):

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

Der Syntaxfehler besteht darin, dass der Befehl in doppelten Anführungszeichen für sed "statt darin enthalten ist \". Dies liegt daran, dass systemd in der Zeichenfolge wahllos \"durch ersetzt wird ."ExecStart

Sie müssen einen Backslash übergeben, shindem Sie \\(auf welches Systemd reduziert wird \) und dann das doppelte Anführungszeichen verwenden:

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