1 votes

Exécution de script contenant des commandes sudo avec sudoers

J'ai écrit un script qui aide à nettoyer mes téléchargements et anime, mais il ne fonctionnera pas sans droits d'administrateur.

J'ai donc essayé de l'ajouter à /etc/sudoers (modifié en utilisant les suggestions de techraf) :

# Ce fichier DOIT être édité avec la commande 'visudo' en tant qu'administrateur.
#
# Veuillez envisager d'ajouter du contenu local dans /etc/sudoers.d/ au lieu de
# modifier directement ce fichier.
#
# Consultez la page de manuel pour savoir comment rédiger un fichier sudoers.
#
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# Spécification d'alias d'hôtes

# Spécification d'alias d'utilisateur

# Spécification d'alias de commande
Cmnd_Alias COMMANDS_FICHIERPERM = /bin/chown, /bin/chmod

# Spécification de privilèges d'utilisateur
root    ALL=(ALL:ALL) ALL
monNomUtilisateur ALL = NOPASSWD: /media/96e60511-62ca-48ba-bccc-9b365bfcc4e5/Programs/down.sh
monNomUtilisateur ALL = NOPASSWD: /media/96e60511-62ca-48ba-bccc-9b365bfcc4e5/Programs/rehamer.sh
monNomUtilisateur ALL=(ALL) NOPASSWD: /bin/chown
monNomUtilisateur ALL=(ALL) NOPASSWD: /bin/chmod
monNomUtilisateur ALL=(ALL) NOPASSWD: COMMANDS_FICHIERPERM

# Autoriser les membres du groupe sudo à exécuter n'importe quelle commande
%sudo   ALL=(ALL:ALL) ALL

# Consultez sudoers(5) pour plus d'informations sur les directives "#include":

#includedir /etc/sudoers.d 

Mais cela ne fonctionne pas...

Voici ce qui se trouve dans le script :

sudo chown -cR monNomUtilisateur:utilisateurs $téléchargements $anime >>"$défaut"logs/own.log 2>&1
echo possédé
sudo chmod -cR 664 $anime >>"$défaut"logs/mod.log 2>&1
sudo chmod -cR 765 $téléchargements >>"$défaut"logs/mod.log 2>&1
sudo find $téléchargements $anime -type d -exec chmod a+x {} \; >>"$défaut"logs/mod.log 2>&1
echo modifié
rm -vrf $téléchargements*.ignore >>"$défaut"logs/rm.log 2>&1
echo fichiers ignorés supprimés

Si je laisse sudo dans le script, il demande mon mot de passe une fois et fonctionne. Si je supprime sudo de mon script, il s'exécute sans demander de mot de passe, mais je continue de recevoir des erreurs de Permissions denied encore et encore. Comment puis-je corriger cela ?

2voto

techraf Points 4752

En ajoutant ce qui suit à sudoers:

monNomUtilisateur ALL=(ALL) NOPASSWD: /chemin/vers/down.sh

Vous avez permis à monNomUtilisateur d'exécuter le script /chemin/vers/down.sh avec des privilèges élevés. Cela signifie que vous pouvez exécuter la commande suivante :

sudo /chemin/vers/down.sh

Il serait suffisant d'exécuter tout votre script avec des privilèges élevés et il ne demandera pas de mot de passe. Vous n'avez pas besoin d'ajouter de sudo supplémentaires pour chown ou chmod car ces commandes hériteront des autorisations du script (mais dans ce cas, sudo chown s'exécuterait sans problèmes, car root a les permissions pour exécuter toutes les commandes sans demande de mot de passe).

C'est une façon possible de procéder.


L'autre façon...

Vous n'avez pas autorisé monNomUtilisateur à exécuter chown ou chmod dans sudoers. Si vous voulez exécuter le script en tant qu'utilisateur régulier et autoriser uniquement certaines commandes à être exécutées en tant que root, vous devriez les spécifier toutes dans sudoers par exemple :

monNomUtilisateur ALL=(ALL) NOPASSWD: /usr/sbin/chown

votre chemin vers les binaires peut être différent

ou spécifiez des alias de commandes :

Cmnd_Alias COMMANDES_FICHIER = /usr/sbin/chown, /usr/sbin/chmod
monNomUtilisateur ALL=(ALL) NOPASSWD: COMMANDES_FICHIER

De cette manière, vous pourriez utiliser votre script tel quel.


Enfin, vous avez spécifié vos autorisations sous # User alias specification. Il s'agit simplement d'un conseil de bonnes pratiques, mais ce n'est pas de cela dont cette section traite. Vous devriez plutôt l'ajouter à # User privilege specification.

Jetez un coup d'œil aux exemples de sudoers pour quelques scénarios courants.

0 votes

Ne semble pas fonctionner. Mon chown et chmod se trouvent dans /bin. J'ai essayé les deux paramètres que vous avez donnés (j'ai également tout mis au bon endroit comme vous l'avez suggéré), mais je continue à avoir des erreurs de permission.

0 votes

Ça fonctionne si je change le script en sudo chmod blah blah blah mais il me demande ensuite le mot de passe de l'utilisateur. L'utilisateur n'est pas un sudoer mais cela s'exécute correctement en tant que root. Comment se fait-il qu'il demande toujours un mot de passe même si l'utilisateur n'avait pas les privilèges root sauf sur ces commandes ?

0 votes

Désolé, mais commenter "j'ai tout essayé et ça ne fonctionne pas" n'est pas constructif. Je n'ai aucune idée de ce que vous faites à moins que vous ne l'écriviez.

0voto

rwc9u Points 532

Une possibilité est que le script se sudo lui-même. Ajoutez ceci à /etc/sudoers :

myUsername ALL=(ALL) NOPASSWD: /chemin/vers/down.sh

Ensuite, ajoutez ceci au début du script :

#!/bin/bash

# Si ce n'est pas déjà en cours d'exécution en tant que root, relancez via sudo
if [ $(id -u) -ne 0 ]; then
    exec sudo "$BASH_SOURCE" "$@"
    exit $? # au cas où quelque chose échoue...
fi

Tant que le chemin d'accès correspond à l'entrée dans /etc/sudoers, le script devrait pouvoir se relancer de manière transparente en tant que root (vous pouvez donc omettre les sudo dans le reste du script). S'il ne correspond pas pour une raison quelconque, vous obtiendrez la demande de mot de passe de sudo.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X