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

Ich habe kürzlich deswegen Ärger bekommen.

$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?

Author: Vldb.User, 2013-02-18

11 answers

Führen Sie sudo -v aus. Es wird normalerweise verwendet, um Ihr Sudo-Passwort-Timeout zu verlängern, kann jedoch verwendet werden, um festzustellen, ob Sie über sudo - Berechtigungen verfügen.

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

Handbuchseite Ausschnitt:

Wenn die Option-v (validate) angegeben wird, aktualisiert sudo den Zeitstempel des Benutzers und fordert bei Bedarf das Kennwort des Benutzers auf. Dies verlängert das Sudo-Timeout um weitere 5 Minuten (oder was auch immer das Timeout in Sudoern festgelegt ist), führt jedoch keinen Befehl aus.

Wenn Ihr Benutzer nur erlaubt, bestimmte Befehle auszuführen, funktioniert dieser Befehl, was anzeigt, 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), ist es immer noch möglich, dass Sie Probleme bekommen, wenn die Administratoren /var/log/secure lesen.

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

Um herauszufinden, welche Sie mit unterschiedlichen Berechtigungen ausführen dürfen, können Sie sudo -l verwenden. Beachten Sie, dass dies Befehl erfordert, dass Sie Ihr Passwort eingeben.

 137
Author: Daniel Beck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2013-02-18 20:07:00

Das ist sehr einfach. Führen Sie sudo -l aus. Dadurch werden alle Sudo-Berechtigungen aufgelistet, die Sie haben.

 46
Author: Brad Dausses,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2014-12-18 00:58:04

Hier ist die skriptfreundliche Version:

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

Da es nicht an der Passworteingabe hängen bleibt, wenn Sie nicht über den Zugriff sudo verfügen.

Sie können es auch in einer Variablen wie:

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

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

 14
Author: kenorb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2018-12-05 22:41:25

, Gerald Schade Antwort hier, kann aber noch verbessert werden!

Benutze

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
 12
Author: ajneu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2017-12-30 18:57:38

Für mich haben 'sudo -v' und 'sudo -l' in einem Skript nicht funktioniert, weil sie manchmal interaktiv waren (mich nach einem Passwort gefragt haben, wie oben erwähnt). 'sudo -n -l ' hat auch nicht funktioniert, es gab den Exit-Code '1', obwohl ich Sudo-Berechtigungen habe, wegen des fehlenden Passworts. Aber Erweitern des Befehls auf:

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

War für mich erfolgreich für das Skript. Dieser Ausdruck gibt 0 wenn der aktuelle Benutzer 'sudo' aufrufen kann und 1 wenn nicht.

Erklärung:
Der zusätzliche Parameter -n zu sudo verhindert, dass Interaktivität.
Die Ausgabe $A des Befehls 'sudo -n -v 2>&1' kann sein:
- empty (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 autorisiert).
("asswor "passt sowohl für ein englisches" Passwort "als auch für ein deutsches"Passwort").

 3
Author: Gerald Schade,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2017-03-11 23:28:57

Habe ich niedrigen Rang zu voten und zu kommentieren, aber ich wollte upvote Gerald Schade, die Antwort, als ich herausgefunden habe, dass der einzige Weg war, und dachte, dass no1 sonst weiß es - bis jetzt :D -

Übrigens meine Lösung:

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

(ab Ende 2015 mwhahaaa)

 2
Author: user629901,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2017-10-01 22:31:29

Dies sollte ausreichen, um Ihnen mitzuteilen, ob Sie root haben oder nicht:

sudo whoami

Wenn sudo nach dem Root-Passwort fragt oder es nicht funktioniert, bedeutet dies auch, dass Sie keine Root-Rechte haben (zumindest nicht über sudo).

 2
Author: Vedran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-02-11 11:05:06

"Sudo access" kommt in Aromen. Zwei primäre Varianten: 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. (Fun fact: Sie können die Zeit in der Datei Ihres Sudoers sehr lang ausmachen.)

Ich möchte oft auf die zweite Art von Zugriff im Prolog eines Skripts testen, das sudo muss einige Schritte. Wenn diese Überprüfung fehlschlägt, kann ich dem Benutzer mitteilen, dass er die zweite Art von Zugriff aktivieren muss, bevor er das Skript ausführt.

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

The-S weist sudo an, das Passwort von stdin zu lesen. Das -p setzt eine leere Eingabeaufforderung. Das-K löscht das zweite Mal des Zugriffs.

Da stderr an /dev/null gesendet wird, wird auch überprüft, ob der Benutzer über den ersten Sudo-Zugriffstyp verfügt.

 1
Author: Ben Hyde,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2018-09-07 14:42:33
            # Verify if current user is root.
            local current_username=$(whoami)
            [[ "$current_username" == 'root' ]] && echo true && return 0

            # Verify if sudo is installed.
            if [[ $(validate_apt 'sudo') == 'false' ]]; then
                echo false && return 0
            fi

            # Verify if the current user belongs to groups 'sudo' or 'root'.
            local current_user_groups=$(groups $current_username)
            if [[ $current_user_groups == *'root'* ]] ||
                   [[ $current_user_groups == *'sudo'* ]]; then
                echo true && return 0
            fi

            # Verify if file /etc/sudoers.d/username exists.
            if [[ -f /etc/sudoers.d/$current_username ]]; then
                echo true && return 0
            fi
 0
Author: Von Doom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-03-11 06:49:57

Ich möchte den Sudo-Modus auf nette Skript-Interaktivität/Fehlerprüfung überprüfen.

Ich mag Kenorb ' s Antwort die Timeout verwendet, es hat jedoch wegen des Standard-Kill-Signals nicht für mich funktioniert. Also habe ich dieses Bit bearbeitet und einige Ergänzungen bestreut, wie unten erklärt.

timeout -s SIGKILL 5s sudo -v && (echo SUDO Access Granted ; exit 0) || (echo SUDO Access Denied ; exit 1)

Erklärung:

  • -s SIGKILL gibt SIGKILL als Kill-Signal an. Ich bevorzuge dies gegenüber SIGSTOP da es weniger Unordnung in STDOUT hat. Vollständige Liste der Kill-Signale finden Sie hier. Auch SIGSTOP v. s. SIGKILL

Die Signale SIGKILL und SIGSTOP kann nicht abgefangen, blockiert oder ignoriert werden.

  • 5s bezeichnet 5 Sekunden, Sekunden ist die Standardeinstellung, aber Sie können auch m Minuten oder h Stunden verwenden. Als Referenz: Beschreibung des DURATION-Parameters in man timeout
  • sudo -v aus Gründen, die in der ausgewählten Antwort angegeben sind
  • exit 0 und exit 1, um Erfolg darzustellen und fehler beenden Statuscodes jeweils. Vollständige Liste der Exit-Statuscodes finden Sie hier 1, hier 2 und hier 3
  • ; wurde verwendet, um Shell-Befehle inline zu verketten.
  • && und || sind nur einige boolesche Ausdrücke, die sudo -v Exit-Code verwenden. Wenn Sie verwirrt sind, ist es nur Boolesch / logisch Kurzschlussauswertung
 0
Author: om-ha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-10-09 07:02:03

Folgen Sie diesen Schritten, 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 your_username_here ALL=(ALL) ALL
  4. Drücken Sie ESC und geben Sie :wq
  5. Typ exit
  6. Führen Sie Ihren Befehl erneut aus, der sudo
  7. Geben Sie Ihr Passwort ein (nicht das root-Passwort)
 -5
Author: Kruug,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2013-02-18 19:41:36