Wenn ich auf meiner Fedora-VM mit meinem Benutzerkonto ausgeführt werde, habe ich Folgendes /usr/local/bin
in meinem Pfad:
[justin@justin-fedora12 ~]$ env | grep PATH
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/justin/bin
Und ebenso beim Laufen su
:
[justin@justin-fedora12 ~]$ su -
Password:
[root@justin-fedora12 justin]# env | grep PATH
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/justin/bin
Bei Ausführung über sudo
befindet sich dieses Verzeichnis jedoch nicht im Pfad:
[root@justin-fedora12 justin]# exit
[justin@justin-fedora12 ~]$ sudo bash
[root@justin-fedora12 ~]# env | grep PATH
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/sbin:/bin:/usr/sbin:/usr/bin
Warum sollte der Pfad beim Laufen über anders sein sudo
?
sudo
$ PATH erhalten?Antworten:
Schauen Sie sich an
/etc/sudoers
. Die Standarddatei in Fedora (sowie in RHEL und auch in Ubuntu und ähnlichem) enthält folgende Zeile:Dies stellt sicher, dass Ihr Pfad sauber ist, wenn Sie Binärdateien unter sudo ausführen. Dies schützt vor einigen der in dieser Frage genannten Bedenken . Es ist auch praktisch, wenn Sie nicht
/sbin
und/usr/sbin
auf Ihrem eigenen Weg haben.quelle
/usr/local/bin
diese Direktive ergänzen würde, würde ich es in meinem Pfad sehen , wenn ich via laufen würdesudo
, oder?/usr/local/bin
. Vielen Dank für die Erklärung!sudo
beispielsweise ein Skript in Ihrem~/bin
(oder einem von Ihnen verwendeten) Pfad benötigen ? Ich habe gerade die Änderung vorgenommen - es funktioniert, dachte nur, dass es eine Kehrseite geben könnte?Der Befehl
su -
führt das Root-Benutzerprofil aus und übernimmt die Umgebung dieses Benutzers, einschließlich des Pfads usw.sudo
, was nicht der Fall ist.Wenn Sie sich so
sudo
verhalten möchten,su -
verwenden Sie die Option, mitsudo -i [command
der das Benutzerprofil ausgeführt wirdWenn Sie sich so
su -
verhalten möchten, verwendensudo
Sie nicht den Bindestrich, sondern nursu [command]
quelle
Sie können überprüfen, warum (es ist anders), indem Sie ausführen
sudo sudo -V
.Zum Beispiel unter Linux:
Hinweis: Bei macOS / BSD, nur laufen:
sudo sudo -V
.Die obige Liste ist aufgrund des Standardsicherheitsrichtlinien-Plugins in einigen Linux-Distributionen eingeschränkt.
Dies wird weiter erläutert in
man sudoers
:Wenn dies der Fall ist, können Sie dies ändern, indem Sie
sudo visudo
die Konfigurationsdatei ausführen und bearbeiten und Ihrensecure_path
(durch getrennten:
) zusätzlichen Pfad ändern oder Ihren Benutzer hinzufügenexempt_group
(damit Sie nicht von densecure_path
Optionen betroffen sind ).Oder
PATH
Sie können Folgendes ausführen, um die temporäre Gültigkeit des Benutzers zu beenden:und Sie können das überprüfen, indem Sie:
Siehe auch: Wie macht man
sudo
Konserven$PATH
?Ein weiterer Grund, warum die Umgebung anders sein könnte
sudo
, ist, dassenv_reset
in Ihrersudoers
Datei möglicherweise die Option aktiviert ist . Dadurch werden Befehle in einer neuen, minimalen Umgebung ausgeführt.So können Sie die
env_keep
Option (aus Sicherheitsgründen nicht empfohlen ) verwenden, um die Umgebungsvariablen Ihres Benutzers zu erhalten:quelle
In den meisten Linux-Betriebssystemen installieren Sie Programme über die Paketverwaltung und erhalten regelmäßig Updates. Wenn Sie etwas installieren, das die Paketverwaltung umgeht, wird es in / usr / local / bin installiert (z. B. oder ... / sbin oder / opt) und erhält keine regelmäßigen Updates.
Ich denke daher, dass die Programme nicht als so sicher angesehen werden und nicht standardmäßig in Roots PATH abgelegt werden.
quelle
sudo
dieses Verzeichnis standardmäßig ausgeschlossen wird.Ich habe das gerade selbst ausprobiert und habe das Verhalten, das Sie gesehen haben, nicht gesehen - mein Pfad ist derselbe geblieben, also ist Ihre Sudo-Konfiguration möglicherweise anders. Wenn Sie überprüfen, dass
man sudoers
Sie sehen, gibt es eine Option namenssecure_path
ZurücksetzenPATH
- es klingt, als wäre diese Option aktiviert worden.quelle
Denn wenn Sie verwenden
sudo bash
,bash
fungieren Sie nicht als Login-Shell. Versuchen Sie es erneut mitsudo bash -l
und Sie sollten das gleiche Ergebnis sehen wiesu -
.Wenn das richtig ist, dann ist die Differenz in
PATH
liegt in den Konfigurationsdateien:/etc/profile
,~/.bash_profile
,~/.bash_login
,~/.profile
ausgeführt wird (in dieser Reihenfolge) für ein Login - Shell, während~/.bashrc
für eine Nicht-Login interaktiv Shell ausgeführt wird.quelle
Alte Frage, ich weiß, aber ich bin gerade hier reingestolpert, weil ich genau diesem Problem nachgegangen bin.
Aus irgendeinem Grund
/usr/local/bin
war nur in der PATH als root viasudo su -
. Bei der Verwendung warsudo -i
es nicht da. Natürlich weiß ich jetzt, dass ich es zu / etc / sudoers hinzufügen kann, aber das hat immer noch nicht erklärt, warum es danach schon da istsu -
. Woher kommt dieser Teil von PATH?Nach langem Stöbern und Suchen fand ich die Antwort:
Der Standardpfad mit '/ usr / local / bin' ist in su (1) fest codiert.
Daher war keine Pam-Konfiguration, kein Profil, kein bashrc oder etwas anderes für das selektive Hinzufügen dieses Elements verantwortlich. Es war immer schon da, als es
su
übernommen wurde. Und da essudo
überhaupt nicht aufgerufen wird,su
sondern seine eigene Konfiguration verwendet, hat es danach gefehltsudo -i
Ich fand, dass dies auf RHEL6 und RHEL7 zutrifft. Ich habe keine andere Version oder Distribution überprüft.
quelle
su
Binärdatei verhext, sie/usr/local/bin
in etwas anderes geändert und die Kopie aufgerufen. Mein PFAD enthielt nun die geänderte Zeichenfolge ... Gute Kinder und nicht faule Sysadmins laden natürlich einfach den Quellcode herunter und checken dort ein. ;-)