Systemd

systemd ExecStart 中的轉義字元失敗

  • October 16, 2020

我有以下程式碼片段從 jenkins 伺服器 jnlp 配置文件中提取值。它在終端中開箱即用,但不能作為一個單元使用。我想要一個單位,這樣我就可以將值放在某個地方並將其用作環境變數。但是我不斷收到轉義序列錯誤。我發現表明我只需要擔心引號和斜杠,但我得到了相同的結果。這是ExecStart包含 sed 的文件:

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'

我嘗試了許多轉義字元的組合都無濟於事。此外,我使用相同的模式從元數據中提取值(使用 curl、管道等)並且效果很好。絕對對這裡發生的事情感到困惑

調試它的簡單方法是向 中添加選項-vsh -c以查看 systemd 實際傳遞的內容。如果我們這樣做,我們可以看到我們得到(為了可讀性而減少):

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

語法錯誤是給 sed 的雙引號命令在其中包含"而不是\". 這是因為 systemd在字元串中不加選擇地替換\"了 by 。"``ExecStart

您需要sh通過使用\\(systemd 將減少為\)傳遞反斜杠,然後使用雙引號:

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

引用自:https://serverfault.com/questions/1038885