Sudo - existe-t-il une commande pour vérifier si j'ai sudo et / ou combien de temps il me reste?

27

(Publié à l'origine sur Stack Overflow. Ils m'ont suggéré d'essayer ici à la place. Voici le message d'origine: /programming/3858208/sudo-is-there-a-command-to-check-if-i-have -sudo-et-ou-combien-de-temps-reste )

Voir titre. Je veux une commande qui me permet d'interroger sudo. Idéalement, cela retournerait le succès si j'avais encore sudo et false si sudo avait expiré. Obtenir le temps restant pourrait également être utile (bien que si j'étais inquiet, je pouvais simplement faire sudo -v pour revalider.) Oh et il ne devrait pas avoir à demander un mot de passe.

La chose la plus proche que j'ai trouvée est "sudo -n true", mais l'option -n n'est présente que sur ma machine Centos 5 au travail. -n échoue s'il doit demander un mot de passe. Existe-t-il un autre moyen d'obtenir cette fonctionnalité? Supposons que je n'ai pas vraiment de racine sur toutes les machines avec lesquelles je travaille, donc je ne peux pas installer de nouvelles versions de sudo à mon goût.

Pour ce que ça vaut, je fais cela afin que je puisse obtenir mon invite pour indiquer le statut sudo. J'aime savoir quels terminaux sont activement sudo-capables. J'ai également une invite qui change de couleur lorsque je suis root, mais je n'utilise pas la racine très souvent, c'est donc d'une utilité limitée.

valadil
la source

Réponses:

10

L' -noption est disponible dans les nouvelles versions de sudo, mais comme vous l'avez dit, ce n'est pas une option. Il n'y a pas vraiment de moyen de faire ce que vous cherchez à part essayer simplement sudo et voir s'il revient avec une invite pour un mot de passe. Si votre souci est que vous vouliez une indication visuelle, pourquoi ne pas lancer sudo / bin / bash pour démarrer une session root bash? Notez que ce n'est pas sûr, mais c'est aussi un peu incertain si quelqu'un réalise vos changements rapides sur sudo.

8BitsOfGeek
la source
1
+1 pour les ramifications de sécurité d'un indicateur visuel!
pause jusqu'à nouvel ordre.
Cette partie ne m'était pas venue à l'esprit. Ce que j'espère, c'est que l'indicateur me rappelle d'exécuter sudo -K, au lieu d'oublier que j'ai laissé sudo actif et de laisser certains terminaux potentiellement dangereux ouverts. Non pas que j'oublie souvent de verrouiller mon écran, mais j'aime l'assurance supplémentaire.
valadil
Pour le moment, je penche vers la vérification de sudo -V, et s'il est suffisamment nouveau pour avoir -n, je vérifie -n pour obtenir la notification. On dirait qu'il ne devrait rien casser nulle part.
valadil
@valadil: Il me semble qu'un indicateur subtil n'introduirait pas trop de risques pour la sécurité. Activez le soulignement pour le nom d'utilisateur dans l'invite, par exemple.
pause jusqu'à nouvel ordre.
@Dennis: Exactement. Je n'allais pas changer mon invite en "OMG_YOU_HAVE_SUDO_NOW! _User @ host" ou quelque chose comme ça. Je changerais probablement juste un peu la couleur. Je ne m'attends pas à ce que quelqu'un sache ce que cela signifie, à moins qu'il ne s'assoie et ne se familiarise avec mon .bashrc.
valadil
29

Je sais que c'est une très vieille question, mais voici ce que j'ai fait dans un script aujourd'hui:

CAN_I_RUN_SUDO = $ (sudo -n disponibilité 2> & 1 | grep "charger" | wc -l)
si [$ {CAN_I_RUN_SUDO} -gt 0]
puis
    echo "Je peux exécuter la commande sudo"
autre
    echo "Je ne peux pas exécuter la commande Sudo"
Fi
wags007
la source
1

La commande ci-dessous affichera une indication colorée que vous avez accordé à sudo, donc n'oubliez pas de faire un sudo -kavant de vous éloigner de la machine. Il est également utile sur les terminaux non colorés.

Comme nous pouvons avoir sudo actif et inactif sur différentes sessions de terminal, j'ai créé ceci que vous pouvez mettre à la fin de votre ~ / .bashrc

function FUNCpromptCommand () { 
    sudo -n uptime 2>/dev/null 1>/dev/null
  local bSudoOn=`if(($?==0));then echo true; else echo false; fi`

    history -a; # append to history at each command issued!!!
    local width=`tput cols`;
    local half=$((width/2))
    local dt="[EndAt:`date +"%Y/%m/%d-%H:%M:%S.%N"`]";
  if $bSudoOn; then dt="!!!SUDO!!!$dt"; fi
    local sizeDtHalf=$((${#dt}/2))
    #printf "%-${width}s" $dt |sed 's" "="g'; 
    echo
    output=`printf "%*s%*s" $((half+sizeDtHalf)) "$dt" $((half-sizeDtHalf)) "" |sed 's" "="g';`

    local colorLightRed="\e[1;31m"
  local colorNoColor="\e[0m"
    if $bSudoOn; then
        echo -e "${colorLightRed}${output}${colorNoColor}"
    else
        echo -e "${output}"
    fi
}
export PROMPT_COMMAND=FUNCpromptCommand

Au type de terminal bashpour le tester. Il ajoutera également une ligne entière chaque fois que vous exécutez une commande, qui contient les informations sur l'heure de fin de la dernière commande, afin que vous puissiez aller déjeuner et savoir quand la dernière commande s'est terminée :).

Vous pouvez jouer avec ce code pour répondre à vos besoins. Il y a aussi la variable PS1 (c'est-à-dire la petite ligne simple réelle), mais je pense qu'il vaut mieux ne pas jouer avec.

PS .: pour OS-X, recherchez le commentaire ci-dessous par @nwinkler.

Puissance du Verseau
la source
La vérification du code de sortie de sudo -nne semble pas fonctionner sous OS X. Voir ma question ici: superuser.com/questions/902826/…
nwinkler
Eh bien, le test que je propose est sudo -n, pensez-vous qu'il pourrait y avoir un autre test qui pourrait être utilisé pour déterminer si l'utilisateur a un accès sudo actif? ou peut-être que OS-X nécessite une mise à jour? Je n'ai jamais utilisé OS-X btw.
Aquarius Power
2
J'utilise la dernière version d'OS X. Il est possible que sudo -nsur BSD (sur lequel OS X est basé) ait un comportement différent de la version GNU. Je viens d'ajouter mon commentaire pour que les gens sachent que cette version du chèque ne semble pas fonctionner sous OS X. J'ai utilisé un chèque d'une autre réponse ( sudo -n uptime 2>&1|grep "load"|wc -l), et cela semble bien fonctionner sous OS X. Ce n'est pas aussi élégant, mais ça marche.
nwinkler
1
@nwinkler oh, donc cela dépend en fait de la sortie qu'il génère (pas de la valeur de retour), solution de contournement intéressante
Aquarius Power
@nwinkler mais c'est aussi près que possible. Ou encore mieux car sudo -ndevient buggy dans sudo -V 1.7.9
Marco M. von Hagen
1

Pour simplifier la réponse donnée par @ wags007

if sudo -n true
then
  sudo id
else
  echo "sorry, but did not want to bother you"
fi

Cependant, si vous avez dans votre configuration https://www.sudo.ws/man/1.8.15/sudoers.man.html , defaults mail_badpassun courrier électronique sera envoyé pour chaque test qui aboutit à faux (cela aurait été demandé). Pour éviter une telle nuisance, changez cette partie de votre fichier sudoers en

Defaults       mail_badpass
Defaults!      /bin/true !mail_badpass

Par conséquent, des e-mails d'alerte de sécurité sont envoyés pour toutes les commandes, à l'exception de / bin / true. Eh bien oui, quelqu'un pourrait maintenant essayer de forcer un mot de passe en appelant sudo trueun nombre illimité de fois sans qu'aucun message d'alerte de sécurité ne soit envoyé.

Remarque: utilisez toujours à la visudoplace de votre éditeur préféré pour modifier le fichier sudoers. Sinon, vous risquez d'être exclu.

Uwe Geuder
la source
0

Selon le manuel sudo, la session sudo est déterminée en fonction du fichier d'horodatage ( /usr/lib/sudo/<username>), de sorte que vous pouvez déterminer le temps restant en vérifiant la date / heure du fichier d'horodatage. Cependant, dans mon système, le fichier d'horodatage est en fait un répertoire, et il y a trois fichiers avec un contenu cryptique (et aussi des /usr/lib/sudo/<username>horodatages étranges, mais semblait avoir un horodatage qui coïncidait avec le moment où j'ai donné à sudo mon mot de passe . - Je pense qu’elle /usr/lib/sudo/<username>/0a l’horodatage de la dernière sudoexécution.

Dysaster
la source
1
Sur mon système, les fichiers d'horodatage se trouvent dans un répertoire qui ne peut pas être lu sans l'aide de sudo, qui demande un mot de passe et ne fonctionnerait donc pas pour les besoins de l'OP.
pause jusqu'à nouvel ordre.
Bon point. Je n'ai pas vérifié la propriété de ces fichiers. Tu as raison, ce serait inutile.
Dysaster
0

Attention

Selon Bugzilla sudo Bug ID = 590, l'appel à sudo -n true 2&>/dev/null ; echo $?deviendra buggysudo -V 1.7.10

Lisez Bugzilla [ici] ( http://bugzilla.sudo.ws/show_bug.cgi?id=590 "Bug ID = 590")

Marco M. von Hagen
la source
0

Au moins sur sudo 1.8.21p2, cette approche fonctionne bien:

if sudo -vn 2> /dev/null; then
    echo "You have an active sudo session"
fi
fxlv
la source
0

C'est probablement une exagération extrême par rapport à la plupart des gens, mais voici la fonction (posixly correcte) que j'utilise pour vérifier si elle sudoest déverrouillée (la fonction ne perdra pas son temps si l'utilisateur l'exécute root, car il n'est pas nécessaire de la déverrouiller sudo):

#!/bin/sh

_unlock_sudo() {
    if [ "$USER" != 'root' ]; then
        if ! sudo -n -- true 2>/dev/null; then
            printf '\n'
            printf 'Enter password for sudo user "%s":\n' "$USER"
            while ! sudo -- true; do
                printf '\n'
                while true; do
                    printf 'Slow your roll. Try to enter password again? [Y/n]: '
                    read -r answer
                    case "$answer" in
                        ''|y|Y|yes|Yes|YES)
                            printf '\n'
                            printf 'Enter password for sudo user "%s":\n' "$USER"
                            break
                            ;;
                        n|N|no|No|NO)
                            printf '\n'
                            printf 'OK. Exiting...\n'
                            exit 1
                            ;;
                        *)
                            printf 'Please enter a valid option...\n'
                            printf '\n'
                            ;;
                    esac
                done
            done
        fi
    fi
}

_unlock_sudo
Harold Fischer
la source
-1

réponse simple ...

sudo echo
isSudo=$?
if [[ "$isSudo" -ne 0 ]]; then
  echo "This script must be run by root or a sudo'er"
  echo
  exit 1
fi

# do stuff

exit 0
danday74
la source
Cela vous demandera un mot de passe, si l'utilisateur n'a pas déjà une session sudo active
Slizzered
-2

Que diriez-vous de la page de manuel

man sudo

Listez vos commandes disponibles:

sudo -l

sudo lui-même n'a pas de limite de temps ou de date ... voir:

man sudo
man sudoers
Andreas Rehm
la source
sudo -l me donne une invite de mot de passe. J'en ai besoin pour me dire que je n'ai pas de session sudo active.
valadil
Le statut de sudo arrive à expiration, mais vous avez raison si vous voulez dire qu'il n'a pas de fonction de planification.
pause jusqu'à nouvel ordre.
Oui - ça expire - mais pas de calendrier.
Andreas Rehm