Escape-символы в systemd ExecStart не работают

Oct 16 2020

У меня есть следующий фрагмент для извлечения значения из файла конфигурации jnlp сервера jenkins. Он работает в терминале «из коробки», но не как единое целое. Мне нужна единица измерения, чтобы я мог куда-нибудь поместить значение и использовать его как переменную среды. Однако я продолжаю получать ошибку escape-последовательности. Я нашел это, что говорит о том, что мне нужно беспокоиться только о кавычках и косых чертах, но я получаю тот же результат. Вот 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'

Я пробовал множество комбинаций escape-символов, но безрезультатно. Кроме того, я использую идентичный шаблон для извлечения значения из метаданных (используя curl, piping и т. Д.), И он отлично работает. Определенно смущен тем, что здесь происходит

Ответы

1 meuh Oct 16 2020 at 18:53

Простой способ отладки это добавить параметр -vк sh -cдля того , чтобы увидеть , что Systemd на самом деле его принятия. Если мы сделаем это, мы увидим, что получаем (уменьшено для удобства чтения):

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

Синтаксическая ошибка заключается в том, что команда sed в двойных кавычках имеет внутри "вместо \". Это происходит потому , что Systemd заменяет \"по "разбору в ExecStartстроке.

Вам нужно передать обратную косую черту sh, используя \\(что systemd сократит до \), а затем двойные кавычки:

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