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
.