Sudo - Gibt es einen Befehl, um zu überprüfen, ob ich Sudo habe und / oder wie viel Zeit noch übrig ist?

27

(Ursprünglich auf Stack Overflow gepostet. Sie haben vorgeschlagen, es hier zu versuchen. Hier ist der ursprüngliche Beitrag: https://stackoverflow.com/questions/3858208/sudo-is-there-a-command-to-check-if-i-have -sudo-und-wie-viel-zeit-bleibt )

Siehe Titel. Ich möchte einen Befehl, mit dem ich sudo abfragen kann. Idealerweise würde es Erfolg bringen, wenn ich noch sudo habe und false, wenn sudo abgelaufen ist. Es könnte auch nützlich sein, die verbleibende Zeit zu ermitteln (obwohl ich, wenn ich besorgt wäre, einfach sudo -v ausführen könnte, um die Gültigkeit zu überprüfen.) Oh, und es sollte nicht erforderlich sein, nach einem Passwort zu fragen.

Das Nächste, was ich gefunden habe, ist "sudo -n true", aber die Option -n ist nur auf meinem Centos 5-Computer bei der Arbeit verfügbar. -n schlägt fehl, wenn nach einem Passwort gefragt werden muss. Gibt es eine andere Möglichkeit, diese Funktionalität zu erhalten? Angenommen, ich habe nicht auf allen Computern, mit denen ich arbeite, root, so dass ich keine neuen Versionen von sudo nach meinen Wünschen installieren kann.

Wenn es sich lohnt, mache ich das, damit ich meine Eingabeaufforderung bekomme, um den Sudo-Status anzuzeigen. Ich mag es zu wissen, welche Terminals aktiv sudo-fähig sind. Ich habe auch eine Eingabeaufforderung, die die Farben ändert, wenn ich root bin, aber ich verwende root nicht sehr oft, so dass dies von begrenztem Nutzen ist.

Valadil
quelle

Antworten:

10

Die -nOption ist in neueren Versionen von sudo verfügbar, aber wie Sie angegeben haben, ist dies keine Option. Es gibt keine wirkliche Möglichkeit, das zu tun, wonach Sie suchen, außer Sudo auszuprobieren und zu prüfen, ob es mit einer Aufforderung zur Eingabe eines Kennworts zurückkommt. Wenn Sie eine visuelle Anzeige wünschen, starten Sie do sudo / bin / bash, um eine Root-Bash-Sitzung zu starten. Beachten Sie, dass dies unsicher ist, es aber auch etwas unsicher ist, wenn jemand Ihre sofortigen Änderungen in sudo bemerkt.

8BitsOfGeek
quelle
1
+1 für die Sicherheitsauswirkungen einer visuellen Anzeige!
Bis auf weiteres angehalten.
Dieser Teil war mir nicht eingefallen. Ich hoffe, dass der Indikator mich daran erinnert, sudo -K auszuführen, anstatt zu vergessen, dass ich sudo aktiv gelassen und einige potenziell gefährliche Terminals offen gelassen habe. Nicht, dass ich oft vergesse, meinen Bildschirm zu sperren, aber ich mag die Zusatzversicherung.
4.
Im Moment neige ich dazu, sudo -V zu überprüfen, und wenn es neu genug ist, um -n zu haben, überprüfe ich -n, um die Benachrichtigung zu erhalten. Scheint, als sollte es nirgendwo kaputt gehen.
4.
@valadil: Mir fällt auf, dass ein subtiler Indikator nicht zu viel Sicherheitsrisiko birgt. Aktivieren Sie beispielsweise die Unterstreichung für den Benutzernamen in der Eingabeaufforderung.
Bis auf weiteres angehalten.
@ Tennis: Genau. Ich wollte meine Eingabeaufforderung nicht in "OMG_YOU_HAVE_SUDO_NOW! _User @ host" oder so etwas ändern. Ich würde wahrscheinlich nur die Farbe ein wenig ändern. Ich erwarte nicht, dass jemand weiß, was das bedeutet, wenn er sich nicht hinsetzt und sich mit meinem .bashrc vertraut macht.
Valadil
29

Ich weiß, das ist eine sehr alte Frage, aber hier habe ich sie heute in einem Skript gestellt:

CAN_I_RUN_SUDO = $ (sudo -n uptime 2> & 1 | grep "load" | wc -l)
if [$ {CAN_I_RUN_SUDO} -gt 0]
dann
    echo "Ich kann den Befehl sudo ausführen"
sonst
    echo "Ich kann den Sudo-Befehl nicht ausführen"
fi
wags007
quelle
1

Der folgende Befehl zeigt farbig an, dass Sie sudo erteilt haben, sodass Sie daran denken, einen Vorgang auszuführen, sudo -kbevor Sie sich von der Maschine entfernen. Dies ist auch bei nicht farbigen Terminals nützlich.

Da sudo in verschiedenen Terminalsitzungen aktiv und inaktiv sein kann, habe ich dies erstellt, das Sie am Ende Ihres ~ / .bashrc einfügen können

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

Am Terminal-Typ bash, um es zu testen. Außerdem wird bei jeder Ausführung eines Befehls eine ganze Zeile hinzugefügt, die die Informationen zum Zeitpunkt des letzten Befehlsendes enthält, sodass Sie zum Mittagessen gehen und wissen können, wann der letzte Befehl beendet wurde :).

Sie können mit diesem Code spielen, um Ihre Bedürfnisse zu erfüllen. Es gibt auch die PS1-Variable (das ist die eigentliche kleine, einzeilige Eingabeaufforderung), aber ich denke, es ist besser, nicht damit herumzuspielen.

