Wie überprüfe ich, ob ich sudo-Zugriff habe?

104

Ich bin kürzlich in Schwierigkeiten geraten.

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

Gibt es eine Möglichkeit zu überprüfen, ob ich Sudo-Zugriff habe oder nicht?

Bruce
quelle
Fragen Sie Ihren Systemadministrator?
mdpc
1
@mdpc: Gibt es sonst noch einen anderen Weg?
Bruce
Sie haben nicht erwähnt, ob Sie Root-Zugriff erhalten können oder nicht.
mdpc

Antworten:

121

Rennen sudo -v. Es wird normalerweise verwendet, um das Zeitlimit für Ihr sudo-Kennwort zu verlängern, kann jedoch verwendet werden, um festzustellen, ob Sie über sudoBerechtigungen verfügen .

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

Manpage-Auszug:

Wenn die Option -v (validieren) angegeben wird, aktualisiert sudo den Zeitstempel des Benutzers und fragt bei Bedarf nach dem Kennwort des Benutzers. Dadurch wird das Sudo-Timeout um weitere 5 Minuten verlängert (oder wie auch immer das Timeout in Sudoern eingestellt ist), es wird jedoch kein Befehl ausgeführt.

Wenn Ihr Benutzer nur bestimmte Befehle ausführen darf, funktioniert dieser Befehl und zeigt an, dass Sie etwas mit unterschiedlichen Berechtigungen ausführen dürfen . Während die Nachricht anders aussieht, wenn Sie versuchen, einen Befehl auszuführen, den Sie in diesem Fall nicht ausführen dürfen (und keine E-Mail an root gesendet wird ), kann es dennoch zu Problemen kommen, wenn die Administratoren dies lesen /var/log/secure.

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

Um herauszufinden, was Sie mit unterschiedlichen Berechtigungen ausführen dürfen, können Sie Folgendes verwenden sudo -l. Beachten Sie, dass Sie für diesen Befehl Ihr Kennwort eingeben müssen.

Daniel Beck
quelle
2
Vielen Dank. sudo -v funktioniert bei mir. Die Manpage sagt, dass ich sudo -l auch ausführen kann, aber das fragt nach einem Passwort. Warum ist das so?
Bruce
2
@ Bruce Ich vermute hier, aber ansonsten könnte jemand (oder ein von Ihnen ausgeführtes Programm) herausfinden, welche Programme (möglicherweise ohne Eingabe eines Kennworts) von Ihrem aktuellen Benutzer ausgeführt werden können, und versuchen, diese Informationen böswillig zu verwenden.
Daniel Beck
Was bedeutet es wohl, wenn ich das zurück bekomme patrick@<host>:~$ sudo -v sudo: unable to resolve host <host>? Ich habe mein Passwort eingegeben und habe nichts über Unbefugte erfahren. Ich weiß, dass ich sudoandere Befehle erfolgreich ausgeführt habe, aber diese unable to resolve hostMeldung hat mich beunruhigt, dass etwas anderes auf dem Host nicht funktioniert.
Patrick M
@PatrickM Es sieht nach einem Problem mit der sudoersDatei aus. Dort können Sie angeben, auf welchem ​​Host ein Benutzer einen bestimmten Befehl ausführen darf (dies ist nützlich, wenn dieselbe sudoersDatei auf mehreren Computern verwendet wird). Möglicherweise konnte der in dieser Datei angegebene Hostname nicht aufgelöst werden. Versuchen Sie es hostzum Beispiel mit dem Befehl.
Ale
Funktioniert bei RHEL 6 nicht, sudo -vgab "xx ist nicht in der sudoers-Datei. Dieser Vorfall wird gemeldet."
79E09796
43

Das ist sehr einfach. Rennen sudo -l. Dies listet alle Sudo-Berechtigungen auf, die Sie haben.

Brad Dausses
quelle
1
Vielleicht, weil es das wiederholt, was Daniel Beck vor fast zwei Jahren gesagt hat.
G-Man
1
Oder erklärt, was passiert, es ist bestenfalls ein Kommentar
Ramhound
2
@ Jonathan: Wenn du jetzt in Ubuntu schreiben würdest, fragst du sudo -lnach einem Passwort, ob du sudo kannst oder nicht. sudo -vfragt nur wenn du kannst und "$(whoami)" != "root"wird unter Linux niemals etwas fragen.
Mittwoch,
@bksunday Du bist richtig. Ich habe jetzt auf einem sauberen Debian Jessy getestet und Ihre Ergebnisse bestätigt. Mein vorheriger (jetzt gelöschter) Kommentar war wahrscheinlich ein Ergebnis von Tests auf einem Computer, auf dem ich einige sudoPrivilegien hatte.
Jonathan Ben-Avraham
@ G-Man, aber diese einfache Antwort half mir mehr als wahrscheinlich präziser Daniels Antwort, wo dieser Befehl ist das Ende leider ...
Betlista
11

Hier ist die skriptfreundliche Version:

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

