Usando hífens em argumentos do systemd

Usando hífens em argumentos do systemd

Com unidades systemd que possuem argumentos, hifens eoutros especificadoressão substituídos por barras.

Alguns nomes de unidades refletem caminhos existentes no namespace do sistema de arquivos. Exemplo: uma unidade de dispositivo dev-sda.device refere-se a um dispositivo com o nó de dispositivo /dev/sda no namespace do sistema de arquivos. Se isso se aplicar, será usada uma maneira especial de escapar do nome do caminho, para que o resultado possa ser usado como parte de um nome de arquivo. Basicamente, dado um caminho, "/" é substituído por "-", e todos os outros caracteres que não são alfanuméricos ASCII são substituídos por escapes "\x2d" no estilo C

--freedesktop.org

Eu estava tentando passar um argumento com um hífen e percebi que a unidade systemd não substitui meus hífens por uma barra. Então os hífens nem sempre são relacionados? Ou estou apenas interpretando as coisas incorretamente?

Basicamente eu quero passar uma string para uma unidade systemd que passa uma string para o executável que estou executando na unidade.

Por exemplo:

Digamos que eu tenha uma unidade [email protected], dentro da unidade que desejo executar:

/usr/local/bin/my_script param-with-hyphen

Se eu tentar passar o argumento com um hífen para a seguinte unidade assim:

$ systemctl start [email protected]

ExecStart=/usr/local/bin/my_script %i

Ele não converterá a string em param/with/hyphen?

Nos meus testes, o hífen não é substituído.

Fiz uma unidade:/etc/systemd/system/[email protected]

[Unit]
Description=Test arg %i

[Service]
ExecStart=/usr/bin/echo "arg: %i"

e correusystemctl start testunit@test-hyphen

O resultado não substitui o hífen:

$ journalctl -u testunit@test-hyphen
Journal file /var/log/journal/f41c5d772fa24834926605125d59db1b/user-1000@4cc6a20c4391418eb972f65e6ecfafbe-000000000000043c-0005351d59c7b07b.journal is truncated, ignoring file.
-- Logs begin at Fri 2016-06-10 18:15:25 PDT, end at Sat 2016-09-24 23:12:42 PDT
Sep 24 23:12:25 Archon systemd[1]: Started Test arg test-hyphen.
Sep 24 23:12:25 Archon echo[6302]: arg: test-hyphen

Responder1

Você leu mal a documentação:

Basicamente, dado um caminho, "/" é substituído por "-"

As barras em um caminho do sistema de arquivos são substituídas por travessões, mas não diz nada sobre os travessões serem substituídos por barras... e é por isso que, no seu teste, os travessões permanecem como estão. Embora o que provavelmente esteja acontecendo é que seus travessões estão sendo substituídos por \x2d, o que é interpretado à -medida que avança no pipeline.

todos os outros caracteres que não são alfanuméricos ASCII são substituídos por escapes "\x2d" no estilo C

A seção sobre "Especificadores" não parece ter muita relevância aqui, além de permitir que você direcione como seus argumentos são ou não escapados.

Responder2

Odocumentovocê vinculou tem a explicação na mesa: o escape não é desfeito automaticamente, mas você deve solicitá-lo especificamente:

"%i" Nome da instância: Para unidades instanciadas: esta é a string entre o caractere "@" e o sufixo do nome da unidade.
"%I" Nome da instância sem escape: igual a "%i", mas com escape desfeito

Usando %Iem vez de %i, você verá os travessões alterados para hífens conforme descreve.

(Essa formulação é um tanto vaga para mim. "sem escape" pode ser interpretado como significando que o valor não foi escapado, mas significa aqui que o escape foi desfeito.)

informação relacionada