Ich würde es nicht als Sicherheitsfunktion bezeichnen.
Eine ausführbare Datei kann nach ihrem alleinigen Namen ausgeführt werden, wenn sie in einem der durch PATH
Umgebungsvariable angegebenen Verzeichnisse gefunden wird . In meinem Debian 9 /etc/profile
definiert die Datei grundlegend PATH
wie folgt:
if [ "`id -u`" -eq 0 ]; then PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" else PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games" fi export PATH
Dies bedeutet für jeden Benutzer mit UID 0
(in meinem Debian nur für root
) der Standard
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
(Verzeichnisse werden durch getrennt :
) und für jeden anderen Benutzer ist es
PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
Ich nenne es "default", weil es normalerweise /etc/profile
für jeden Benutzer geladen wird, aber der Benutzer kann seinen eigenen ändern PATH
. Normalerweise ~/.profile
ist eine gute Datei dazu geeignet.
Wenn Sie laufen sudo some_command
, sudo
verwendet noch eine weitere Gruppe von Verzeichnissen statt PATH
. Dieser Satz kann irgendwo in sudo
config ( /etc/sudoers
, /etc/sudoers.d/*
) definiert sein oder nicht . Wenn es nicht explizit definiert ist /etc/sudoers
, wird der Standardwert angegeben
secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
(Dies ist etwas vereinfacht, andere Optionen können diese Mechanik ändern; man 5 sudoers
Einzelheiten hierzu).
Beachten Sie, dass PATH
für root
und secure_path
verwendet von sudo
nur wenige Verzeichnisse sbin
(an verschiedenen Orten) benannt sind, während dies PATH
für normale Benutzer nicht gilt. In diesen Verzeichnissen gibt es Werkzeuge, die hauptsächlich von verwendet werden sollen root
.
Wenn also sudo some_command
die ausführbare Datei gefunden wird und die einzige some_command
nicht, liegt dies daran, dass sie some_command
sich in einem der Verzeichnisse befindet, die sich secure_path
in Ihrem Verzeichnis befinden, aber nicht in Ihrem PATH
.
Dies ist jedoch keine Sicherheitsfunktion. Jeder Benutzer kann alle diese sbin
Verzeichnisse zu seinen eigenen hinzufügen PATH
, so dass some_command
die Shell nach der Eingabe versucht, die ausführbare Datei auszuführen. Oder sie können einen vollständigen Pfad verwenden /sbin/some_command
. Dann setzen echte Sicherheitsfunktionen ein:
- Die Dateiberechtigungen können Benutzer ohne Rootberechtigung möglicherweise nicht ausführen (obwohl in Debian 9 viele (alle?) Systemdateien von jedem Benutzer ausgeführt werden können).
- Die Datei wird zwar ausgeführt, kann jedoch nicht auf wichtige Ressourcen zugreifen. Daher wird ein Fehler ausgegeben und das Programm beendet (z. B.
/sbin/hwclock
). - Die Datei wird ausgeführt und verwendet einen bestimmten Authentifizierungsagenten, um Berechtigungen ohne zu erhöhen
sudo
(eine solche Datei würde höchstwahrscheinlich bin
zuerst eingefügt, Beispiel:) /bin/systemd
; - oder die Datei wird erfolgreich ausgeführt, weil Sie sie trotz laufen können
sbin
(zB /sbin/discover
in meinem Debian).
Ihr Benutzerkonto ist nicht für die Ausführung some_command
ohne eingerichtet, sudo
da Sie es als normaler Benutzer nicht benötigen. Wenn Sie es trotzdem möchten, verwenden Sie einfach den vollständigen Pfad und erhalten Sie es ( whereis some_command
möglicherweise nützlich). Wenn Sie PATH
alle diese sbin
Verzeichnisse mit Daten füllen, wird dies nur Ihre Tab-Vervollständigung (z. B. in Bash) verunreinigen.
Tab Vervollständigung verdient eine Erklärung. Nehmen Sie Bash als Beispielshell mit dieser Funktionalität. Die Shell hat PATH
in ihrer Umgebung, sie kann sie lesen. Wenn Sie also tippen another_com
und schlagen tab, können Sie einen Hinweis auf einen another_command
gefundenen Ort finden PATH
. Wenn some_command
irgendwo drin ist sbin
, some_com
tabwerde ich es nicht finden.
sudo some_com
tabKann es immer noch finden. Das mag seltsam erscheinen, weil die Schale nicht wissen kann, root
ist PATH
noch kann sie lesen /etc/sudoers
und so. Was passiert, ist, dass die Shell vorübergehend allgemeine sbin
Verzeichnisse hinzufügt, um PATH
nur diese Suche durchzuführen. Dies geschieht in der Datei /usr/share/bash-completion/completions/sudo
, die entsprechende Zeile ist
local PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin
Um Ihre explizite Frage zu beantworten
Kann ich diese Funktion deaktivieren?
Ja, Sie können sbin
Verzeichnisse hinzufügen PATH
. Dies erlaubt es Ihnen jedoch nicht, Befehle erfolgreich auszuführen sudo
, wenn sie wirklich benötigt werden sudo
(und viele tun dies).