da es bei der Passworteingabe nicht hängen bleibt, wenn Sie keinen sudoZugriff haben.

Sie können es auch in einer Variablen wie der folgenden festlegen:

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

Hinweis: Unter macOS müssen Sie installieren coreutils, z brew install coreutils.

Kenorb
quelle
Gibt es Alternativen dafür, wo timeoutnicht standardmäßig verfügbar ist, z. B. unter OS X?
Harry
1
Sie müssen coreutilszB installieren brew install coreutils.
Kenorb
2
Das funktioniert bei mir in einem Skript nicht. Aus ungeklärten Gründen bleibt das Drehbuch hängen, bis ich es töte.
Berühmte
7

Gerald Schades Antwort hier kann noch verbessert werden!

Verwenden

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

Hier ist ein vollständiges Beispiel für die Verwendung in einem Skript :

#!/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
quelle
2

Bei mir funktionierten ' sudo -v' und ' sudo -l' in einem Skript nicht, weil sie manchmal interaktiv waren (ich wurde nach einem Passwort gefragt, wie oben erwähnt). ' sudo -n -l' funktionierte auch nicht, es gab den Exit-Code '1', obwohl ich aufgrund des fehlenden Passworts sudo-Berechtigungen habe. Erweitern Sie den Befehl jedoch auf:

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

war für mich für das Drehbuch erfolgreich. Dieser Ausdruck gibt an, 0ob der aktuelle Benutzer 'sudo' aufrufen kann und 1wenn nicht.

Erläuterung:
Der zusätzliche Parameter -nzum sudoVerhindern von Interaktivität.
Die Ausgabe $Ades Befehls ' sudo -n -v 2>&1' kann sein:
- leer (in diesem Fall kann sudo vom aktuellen Benutzer aufgerufen werden) oder:
- ein Hinweis, dass der aktuelle Benutzer nicht für sudo autorisiert ist, oder:
- ein Fragetext für das Passwort (in diesem Fall ist der Benutzer berechtigt).
("asswor" passt sowohl für ein englisches "Passwort" als auch für ein deutsches "Passwort").

Gerald Schade
quelle
2

Ich habe einen niedrigen Rang, um abzustimmen und zu kommentieren, aber ich wollte die Antwort von Gerald Schade positiv bewerten, da ich den einzigen Weg zuvor gefunden habe und dachte, dass niemand anders es weiß - bis jetzt: D

Übrigens meine Lösung:

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

(ab Ende 2015 mwhahaaa)

user629901
quelle
1
Lesen Sie den Abschnitt "Warum brauche ich 50 Ruf, um Kommentare abzugeben?" , Um zu verstehen, wie Sie mit dem Kommentieren beginnen können.
Pimp Juice IT
1

"Sudo access" gibt es in verschiedenen Geschmacksrichtungen. Zwei Hauptvarianten: Zuerst müssen Sie oder eine Gruppe, der Sie angehören, für den sudo-Zugriff in der Datei / etc / sudoers eingerichtet werden.

Zweitens müssen Sie Ihr Passwort kennen oder kürzlich einen sudo-Befehl ausgeführt haben. Kürzlich genug, dass das Timeout nicht abgelaufen ist. (Unterhaltsame Tatsache: Sie können die Auszeit in der Datei Ihres sudoer sehr lang machen.)

Ich möchte oft im Prolog eines Skripts nach der zweiten Art von Zugriff suchen, für die einige Schritte ausgeführt werden müssen. Wenn diese Prüfung fehlschlägt, kann ich dem Benutzer raten, dass er die zweite Art des Zugriffs aktivieren muss, bevor das Skript ausgeführt wird.

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

Das -S weist sudo an, das Passwort von stdin zu lesen. Das -p setzt eine leere Eingabeaufforderung. Das -K löscht den zweiten Zugriffszeitpunkt.

Da stderr an / dev / null gesendet wird, wird auch geprüft, ob der Benutzer über die erste Art von Sudo-Zugriff verfügt.

Ben Hyde
quelle
-4

Befolgen Sie diese Schritte, um die sudoers-Datei anzuzeigen. Wenn du da drin bist, hast du sudo. Wenn nicht, können Sie sich selbst hinzufügen.

  1. su
  2. visudo
  3. Unten in der Datei geben Sie ein your_username_here ALL=(ALL) ALL
  4. Schlagen ESCund tippen:wq
  5. Art exit
  6. Führen Sie den erforderlichen Befehl erneut aus sudo
  7. Geben Sie Ihr Passwort ein (nicht das Passwort des Roots)
Kruug
quelle
11
Das OP "geriet in Schwierigkeiten", weil es ausgeführt wurde sudo, daher ist er wahrscheinlich weder der Systemadministrator noch einer der Elite-Systemadministratoren. Wahrscheinlich ist er nur ein Benutzer, der dachte, er hätte begrenzte Befugnisse erhalten. Was lässt Sie vermuten, dass er gehen kann su?
Scott