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?
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?
Antworten:
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.
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.
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.
sudo -vgab "xx ist nicht in der sudoers-Datei. Dieser Vorfall wird gemeldet."
Das ist sehr einfach. Rennen sudo -l. Dies listet alle Sudo-Berechtigungen auf, die Sie haben.
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.
sudoPrivilegien hatte.
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.
timeoutnicht standardmäßig verfügbar ist, z. B. unter OS X?
coreutilszB installieren brew install coreutils.
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
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").
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)
"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.
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.
suvisudoyour_username_here ALL=(ALL) ALL:wqexitsudosudo, 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?