web-dev-qa-db-fra.com

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

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

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

Est-il possible de vérifier si j'ai un accès Sudo ou non?

93
Bruce

Exécutez Sudo -v. Il est généralement utilisé pour prolonger le délai d’expiration du mot de passe Sudo, mais peut également servir à déterminer si vous disposez des privilèges Sudo.

$ Sudo -v
Sorry, user [username] may not run Sudo on [hostname].

Extrait de la page de manuel:

Si l'option -v (validation) est donnée, Sudo mettra à jour l'horodatage de l'utilisateur, lui demandant son mot de passe si nécessaire. Cela prolonge le délai d'expiration de Sudo de 5 minutes supplémentaires (ou quel que soit le délai d'expiration défini dans sudoers), mais n'exécute aucune commande.

Si votre utilisateur est uniquement autorisé à exécuter des commandes specific , cette commande fonctionnera, indiquant que vous êtes autorisé à exécuter quelqu’un avec des privilèges différents. Bien que le message ait un aspect différent lorsque vous essayez d'exécuter une commande que vous n'êtes pas autorisé à faire dans ce cas (et aucun courrier n'est envoyé à root ), il est toujours possible que vous ayez des problèmes si les administrateurs lisent /var/log/secure.

$ Sudo ls
[Sudo] password for [username]: 
Sorry, user [username] is not allowed to execute '/bin/ls' as root on [hostname].

Pour savoir what vous êtes autorisé à exécuter avec des privilèges différents, vous pouvez utiliser Sudo -l. Notez que cette commande nécessite que vous entriez votre mot de passe.

115
Daniel Beck

C'est très simple. Exécutez Sudo -l. Ceci listera tous les privilèges Sudo que vous avez.

41
Brad Dausses

Voici la version conviviale du script:

timeout 2 Sudo id && echo Access granted || echo Access denied

car il ne sera pas bloqué sur la saisie du mot de passe si vous ne disposez pas de l'accès Sudo.

Vous pouvez également le définir dans une variable comme:

timeout 2 Sudo id && Sudo="true" || Sudo="false"
echo "$Sudo"

Remarque: sur macOS, vous devez installer coreutils, par exemple. brew install coreutils.

8
kenorb

La réponse de Gerald Schade ici peut encore être améliorée!

Utilisation

Prompt=$(Sudo -nv 2>&1)
if [ $? -eq 0 ]; then
  # exit code of Sudo-command is 0
  echo "has_Sudo__pass_set"
Elif echo $Prompt | grep -q '^Sudo:'; then
  echo "has_Sudo__needs_pass"
else
  echo "no_Sudo"
fi

Voici un exemple complet d'utilisation dans un script :

#!/usr/bin/env bash

is_root () {
    return $(id -u)
}

has_Sudo() {
    local Prompt

    Prompt=$(Sudo -nv 2>&1)
    if [ $? -eq 0 ]; then
    echo "has_Sudo__pass_set"
    Elif echo $Prompt | grep -q '^Sudo:'; then
    echo "has_Sudo__needs_pass"
    else
    echo "no_Sudo"
    fi
}

elevate_cmd () {
    local cmd=$@

    HAS_Sudo=$(has_Sudo)

    case "$HAS_Sudo" in
    has_Sudo__pass_set)
        Sudo $cmd
        ;;
    has_Sudo__needs_pass)
        echo "Please supply Sudo password for the following command: Sudo $cmd"
        Sudo $cmd
        ;;
    *)
        echo "Please supply root password for the following command: su -c \"$cmd\""
        su -c "$cmd"
        ;;
    esac
}

if is_root; then
    echo "Error: need to call this script as a normal user, not as root!"
    exit 1
fi


elevate_cmd which adduser
3
ajneu

"Accès Sudo" vient en saveurs. Deux types principaux: Tout d'abord, vous ou un groupe de vos membres devez être configuré pour accéder à Sudo dans le fichier/etc/sudoers.

Deuxièmement, vous devez connaître votre mot de passe ou vous devez avoir effectué une commande Sudo récemment. Assez récemment, le délai d'attente n'a pas expiré. (Fait amusant: vous pouvez faire passer le temps d'arrêt très longtemps dans le fichier de votre sudoer.)

Je veux souvent tester le second type d'accès dans le prologue d'un script qui nécessite quelques étapes pour Sudo. 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 à partir de stdin. Le -p définit une invite vide. Le -K efface la deuxième fois de l'accès.

Puisqu'il envoie stderr à/dev/null, il vérifiera également si l'utilisateur dispose du premier type d'accès Sudo.

1
Ben Hyde

j'ai un rang inférieur à voter et à commenter, mais je voulais faire remonter la réponse de Gerald Schade, car je trouvais que c'était le seul moyen précédemment, et je pensais que personne d'autre ne le sait - jusqu'à maintenant: D

ma solution:

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

(à partir de fin 2015 mwhahaaa)

1
user629901

Pour moi, 'Sudo -v' et 'Sudo -l' ne fonctionnaient pas dans un script car parfois interactifs (me demandant un mot de passe, comme mentionné ci-dessus). 'Sudo -n -l' ne fonctionnait pas non plus, il donnait le code de sortie '1' bien que je dispose des autorisations Sudo, à cause du mot de passe manquant. Mais étendre la commande à:

A=$(Sudo -n -v 2>&1);test -z "$A" || echo $A|grep -q asswor

a réussi pour moi pour le script. Cette expression donne 0 si l'utilisateur actuel peut appeler 'Sudo' et 1 sinon.

Explication:
Le paramètre supplémentaire -n à Sudo empêche l'interactivité.
La sortie $A de la commande 'Sudo -n -v 2>&1' peut être:
- vide (dans ce cas, Sudo peut être appelé par l'utilisateur actuel) ou:
- une note indiquant que l'utilisateur actuel n'est pas autorisé à utiliser Sudo ou:
- un texte de question pour le mot de passe (dans ce cas, l'utilisateur est autorisé).
("asswor" conviendra pour un "mot de passe" anglais ainsi que pour un "Passwort" allemand).

1
Gerald Schade