Le cas suivant concerne le cas où vous souhaitez exécuter une commande sans mot de passe uniquement si elle contient un ensemble d'options spécifique, où une partie des options est variable . Autant que je sache, il n’est pas possible d’utiliser des variables ou des plages de valeurs dans les déclarations sudoers, c’est-à-dire que vous pouvez autoriser l’accès de manière explicite command option1
mais sans command option2
utiliser:
user_name ALL=(root) /usr/bin/command option1
mais si la structure est command option1 value1
, où value1
peut varier, vous devez disposer de lignes sudoers explicites pour chaque valeur possible de value1
. Le script shell permet de contourner le problème.
Cette réponse a été inspirée par la réponse de M. Ahmad Zafar et corrige le problème de sécurité.
- Créez un script shell où vous appelez la commande sans
sudo
.
- Enregistrez le script dans un dossier privilégié racine (par exemple
/usr/local/bin/
), faites en sorte que le fichier soit la propriété de la racine (par exemple chown root:wheel /usr/local/bin/script_name
) sans accès en écriture pour les autres (par exemple chmod 755 /usr/local/bin/script_name
).
Ajoutez l'exception aux sudoers utilisant visudo:
user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name
.
Exécutez votre script sudo script_name
.
Par exemple, je souhaite modifier le délai de veille de l'affichage sous macOS. Ceci est fait en utilisant:
sudo pmset displaysleep time_in_minutes
Je considère que changer le délai de veille est une action innocente qui ne justifie pas les tracas liés à la saisie d'un mot de passe, mais qui pmset
peut faire beaucoup de choses et j'aimerais garder ces autres choses derrière le mot de passe sudo.
J'ai donc le script suivant sur /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
À la fin du sudoers
fichier, j'ai la ligne suivante:
user_name ALL=(root) NOPASSWD: /usr/local/bin/ds
Pour définir le délai d'expiration à 3 minutes, j'exécute mon script à partir du compte d'utilisateur ordinaire user_name
:
sudo ds 3
PS La majeure partie de mon script est une validation d’entrée, qui n’est pas obligatoire. Par conséquent, les éléments suivants fonctionnent également:
#!/bin/bash
pmset displaysleep $1
/path/to/my/program
s'agissait d'un script python?