Meu primeiro pensamento foi um script wrapper no qual você concede acesso ao sudo a esse script e, em seguida, faz a verificação de parâmetro nesse script.
username ALL=/usr/local/sbin/shutdown-wrapper
E então algo assim para o wrapper de encerramento:
#!/bin/sh
case $1 in
*[!0-9]*) echo Invalid; exit 2;;
esac
if [ "$1" -ge 180 ]
then
/usr/sbin/shutdown +"$1"
else
echo Invalid
exit 2
fi
... e instrua o usuário a chamar sudo /usr/local/sbin/shutdown-wrapper N
, onde N é o número de minutos.
Outra opção é soletrar, usando intervalos de caracteres da seção curinga do Página man sudoers :
username ALL=(ALL:ALL) /usr/sbin/shutdown +18[0-9], \
/usr/sbin/shutdown +19[0-9], \
/usr/sbin/shutdown +[2-9][0-9][0-9], \
/usr/sbin/shutdown +[1-9][0-9][0-9][0-9]*
Isto explicita os minutos de 180 a 189, 190 a 199, 200 a 999 e, em seguida, qualquer coisa (numérica ou outra!) que comece com pelo menos 4 dígitos, o primeiro dos quais não pode ser zero. Isso permitiria intervalos de tempo inválidos, como /usr/sbin/shutdown +9999jeff
, o que resultaria simplesmente em um erro de análise de shutdown
:
Failed to parse time specification: +9999jeff