Wie durchsucht "sudo" den Pfad nach ausführbaren Dateien?

8

Ich verwende Rubygems (1.3.7) mit Edelsteinen, die unter Ubuntu 10.10 Root-Rechte erfordern. Wenn ich mein Setup mit einem Ubuntu 9.10 mit Rubygems 1.3.6-Installation vergleiche, sehe ich folgenden Unterschied gem environment:

1.3.7 / 10.10 - EXECUTABLE DIRECTORY: /var/lib/gems/1.8/bin

1.3.6 / 09.10 - EXECUTABLE DIRECTORY: /usr/bin

Die Ausgabe ist die gleiche, ob ich benutze sudooder nicht. Um dies zu beheben (ich weiß nicht, warum es überhaupt anders ist), habe ich versucht, meine Pfadvariable zu ändern.

Meine Frage ist, wo sucht sudoman nach ausführbaren Dateien? Wenn ich ein Juwel installiere (mit sudo), wird die ausführbare Datei /varoffensichtlich in den Pfad eingefügt. Ich habe diesen Pfad zu meinen ~/.profileund /etc/environmentDateien hinzugefügt , kann aber sudodie ausführbaren Dateien nicht ausführen.

Wenn ich renne:

  • $ gemname es läuft mein Werkzeug richtig.
  • $ sudo gemnamees sagt mir nur command not found.
  • $ sudo echo $PATHes tut den richtigen Weg zeigen.
  • $ sudo -i gemname es läuft richtig.
  • $ sudo sudo -V zeigt, dass der Pfad erhalten bleibt.

Tut sudoEhre ~/.profileund / oder /etc/environment? Wenn ja, warum kann es meine ausführbare Datei nicht finden, während das Verzeichnis in der $PATHUmgebungsvariablen angezeigt wird?

Ich habe die Dokumentation von gelesen sudo, ich habe auch eine Menge Themen zu Stackoverflow und Serverfault durchsucht und durchgesehen (zum Beispiel, wie man eine PATH-Umgebungsvariable in sudo überschreibt? Aber mein Beispiel zeigt, dass sie $PATHden richtigen Pfad enthält), aber sie haben nie wirklich Zeigen Sie, wie Sie einen Edelstein über ausführen sudo.

Kamiel Wanrooij
quelle

Antworten:

11

Beachten Sie, dass Ihre Shell in Ihrem dritten Befehl erweitert wird, $PATHbevor sudo sie sehen kann. Die Ausgabe ist also der Pfad Ihrer Shell, nicht der Pfad, den sudo sieht. Was Sie wollen, ist so etwas wie sudo echo \$PATHoder sudo sh -c 'echo $PATH'.

Schauen Sie sich darüber hinaus den Abschnitt SICHERHEITSHINWEISE auf der sudo(8)Manpage an. Ich glaube, dass Ubuntu sudomit der Build-Option SECURE_PATH erstellt. Suchen Sie in der Ausgabe von nach der Zeile "Wert zum Überschreiben des $ PATH des Benutzers mit" sudo sudo -V.

sudo -isimuliert eine anfängliche Anmeldung und liest so Dateien wie .profile(obwohl die Dateien, die es liest, von der Shell des Roots abhängen). Ohne -ierbt es die erhaltenen Umgebungsvariablen von der Umgebung seines Aufrufers mit der oben erwähnten PATH-Hygiene.

Was den Grund angeht, warum sich der Pfad überhaupt geändert hat, vermute ich, dass die Änderung eine bewusste Entscheidung der Entwickler war. Weitere Diskussionen finden Sie auf bugs.debian.org .

Justarobert
quelle
1
Vielen Dank! Ich habe die offensichtliche Erweiterung vor sudo verpasst :-) Ich sehe jetzt die Überschreibung des Pfads in sudo sudo -V, obwohl ich später einen Konflikt mit der Anweisung 'Umgebungsvariablen zum Beibehalten:' finde. Ich nehme an, ich muss den NEUEN Pfad in meiner sudoers-Datei festlegen, um das -i?
Kamiel Wanrooij
Ja, das ist wahrscheinlich das Beste.
Justarobert
1
sudo echo \$PATHproduziert nur '$ PATH' für mich. aber du sudo sh -c 'echo $PATH'machst den Trick. danke
Kochfelder
3

Gehen wir nach Teilen:

  • gemname es führt mein Tool korrekt aus.

Das ist ok :)

  • sudo gemname sagt mir nur, dass der Befehl nicht gefunden wurde.

gemname ist nicht in deinem $PATH

  • sudo echo $ PATH zeigt den richtigen Pfad an.

Das ist cool: Die variable Erweiterung erfolgt, bevor bash das Programm ausführt. Wenn Sie dies ausführen, wird es für Ihren Benutzer erweitert, $PATH bevor Sie sudo aufrufen. Die an sudo übergebene Zeile lautet also eher wie folgt:

$ sudo echo "/usr/bin:/bin:"
  • sudo -i gemname läuft es richtig.

sudo -iläuft als Login-Shell und ehrt .profileund / oder .login. Wie auf der manSeite steht:

Außerdem wird die Umgebung initialisiert, wobei DISPLAY und TERM unverändert bleiben. Dabei werden HOME, MAIL, SHELL, USER, LOGNAME und PATH sowie der Inhalt von / etc / environment auf Linux- und AIX-Systemen festgelegt. Alle anderen Umgebungsvariablen werden entfernt.

Core-Dump
quelle
1
Nur ein Streit: gemnameist in seinem $PATH, da sonst das erste Beispiel nicht funktionieren würde. Es ist nicht in der sanitären $PATH, die sudo(ohne -i) verwendet.
Justarobert
Vielen Dank! Ich nehme an, das ist das .profile des anrufenden Benutzers? Oder root / der -u'd Benutzer?
Kamiel Wanrooij
Die zweite Option.
Coredump