A seguir, é o caso em que você deseja executar um comando sem senha apenas se ele tiver um conjunto específico de opções, em que parte das opções é variável . AFAIK, não é possível usar variáveis ou intervalos de valores nas declarações de sudoers, ou seja, você pode permitir o acesso explicitamente, command option1
mas não command option2
usar:
user_name ALL=(root) /usr/bin/command option1
mas se a estrutura for command option1 value1
, onde value1
pode variar, você precisará ter linhas explícitas de sudoers para cada valor possível de value1
. O shell script fornece uma maneira de contornar isso.
Essa resposta foi inspirada na resposta de M. Ahmad Zafar e corrige o problema de segurança.
- Crie um shell script onde você chama o comando sem
sudo
.
- Salve o script em uma pasta com privilégios de raiz (por exemplo
/usr/local/bin/
), torne o arquivo de propriedade da raiz (por exemplo chown root:wheel /usr/local/bin/script_name
) sem acesso de gravação para outras pessoas (por exemplo chmod 755 /usr/local/bin/script_name
).
Adicione a exceção aos sudoers usando o visudo:
user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name
.
Execute seu script sudo script_name
.
Por exemplo, quero alterar o tempo limite de suspensão da exibição no macOS. Isso é feito usando:
sudo pmset displaysleep time_in_minutes
Considero alterar o tempo limite de suspensão uma ação inocente que não justifica o incômodo de digitar a senha, mas pmset
pode fazer muitas coisas e eu gostaria de manter essas outras coisas atrás da senha do sudo.
Então, eu tenho o seguinte script em /usr/local/bin/ds
:
#!/bin/bash
if [ $# -eq 0 ]; then
echo 'To set displaysleep time, run "sudo ds [sleep_time_in_minutes]"'
else
if [[ $1 =~ ^([0-9]|[1-9][0-9]|1[0-7][0-9]|180)$ ]]; then
pmset displaysleep $1
else
echo 'Time must be 0..180, where 0 = never, 1..180 = number of minutes'
fi
fi
No final do sudoers
arquivo, tenho a seguinte linha:
user_name ALL=(root) NOPASSWD: /usr/local/bin/ds
Para definir o tempo limite em 3 minutos, eu executo meu script a partir da conta de usuário comum user_name
:
sudo ds 3
PS: A maior parte do meu script é validação de entrada, o que não é obrigatório, portanto o seguinte também funcionaria:
#!/bin/bash
pmset displaysleep $1
/path/to/my/program
fosse um script python?