J'essaie de configurer Upstart pour qu'il exécute un petit utilitaire devant accéder à un terminal en tant que démon à l'échelle du système. Lorsqu'il est exécuté à partir de la ligne de commande, l'utilitaire reste au premier plan et ne se ferme pas avant un Ctrl + C; J'ai donc omis la strophe expect
et Upstart suit correctement le PID. J'ai également créé un compte sans privilège pour le démon en utilisant adduser --system --no-create-home --disabled-login avrlirc
.
Sur mon système, le tty auquel l'utilitaire a besoin d'accéder est installé en tant que:
crw-rw---- 1 root dialout 166, 0 May 24 19:25 ttyACM0
J'ai donc ajouté l'utilisateur avrlirc
(créé ci-dessus) au groupe dialout
. Lorsque je lance l'utilitaire en tant que avrlirc
tout fonctionne comme prévu. J'ai ajouté la strophe setuid avrlirc
au fichier de configuration d'Upstart et le travail échoue avec "ne peut pas ouvrir le tty".
Si j'omets la strophe setuid
, ça marche (donc c'est probablement une question d'autorisations). Si j'ajoute la strophe setgid dialout
à côté de setuid
, cela fonctionne également.
Alors, pourquoi ai-je besoin de setgid
alors que j’ai déjà setuid
et que l’utilisateur est membre du groupe approprié - pourquoi cela ne suffit-il pas?
Pour référence, le fichier de configuration du travail Upstart est:
start on runlevel [2345]
stop on runlevel [016]
console log
setuid avrlirc
setgid dialout
exec /usr/local/bin/avrlirc2udp -f -H -h <IP_ADDRESS> -t /dev/ttyACM0
Où <IP_ADDRESS>
est l'adresse IPv4 de la boîte locale et dans 192.168.0.0/16.
setuid
ne définit pas de groupes supplémentaires, mais uniquement des groupes primaires. Voir le bogue Upstart https://bugs.launchpad.net/upstart/+bug/81287 .
Pour vérifier le cas, vous pouvez vérifier grep Gid /proc/YOURPID/status
vs id YOURUSER
.