Os curingas dos Sudoers são suportados apenas com globbing ( man glob
, man fnmatch
). No entanto, os comandos start
, stop
, restart
(, etc.) para systemctl
não podem ser globbed, pois não são arquivos.
O fato de você precisar enumerar todos os comandos é uma coisa boa do ponto de vista de segurança. Se [email protected]
for atualizado com um comando, digamos shutdown-machine
em uma atualização do sistema, seus usuários sudo não poderão usá-lo (felizmente).
Há uma observação sobre isso no manual do sudoers:
Wildcards in command line arguments should be used with care.
Command line arguments are matched as a single, concatenated string. This mean a wildcard character such as ‘?’ or
‘*’ will match across word boundaries, which may be unexpected. For example, while a sudoers entry like:
%operator ALL = /bin/cat /var/log/messages*
will allow command like:
$ sudo cat /var/log/messages.1
It will also allow:
$ sudo cat /var/log/messages /etc/shadow
which is probably not what was intended. In most cases it is better to do command line processing outside of the
sudoers file in a scripting language.
Por outro lado, se quiser economizar na digitação, você pode fazer exatamente o que o manual sugere: use uma linguagem de script. Por exemplo, você poderia escrever algo assim em, digamos, /usr/local/sbin/sudoers-dhcpd.sh
:
#!/bin/sh
case "$1" in
start)
systemctl start [email protected]
;;
stop)
systemctl stop [email protected]
;;
restart)
systemctl restart [email protected]
;;
*)
echo You are not allowed to do that!
;;
esac
Adicione uma linha de sudoers da seguinte forma:
%mygroup ALL=NOPASSWD: /usr/local/sbin/sudoers-dhcpd.sh