Sie können PATH
-searching-Semantik mit erhalten env
, so:
#!/usr/bin/env ruby
hat die Semantik, die Sie von möchten
#!ruby
Der Grund, PATH
der davon abhängt, wird nicht als bewährte Methode angesehen, da das Skript keine Annahmen über den Inhalt der Umgebungsvariablen PATH treffen kann, wodurch das "sequentielle Abhängigkeitsmodell" von Binärdateien verletzt wird, bei denen
/bin
Enthält die ausführbaren Dateien, die beim Booten benötigt werden.
/usr/bin
Enthält die anderen ausführbaren Dateien, die von der Betriebssysteminstallation verwendet werden.
/usr/local/bin
Enthält vom Systemadministrator installierte ausführbare Dateien, die nicht Teil des Basisbetriebssystems sind.
~/bin
Enthält die ausführbaren Dateien des Benutzers.
Jede Ebene sollte später in der Sequenz nicht das Vorhandensein von Binärdateien annehmen, die mehr "Anwendung" sind, sondern sich möglicherweise früher auf Binärdateien stützen, die mehr "Fundament" sind. Und die PATH-Variable tendiert dazu, von anwendungsbezogen zu fundamental zu laufen, was der obigen natürlichen Abhängigkeit entgegengesetzt ist.
Fragen Sie sich, was passiert, wenn ein Skript in ~/bin
ein Skript in /usr/local/bin
Ruby aufruft , um das Problem zu veranschaulichen ? Sollte dieses Skript von der installierten Version des Betriebssystems abhängen /usr/bin/ruby
oder von der persönlichen Kopie, über die der Benutzer gerade verfügt ~/bin/ruby
? PATH
Das Suchen ergibt die unvorhersehbare Semantik, die mit der letzteren verbunden ist (möglicherweise ~/bin/ruby
handelt es sich um eine unterbrochene symbolische Verknüpfung), während das Backen auf dem Weg zu #!
der ersteren erfolgt.
Es gibt eigentlich kein anderes plattformunabhängiges "Betriebssystem ... Informationen zum Pfad für einen registrierten Befehl", daher ist es am einfachsten, auf dem Pfad zu bestehen, der in der angegeben wird #!
.
ruby
, aber das hindert Sie nicht daran, anzugeben,/home/user/myrubyinterpreter
ob Sie möchtenAus dem Classic Shell Scripting- Buch:
quelle
Es gibt andere Gründe, aber aus Sicherheitssicht möchte ich niemals, dass ein Skript Annahmen über den richtigen Pfad macht. Was ist, wenn es falsch ist und die falsche Shell oder der falsche Interpreter ausgeführt wird? Eine, die von einem böswilligen Benutzer eingefügt wurde? Oder was ist, wenn es auf einer bestimmten Shell basiert und abstürzt, wenn die falsche Shell verwendet wird?
Benutzer können mit ihrem Pfad herumspielen und Sachen brechen - vertraue dem Benutzer nicht :-) Ich habe zahlreiche Angriffe ausgeführt, bei denen der Benutzer das Falsche auf seinem Pfad getan hat - normalerweise Dinge in der falschen Reihenfolge -, damit ich sie unterlaufen kann ein normaler Skriptaufruf.
Ja, ich weiß, wenn Sie das Skript selbst geschrieben haben, können Sie zu Recht behaupten, dass Sie Ihren eigenen Weg gefunden haben, aber ein Dolmetscher kann diese Entscheidungen nicht treffen.
quelle
$PATH
. . WasLD_PRELOAD
ist , wenn ohne erhöhte Berechtigungen verwendet wird? PS Abgelehnt, weil eine falsche Warnung bezüglich der Sicherheit der Sicherheit abträglich ist.PATH
es einen Angriffsvektor gibt und es nicht so viele andere Angriffsvektoren gibt, dass der gesamte Ansatz überdacht werden sollte?