PS .: Für OS-X siehe den Kommentar unten von @nwinkler.

Wassermann Power
quelle
Überprüfen des Exit - Code sudo -nnicht zur Arbeit scheint auf O X. hier meine Frage Siehe: superuser.com/questions/902826/...
nwinkler
Nun, der Test, den ich vorschlage, ist sudo -n, glauben Sie, dass es irgendeinen anderen Test geben könnte, der verwendet werden könnte, um festzustellen, ob der Benutzer Sudo-Zugriff aktiv hat? oder OS-X erfordert vielleicht ein Update? Ich habe übrigens nie OS-X verwendet.
Aquarius Power
2
Ich verwende die neueste Version von OS X. Es ist möglich, dass sudo -nBSD (auf dem OS X basiert) ein anderes Verhalten aufweist als die GNU-Version. Ich habe gerade meinen Kommentar hinzugefügt, um die Leute wissen zu lassen, dass diese Version der Prüfung unter OS X nicht zu funktionieren scheint. Ich habe eine Prüfung aus einer anderen Antwort ( sudo -n uptime 2>&1|grep "load"|wc -l) verwendet, und dies scheint unter OS X in Ordnung zu sein. Aber es funktioniert.
Nwinkler
1
@nwinkler oh, also es hängt tatsächlich von der Ausgabe ab, die es generiert (nicht der Rückgabewert), interessante Problemumgehung
Aquarius Power
@nwinkler aber es ist so nah wie möglich. Oder noch besser, weil es sudo -nin sudo -V 1.7.9
Marco M. von Hagen
1

Um die Antwort von @ wags007 zu vereinfachen

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

Wenn Sie jedoch in Ihrer https://www.sudo.ws/man/1.8.15/sudoers.man.html Konfiguration defaults mail_badpasseine E-Mail haben, wird für jeden Test eine E-Mail gesendet, die zu einem falschen Ergebnis führt (dies hätte dazu geführt). Um solche Unannehmlichkeiten zu vermeiden, ändern Sie den Teil Ihrer sudoers-Datei in

Defaults       mail_badpass
Defaults!      /bin/true !mail_badpass

Infolgedessen werden für alle Befehle außer / bin / true Sicherheitsalarm-Mails gesendet. Nun ja, jemand könnte jetzt versuchen, ein Passwort zu erzwingen, indem er sudo trueunbegrenzt oft anruft, ohne dass eine Sicherheitswarnung gesendet wird.

Hinweis: Verwenden visudoSie zum Bearbeiten der sudoers-Datei immer anstelle Ihres bevorzugten Editors. Andernfalls besteht die Gefahr, dass Sie ausgesperrt werden.

Uwe Geuder
quelle
0

Gemäß dem sudo-Handbuch wird die sudo-Sitzung anhand der Zeitstempeldatei ( /usr/lib/sudo/<username>) bestimmt, sodass Sie möglicherweise herausfinden können, wie viel Zeit noch verbleibt, indem Sie das Datum und die Uhrzeit der Zeitstempeldatei überprüfen. In meinem System ist die Zeitstempeldatei jedoch in Wirklichkeit ein Verzeichnis, in dem sich drei Dateien mit kryptischem Inhalt befinden (und auch einige seltsame Zeitstempel, die jedoch /usr/lib/sudo/<username>einen Zeitstempel zu haben schienen, der mit der Zeit zusammenfiel, als ich sudo mein Passwort gab Ich denke, /usr/lib/sudo/<username>/0hat den Zeitstempel der letzten sudoAusführung.

Dysaster
quelle
1
Auf meinem System befinden sich die Zeitstempeldateien in einem Verzeichnis, das ohne sudo nicht gelesen werden kann, das zur Eingabe eines Kennworts auffordert und daher nicht für die Anforderungen des OP geeignet ist.
Bis auf weiteres angehalten.
Guter Punkt. Ich habe den Besitz dieser Dateien nicht überprüft. Du hast recht, es wäre nutzlos.
Dysaster
0

Warnung

Laut Bugzilla sudo Bug ID = 590 wird der Anruf sudo -n true 2&>/dev/null ; echo $?zum Buggy werdensudo -V 1.7.10

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

Marco M. von Hagen
quelle
0

Zumindest in sudo 1.8.21p2 funktioniert dieser Ansatz einwandfrei:

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

Dies ist wahrscheinlich ein extremer Overkill für die meisten Leute, aber hier ist die (genau richtige) Funktion, mit der ich überprüfe, ob sudodie Funktion entsperrt ist (die Funktion verschwendet keine Zeit, wenn der Benutzer sie ausführt root, da keine Entsperrung erforderlich ist 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
quelle
-1

einfache antwort ...

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
quelle
Dies fordert zur Eingabe eines Kennworts auf, wenn der Benutzer noch keine aktive Sudo-Sitzung hat
Slizzered,
-2

Wie wäre es mit der Manpage

man sudo

Listen Sie Ihre verfügbaren Befehle auf:

sudo -l

Sudo selbst hat keine Zeit- oder Datumsbeschränkungen ... siehe:

man sudo
man sudoers
Andreas Rehm
quelle
sudo -l gibt mir eine Passwortabfrage. Ich muss es mir sagen, dass ich keine aktive Sudo-Sitzung habe.
Valadil
Der sudo-Status überschreitet das Zeitlimit, aber Sie haben Recht, wenn Sie meinen, dass es keine Planungsfunktion gibt.
Bis auf weiteres angehalten.
Ja - es läuft aus - aber kein Zeitplan.
Andreas Rehm