Systemd.service: Use a saída de uma função bash para configurar a rede

1

Eu tento escrever um serviço para configurar a interface de rede.
No Sysvinit eu usei um script:

IP=$(fw_printenv -n ipaddr)
ifconfig eth0 $IP netmask 255.255.254.0 up

Agora quero fazer isso em um serviço:

[Service]
Type=oneshot
Environment="IP=$(/sbin/fw_printenv -n ipaddr)"
ExecStart=/sbin/ifconfig eth0 $IP netmask 255.255.255.0 up

Isso não funciona. Em systemctl status -l start-network.service ele diz:

Oct 23 06:17:29 lcd5a-dsp ifconfig[261]: ifconfig: invalid number 'sbin/fw_printenv'

Alguém sabe como usar a saída de uma função como variável em um systemd.service?

    
por Chris J 04.11.2015 / 08:02

1 resposta

3

Observe que Environment="var=$(cmd arg)" não avalia realmente a parte $() . A variável é apenas definida para a string "$ (cmd arg)".

Além disso, ExecStart=... $var ... substituirá $var pela string, mas também dividirá a linha resultante nos espaços, assim você obterá efetivamente "$ (cmd" e "arg)" no resultado. Você precisa usar ${var} para evitar isso e manter a string como um argumento.

No entanto, isso não funcionará, pois nada vai avaliar o $() , portanto, é necessário chamar explicitamente bash -c e passar o comando inteiro como um único argumento, colocando-o entre aspas. Essas aspas não são como citações básicas e não param a expansão de ${var} (embora ele pare de expandir o $ var se ele não estiver por conta própria). Então, finalmente, isso deve funcionar:

ExecStart=/bin/bash -c '/sbin/ifconfig eth0 ${IP} netmask 255.255.255.0 up'
    
por 04.11.2015 / 10:56

Tags