Warum ist . Nicht im Pfad standardmäßig?

63

Auf UNIX-ähnlichen Systemen ist mir im Laufe der Jahre aufgefallen, dass .(aktuelles Verzeichnis) $PATHstandardmäßig nicht enthalten ist. Warum ist das?

Ich erinnere mich, vor Jahren gelesen zu haben, dass es sich um ein Sicherheitsproblem handelte, aber der Artikel, den ich las, erklärte nicht, was genau das Problem war. Liegt es daran, dass jemand eine böswillige Version von lsoder cpin einem Verzeichnis hinterlassen könnte und ich sie letztendlich ausführen würde, ohne zu bemerken, dass sie dort vorhanden ist?

dirtside
quelle
6
Dies gilt nicht so sehr für den interaktiven Benutzerschutz wie für andere Programme (und Skripte), die andere Programme ausführen. Sogar einige versierte Benutzer mögen es zu wissen, dass, wenn sie sich in einem zufälligen Verzeichnis befinden, dies sein lswird /usr/bin/lsund ./lsnicht. Es gibt auch die Hürde, wenn Sie wissen, wie Sie .das Ende Ihres Weges ergänzen können , haben Sie wahrscheinlich eine Vorstellung davon, was Sie tun. root sollte nie haben .in den Weg, viele Systeme nicht einmal root mehr einloggen können.
msw

Antworten:

41

Sie haben Ihre eigene Frage richtig beantwortet, genau deshalb steht dot nicht im Weg:
Zum Schutz vor kindlichen Viren oder ehrlichen Fehlern.

Natürlich ist dies eine sehr lahme und nutzlose Antivirenmaßnahme, und nichts hindert Sie daran, dem Pfad selbst Punkte hinzuzufügen.

Harrymc
quelle
13
Es ist allerdings komisch, dass du davor geschützt bist, aber nicht vor einer einsamen Datei -rfim Verzeichnis (macht rm *interessant) ;-)
Joey
Die Unix-Antwort: Warum haben Sie überhaupt eine Datei benannt -rf? ;)
msw
2
@msw: Eine andere Antwort von Unix ist, dass Punkte im Pfad normalerweise für Administratorkonten verpönt sind, aber für Nicht-Administratoren in Ordnung sind.
Harrymc
das Risiko stark reduziert werden würde , wenn der Strompfad das ist letzte Weg, so dass alle normalen Plätze für Programme geprüft wurden zuerst ?
Jon z
1
@ Jonz: Nicht wirklich. Das Risiko ist jedoch recht gering, wenn Ihr Computer frei von Viren ist. Und wenn der Computer infiziert ist, ist der Pfad mit modernen Viren die geringste Sorge.
Harrymc
4

Ja. Wenn Sie das "." Im Pfad würden Sie am Ende viele Befehlsaufrufe an die Dateien in Ihrem aktuellen Verzeichnis senden.

Auch wenn es das letzte Mal war, liegt immer noch ein Pilotenfehler vor. Zum Beispiel fehlt Solaris 10 "top". Ich gebe den ganzen Tag "top" auf meinem System ein, weil ich denke, dass ich auf einem System bin, das "top" hat.

benc
quelle
1

Entschuldigung, ich möchte dies in Form eines Kommentars zu der ausgewählten Antwort erfragen, aber ich habe noch keinen Vertreter für den Superuser.

Die Sicherheitsantwort macht Sinn, aber wenn Sie "." Sollte die Shell in Ihrem PATH nicht zuletzt im aktuellen Verzeichnis nach ausführbaren Dateien suchen und damit das Sicherheitsrisiko verringern? Wenn es $ PATH nacheinander durchsucht, findet es / bin / ls, bevor es ./ls ​​findet.

Also, wie unsicher ist es für mich, "." am Ende meiner Umgebungsvariablen $ PATH?

Es funktioniert so, wie ich es vorschlage. So habe ich getestet:

Fügen Sie zuerst "." zum ENDE Ihrer PATH-Umgebungsvariablen.

Fügen Sie dann die folgende Datei in ein Verzeichnis ein, z. B. ~ / dir1 / dir2 / test_which.rb:

#!/your/path/to/ruby

puts "this file is from the current directory"

Und legen Sie diese Datei unter /usr/bin/test_which.rb ab

#!/your/path/to/ruby

puts "this file is at /usr/bin/test_which.rb"

Stellen Sie sicher, dass Sie die Dateien mit der Tastenkombination chmod + x ausführen.

Wenn Sie nun das Verzeichnis in ~ / dir1 / dir2 ändern und test_which.rb ausführen, erhalten Sie die Ausgabe

this file is at /usr/bin/test_which.rb

Wenn Sie "which test_which.rb" von einer beliebigen Stelle aus ausführen, sollte dies tatsächlich gemeldet werden

/usr/bin/test_which.rb

Sie können die Datei weiterhin im aktuellen Verzeichnis ausführen, indem Sie Folgendes eingeben:

./test_which.rb
Tyler Collier
quelle
8
Niemand hat jemals einen Tippfehler, wie zum Beispiel dcoder sloder sduoin einer Schale und wurde gerettet von „Befehl nicht gefunden“. Je.
Daniel Beck
1
Stimmen Sie Daniel zu: Sie könnten ein bösartiges Skript haben, das nach einem falsch geschriebenen Befehl benannt ist. Siehe auch diese Antwort .
Ignis
@ DanielBeck sollten Sie versuchen, Alias ​​für Tippfehler zu verwenden. Ich habe meine bevorzugte Konfiguration ls(Farbausgabe und mehr) so eingestellt, ldass auf Tippfehler gänzlich verzichtet wird.
Karl Damgaard Asmussen
1
@KarlDamgaardAsmussen kl
deworde
Ich persönlich füge nicht '.' zu meinem Weg. Es ist nicht so schwer zu tippen ./run oder was auch immer ich im lokalen Verzeichnis tun möchte. Es hat mich ein paar Mal davor bewahrt, unerwartete Dinge aufzuheben. Tomate Tomahto.
Michael Mathews
1

Mehr als ein Sicherheitsrisiko, mit '.' Im PATH machen Sie es fast unmöglich, sicherzustellen, dass die Ausführung eines Befehls wie beabsichtigt funktioniert. Denken Sie daran, einen Befehl wie 'zip' in einem riesigen Verzeichnis auszuführen, das Tausende von Dateien mit zufälligen Namen enthält. Die Möglichkeit, dass einer von ihnen tatsächlich den Namen "zip" trägt, ist nicht unerheblich und würde zu einem Fehler führen, der nur schwer zu verstehen ist (tatsächlich sollte die Datei ausführbar sein, was jedoch passieren kann).

Dies gilt insbesondere beim Schreiben von Skripten, bei denen die PATH-Variable des Benutzers beibehalten wird. Ein gut geschriebenes Skript sollte sich mit allen Eckfällen befassen (wie Dateinamen mit Leerzeichen oder beginnend mit '-'). Es ist jedoch unpraktisch, die Ausführung einer Datei im aktuellen Verzeichnis anstelle eines Systembefehls zu verhindern ...

Emanuele Paolini
quelle