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

104

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?

Bruce
la source
Demandez à votre administrateur système?
MDPC
1
@ mdpc: Existe-t-il un autre moyen?
Bruce
Vous n'avez pas mentionné si vous pouvez ou non accéder à la racine.
MDPC
46
Il doit s'agir du premier cas où quelqu'un voit "Cet incident sera signalé" .
Slhck

Réponses:

121

Courez sudo -v. Il est généralement utilisé pour prolonger le délai d’expiration de votre mot de passe sudo, mais peut également servir à déterminer si vous avez des sudoprivilèges.

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

Extrait de la page de manuel:

Si l'option -v (validate) 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 sudo de 5 minutes supplémentaires (ou quel que soit le délai d'expiration défini dans sudoers), mais n'exécute pas de commande.

Si votre utilisateur est uniquement autorisé à exécuter des commandes spécifiques , cette commande fonctionnera, indiquant que vous êtes autorisé à exécuter quelque chose 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 qu'aucun courrier n'est envoyé à la racine ), il est toujours possible que vous ayez des problèmes si les administrateurs le 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 ce que vous êtes autorisé à exécuter avec différents privilèges, vous pouvez utiliser sudo -l. Notez que cette commande nécessite que vous entriez votre mot de passe.

Daniel Beck
la source
2
Merci. sudo -v travaille pour moi. La page de manuel indique que je peux aussi exécuter sudo -l mais demande un mot de passe. Pourquoi donc?
Bruce
2
@Bruce Je suis en train de deviner, mais sinon quelqu'un (ou un programme que vous exécutez) pourrait savoir quels programmes peuvent être exécutés (éventuellement sans entrer de mot de passe) par votre utilisateur actuel et essayer d'utiliser ces informations à des fins malveillantes.
Daniel Beck
Que pensez - vous que cela signifie quand je reçois ce retour: patrick@<host>:~$ sudo -v sudo: unable to resolve host <host>? J'ai entré mon mot de passe et je n'ai rien eu à propos de non autorisé. Je sais que j'ai sudoréussi à exécuter d'autres commandes, mais ce unable to resolve hostmessage m'a fait craindre que quelque chose d'autre ne soit funky sur l'hôte.
Patrick M
@PatrickM Cela ressemble à un problème avec le sudoersfichier. Vous pouvez y spécifier sur quel hôte un utilisateur est autorisé à exécuter une commande spécifique (cela est utile lorsque vous utilisez le même sudoersfichier sur plusieurs ordinateurs). Le nom d'hôte spécifié dans ce fichier n'a peut-être pas pu être résolu. Essayez de vérifier avec la hostcommande par exemple.
Ale
Cela ne fonctionne pas pour moi sur RHEL 6, sudo -va déclaré "xx n'est pas dans le fichier sudoers. Cet incident sera signalé."
79E09796
43

C'est très simple. Courez sudo -l. Ceci listera tous les privilèges sudo que vous avez.

Brad Dausses
la source
1
Peut-être sous-estimé parce que cela répète ce que Daniel Beck avait dit il y a près de deux ans.
G-Man
1
Ou explique ce qui se passe, c'est un commentaire, au mieux
Ramhound
2
@ Jonathan: si vous voulez écrire un script dans Ubuntu, demandez sudo -lun mot de passe si vous pouvez ou non utiliser votre mot de passe. sudo -vne demande que si vous le pouvez, et "$(whoami)" != "root"ne demandera jamais rien dans aucun Linux.
dimanche
@ bksunday Vous avez raison. Je teste maintenant sur une Jessy propre et confirme vos résultats. Mon précédent commentaire (supprimé maintenant) était probablement le résultat de tests sur une machine sur laquelle j'avais quelques sudoprivilèges.
Jonathan Ben-Avraham
@ G-Man, mais cette réponse simple m'a aidé plus que probablement plus précise, la réponse de Daniel, où cette commande est malheureusement la fin ...
Betlista
11

Voici la version conviviale du script:

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

car il ne sera pas bloqué sur l'entrée du mot de passe si vous n'avez pas l' sudoaccès.

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.

Kenorb
la source
Des alternatives pour où timeoutne sont pas disponibles par défaut, par exemple sous OS X?
Harry
1
Vous devez installer coreutils, par exemple brew install coreutils.
Kenorb
2
Cela ne fonctionne pas pour moi dans un script. Pour une raison inexpliquée, le script se bloque jusqu'à ce que je le tue.
beruic
7

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
ajneu
la source
2

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' n'a pas non plus fonctionné, il a donné le code de sortie '1' bien que j'ai 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 indique 0si l'utilisateur actuel peut appeler «sudo» et 1sinon.

Explication:
Le paramètre supplémentaire -ndestiné à sudoempêcher l'interactivité.
Le résultat $Ade la commande ' sudo -n -v 2>&1' peut être:
- vide (dans ce cas, l'utilisateur actuel peut appeler sudo), 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 aussi bien pour un "mot de passe" anglais que pour un "mot de passe allemand").

Gerald Schade
la source
2

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)

utilisateur629901
la source
1
Lisez «Pourquoi ai-je besoin de 50 points de réputation pour commenter» afin de bien comprendre comment commencer à commenter.
Pimp Juice IT
1

"Accès Sudo" vient en saveurs. Deux types principaux: Tout d'abord, vous (ou un groupe dont vous êtes membre) devez être configuré pour un accès 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. 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 dit à 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.

Ben Hyde
la source
-4

Suivez ces étapes pour afficher le fichier sudoers. Si vous êtes là-bas, vous avez sudo. Sinon, vous pouvez ajouter vous-même.

  1. su
  2. visudo
  3. En bas du fichier, entrez your_username_here ALL=(ALL) ALL
  4. Hit ESCet tapez:wq
  5. Type exit
  6. Relancez votre commande si nécessaire sudo
  7. Entrez votre mot de passe (pas le mot de passe de la racine)
Kruug
la source
11
L'OP "a eu des ennuis" pour l'exécution sudo, il n'est donc probablement pas l' administrateur système, ni même l'un des administrateurs système d'élite. Il est probablement juste un utilisateur qui pensait avoir obtenu des pouvoirs limités. Qu'est-ce qui vous fait penser qu'il peut partir su?
Scott