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 sudo
Berechtigungen 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 sudo
andere Befehle erfolgreich ausgeführt habe, aber diese unable to resolve host
Meldung hat mich beunruhigt, dass etwas anderes auf dem Host nicht funktioniert.
sudoers
Datei aus. Dort können Sie angeben, auf welchem Host ein Benutzer einen bestimmten Befehl ausführen darf (dies ist nützlich, wenn dieselbe sudoers
Datei auf mehreren Computern verwendet wird). Möglicherweise konnte der in dieser Datei angegebene Hostname nicht aufgelöst werden. Versuchen Sie es host
zum Beispiel mit dem Befehl.
sudo -v
gab "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 -l
nach einem Passwort, ob du sudo kannst oder nicht. sudo -v
fragt nur wenn du kannst und "$(whoami)" != "root"
wird unter Linux niemals etwas fragen.
sudo
Privilegien 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 sudo
Zugriff 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
.
timeout
nicht standardmäßig verfügbar ist, z. B. unter OS X?
coreutils
zB 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, 0
ob der aktuelle Benutzer 'sudo' aufrufen kann und 1
wenn nicht.
Erläuterung:
Der zusätzliche Parameter -n
zum sudo
Verhindern von Interaktivität.
Die Ausgabe $A
des 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.
su
visudo
your_username_here ALL=(ALL) ALL
:wq
exit
sudo
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
?