143 votes

Comment vérifier si j'ai un accès sudo ?

J'ai récemment eu des problèmes à cause de ça.

$sudo vim /etc/motd 
[sudo] password for bruce: 
bruce is not in the sudoers file.  This incident will be reported.

Y a-t-il un moyen de vérifier si j'ai un accès sudo ou non ?

2voto

user629901 Points 21

Je n'ai pas un rang suffisant pour voter et commenter, mais je voulais mettre en avant la réponse de Gerald Schade, car j'ai trouvé que c'était la seule solution auparavant, et je pensais que personne d'autre ne la connaissait - jusqu'à maintenant :D

btw ma solution :

[[ "$(whereis sudo)" == *'/'* && "$(sudo -nv 2>&1)" != 'Sorry, user'* ]]

(depuis la fin de 2015 mwhahaaa)

1voto

Ben Hyde Points 131

"Sudo access" existe en plusieurs saveurs. Deux saveurs principales : Premièrement, vous, ou un groupe dont vous êtes membre, devez être configuré pour l'accès sudo dans le fichier /etc/sudoers.

Ensuite, vous devez connaître votre mot de passe, ou vous devez avoir effectué une commande sudo récemment. Assez récemment pour que le délai d'attente n'ait pas expiré. (Fait amusant : vous pouvez rendre le délai d'expiration très long dans votre fichier sudoer).

Je veux souvent tester le deuxième type d'accès dans le prologue d'un script qui aura besoin de sudo certaines étapes. Lorsque cette vérification échoue, je peux informer l'utilisateur qu'il doit activer le deuxième type d'accès avant d'exécuter le script.

bash-3.2$ if sudo -S -p '' echo -n < /dev/null 2> /dev/null ; then echo 'Sudo is enabled.' ; else echo 'Sudo is not enabled' ; fi
Sudo is enabled.
bash-3.2$ sudo -K
bash-3.2$ if sudo -S -p '' echo -n < /dev/null 2> /dev/null ; then echo 'Sudo is enabled.' ; else echo 'Sudo is not enabled' ; fi
Sudo is not enabled

Le -S indique à sudo de lire le mot de passe depuis stdin. L'option -p définit une invite vide. Le -K efface le deuxième temps d'accès.

Comme il envoie stderr à /dev/null, il vérifiera également si l'utilisateur a le premier type d'accès sudo.

1voto

Vedran Points 131

Cela devrait suffire pour vous dire si vous avez une racine ou non :

sudo whoami

Si sudo demande le mot de passe root, ou qu'il ne fonctionne pas, cela signifie également que vous n'avez pas les privilèges root (du moins pas par le biais de l'application sudo ).

0voto

Von Doom Points 1
            # Verify if current user is root.
            local current_username=$(whoami)
            [[ "$current_username" == 'root' ]] && echo true && return 0

            # Verify if sudo is installed.
            if [[ $(validate_apt 'sudo') == 'false' ]]; then
                echo false && return 0
            fi

            # Verify if the current user belongs to groups 'sudo' or 'root'.
            local current_user_groups=$(groups $current_username)
            if [[ $current_user_groups == *'root'* ]] ||
                   [[ $current_user_groups == *'sudo'* ]]; then
                echo true && return 0
            fi

            # Verify if file /etc/sudoers.d/username exists.
            if [[ -f /etc/sudoers.d/$current_username ]]; then
                echo true && return 0
            fi

0voto

om-ha Points 101

Je veux vérifier le mode sudo pour une belle script interactivité/contrôle d'erreur.

J'aime bien Kenorb's réponse qui utilise le timeout, mais cela n'a pas fonctionné pour moi à cause du signal kill par défaut. J'ai donc modifié cette partie et ajouté quelques ajouts comme expliqué ci-dessous.

timeout -s SIGKILL 5s sudo -v && (echo SUDO Access Granted ; exit 0) || (echo SUDO Access Denied ; exit 1)

Explication :

  • -s SIGKILL spécifie SIGKILL comme un signal d'arrêt. Je préfère cela à SIGSTOP car il est moins encombrant dans STDOUT. La liste complète des signaux de mise à mort peut être trouvée ici . Aussi SIGSTOP v.s. SIGKILL

Les signaux SIGKILL y SIGSTOP ne peut être attrapé, bloqué ou ignoré.

  • 5s indique 5 secondes, secondes est la valeur par défaut mais vous pouvez aussi utiliser m minutes ou h heures. Pour référence : Description du paramètre DURATION dans man timeout
  • sudo -v pour les raisons indiquées dans la réponse choisie
  • exit 0 y exit 1 pour représenter les codes d'état de sortie de succès et d'échec respectivement. La liste complète des codes d'état de sortie se trouve à l'adresse suivante ici 1 , ici 2 y ici 3
  • ; était utilisé pour enchaîner les commandes Shell en ligne.
  • && y || sont juste des expressions booléennes qui utilisent sudo -v code de sortie. Si vous êtes confus, c'est juste booléen/logique. Évaluation des courts-circuits

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