web-dev-qa-db-fra.com

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

(Initialement posté sur Stack Overflow. Ils m'ont suggéré d'essayer ici. Voici l'article original: https://stackoverflow.com/questions/3858208/Sudo-is-there-a-command- à-vérifier-si-j'ai-Sudo-et-ou-combien-de-temps-est-à-gauche )

Voir le titre. Je veux une commande qui me permet d'interroger Sudo. Dans l'idéal, si je disposais encore de Sudo, le résultat serait positif et faux si Sudo était expiré. Garder le temps restant pourrait également être utile (bien que si j'étais inquiet, je pourrais simplement faire une revalidation de Sudo -v.) Oh, il ne devrait pas être nécessaire de 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. Y a-t-il un autre moyen d'obtenir cette fonctionnalité? Supposons que je n'ai pas réellement de racine sur toutes les machines avec lesquelles je travaille, je ne peux donc pas installer les nouvelles versions de Sudo à ma guise.

Pour ce que ça vaut la peine de le faire, je peux obtenir mon invite pour indiquer le statut de Sudo. J'aime savoir quels terminaux sont actifs pour Sudo. J'ai aussi une invite qui change de couleur lorsque je suis root, mais je n'utilise pas souvent cette racine, son utilisation est donc limitée.

26
valadil

L'option -n est disponible dans les versions les plus récentes de Sudo, mais comme vous l'avez indiqué, ce n'est pas une option. Il n'y a pas vraiment moyen de faire ce que vous cherchez, à moins d'essayer Sudo et de voir s'il revient avec une invite pour un mot de passe. Si vous souhaitez une indication visuelle, pourquoi ne pas commencer par Sudo/bin/bash pour démarrer une session root bash? Notez que cela n’est pas sûr, mais aussi un peu si quelqu'un réalise vos changements d'invite sur Sudo.

10
8BitsOfGeek

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

 CAN_I_RUN_Sudo = $ (Sudo -n uptime 2> & 1 | grep "load" | wc -l) 
 Si [$ {CAN_I_RUN_Sudo} -gt 0] 
 Puis [.____. .] echo "Je peux exécuter la commande Sudo" 
 sinon 
 echo "Je ne peux pas exécuter la commande Sudo" 
 fi 
29
wags007

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 dans votre https://www.Sudo.ws/man/1.8.15/sudoers.man.html vous avez la configuration defaults mail_badpass, il y aura être un mail envoyé pour chaque test dont le résultat est faux (l'aurait invité). Pour éviter une telle nuisance, remplacez cette partie de votre fichier sudoers par

Defaults       mail_badpass
Defaults!      /bin/true !mail_badpass

En conséquence, des courriers d’alerte de sécurité sont envoyés pour toutes les commandes sauf/bin/true. Eh bien oui, quelqu'un pourrait maintenant essayer de forcer brutalement un mot de passe en appelant Sudo true un nombre illimité de fois sans qu'aucun courrier d'alerte de sécurité ne soit envoyé.

Remarque: utilisez toujours visudo au lieu de votre éditeur favori pour modifier le fichier sudoers. Sinon, vous risquez d'être mis en lock-out.

1
Uwe Geuder

La commande ci-dessous affichera une indication de couleur indiquant que vous avez obtenu l'autorisation Sudo. Vous vous souviendrez donc de faire un Sudo -k avant de quitter la machine. C'est utile aussi 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 terminal, tapez bash pour le tester. Il ajoutera également une ligne entière à chaque fois que vous exécuterez une commande contenant les informations relatives à l'heure de fin de la dernière commande. Vous pourrez ainsi déjeuner et savoir quand la dernière commande sera 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 unique Prompt), mais je pense qu'il est préférable de ne pas la gâcher.

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

1
Aquarius Power

Avertissement

Selon Bugzilla Sudo ID de bogue = 590, l'appel de Sudo -n true 2&>/dev/null ; echo $? deviendra bogué autour de Sudo -V 1.7.10

Lire Bugzilla [ici] ( http://bugzilla.Sudo.ws/show_bug.cgi?id=590 "ID de bogue = 590")

0
Marco M. von Hagen

La plupart des gens ont probablement tendance à trop en faire, mais voici la fonction (posixly correcte) que j’utilise pour vérifier si Sudo est déverrouillé (la fonction ne perdra pas son temps si son utilisateur est root, car il n’est pas nécessaire de le 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
0
Harold Fischer

Selon le manuel Sudo, la session Sudo est déterminée en fonction du fichier d'horodatage (/usr/lib/Sudo/<username>). Vous pourrez ainsi savoir combien de temps il reste en vérifiant la date et l'heure du fichier d'horodatage. Cependant, dans mon système, le fichier d’horodatage est en fait un répertoire et il contient trois fichiers avec un contenu crypté (ainsi que des horodatages étranges, mais /usr/lib/Sudo/<username> semblait avoir un horodatage qui coïncidait avec le moment où j'ai donné à Sudo ma Je pense que /usr/lib/Sudo/<username>/0 a l'horodatage de la dernière exécution Sudo.

0
Dysaster

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
0
fxlv