Caracteres de escape na falha do ExecStart do systemd

Oct 16 2020

Eu tenho o seguinte trecho para extrair um valor de um arquivo de configuração jnlp do servidor jenkins. Ele funciona fora da caixa no terminal, mas não como uma unidade. Quero uma unidade para poder colocar o valor em algum lugar e usá-lo como uma variável de ambiente. No entanto, continuo recebendo um erro de sequência de escape. Achei isso que sugere que só preciso me preocupar com aspas e barras, mas obtenho o mesmo resultado. Aqui está o ExecStartdo arquivo com o sed incluído:

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'

Eu tentei muitas combinações de caracteres de escape sem sucesso. Além disso, eu uso um padrão idêntico para extrair um valor de metadados (usando curl, piping, etc) e isso funciona bem. Definitivamente confuso sobre o que está acontecendo aqui

Respostas

1 meuh Oct 16 2020 at 18:53

A maneira fácil de depurar isso é adicionar uma opção -vao sh -cpara ver o que o systemd está realmente passando. Se fizermos isso, podemos ver que estamos obtendo (reduzido para facilitar a leitura):

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

O erro de sintaxe é que o comando entre aspas dado ao sed tem dentro dele em "vez de \". Isso ocorre porque o systemd substitui \"por "indiscriminadamente na ExecStartstring.

Você precisa passar uma barra invertida para shusando \\(para a qual o systemd será reduzido \) e, em seguida, a aspa dupla:

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