setuid não define grupos suplementares, apenas grupo primário. Veja o link Upstart .
Para verificar o caso, você pode verificar grep Gid /proc/YOURPID/status vs id YOURUSER .
Estou tentando configurar o Upstart para executar um pequeno utilitário que precisa acessar um tty como um daemon do sistema. Quando executado a partir da linha de comando, o utilitário permanece em primeiro plano e não sai até um Ctrl + C; Portanto, omiti a estrofe expect e o Upstart está rastreando corretamente o PID. Eu também criei uma conta sem privilégios para o daemon usando adduser --system --no-create-home --disabled-login avrlirc .
No meu sistema, o tty que o utilitário precisa acessar é instalado como:
crw-rw---- 1 root dialout 166, 0 May 24 19:25 ttyACM0
Então, adicionei o usuário avrlirc (criado acima) ao grupo dialout . Quando executo o utilitário como avrlirc , tudo funciona conforme o esperado. Adicionei a sub-rotina setuid avrlirc ao arquivo de configuração Upstart e a tarefa falha com "cannot open tty".
Se eu omitir a sub-rotina setuid , isso funcionará (por isso é provável que seja uma permissão). Se eu adicionar a sub-rotina setgid dialout ao lado de setuid , também funcionará.
Então, por que preciso de setgid quando já tenho setuid e o usuário é membro do grupo apropriado? Por que isso não é suficiente?
Para referência, o arquivo de configuração do trabalho Upstart é:
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
Em que <IP_ADDRESS> é o endereço IPv4 da caixa local e dentro de 192.168.0.0/16.
setuid não define grupos suplementares, apenas grupo primário. Veja o link Upstart .
Para verificar o caso, você pode verificar grep Gid /proc/YOURPID/status vs id YOURUSER .