Meine Verwirrung
a.out
ist die Ausgabe der Programme, die ich in meinem Ubuntu 12.10 ausführe. Im Red Hat-System wird es ausgeführt, wenn ich es a.out
im Terminal ausführe. Während ich in Ubuntu bin, muss ich ausführen ./a.out
, um die Ausgabe zu erhalten. 'a.out' funktioniert nicht.
Kann jemand erklären, was der Unterschied zwischen den Befehlen ist?
./
in$PATH
standardmäßig? Ewwwwww ...Antworten:
Das Verhalten, das Sie erleben, hängt höchstwahrscheinlich von Unterschieden in der Umgebungsvariablen ab
$PATH
. Dies$PATH
ist im Wesentlichen eine durch Doppelpunkte getrennte Liste von Verzeichnissen, die nach einer bestimmten ausführbaren Datei durchsucht werden, wenn ein Programm mithilfe einesexec
Betriebssystemaufrufs aufgerufen wird. Die$PATH
können relative Pfadkomponenten enthalten, normalerweise.
oder eine leere Zeichenfolge, die sich beide auf das aktuelle Arbeitsverzeichnis beziehen. Wenn das aktuelle Verzeichnis Teil von ist$PATH
, können Dateien im aktuellen Arbeitsverzeichnis nur mit ihrem Namen ausgeführt werden, za.out
. Wenn sich das aktuelle Verzeichnis nicht befindet$PATH
, muss ein relativer oder absoluter Pfad zur ausführbaren Datei angegeben werden, z./a.out
.Das Vorhandensein relativer Pfadkomponenten
$PATH
hat potenzielle Auswirkungen auf die Sicherheit, da ausführbare Dateien in Verzeichnissen früher in$PATH
ausführbaren Dateien in Verzeichnissen später in der Liste überschattet werden. Betrachten wir zum Beispiel einen Angriff auf ein System , in dem das aktuelle Arbeitsverzeichnis Pfad.
vorangeht/bin
in$PATH
. Wenn es einem Angreifer gelingt, ein schädliches Skript, das einen Namen mit einem häufig verwendeten Systemdienstprogramm teilt, beispielsweisels
im aktuellen Verzeichnis abzulegen (was normalerweise viel einfacher ist als das Ersetzen von Binärdateien im Stammverzeichnis/bin
), ruft der Benutzer das schädliche Skript versehentlich auf, wenn Die Absicht ist, das System aufzurufenls
. Auch wenn.
erst am Ende angehängt wird$PATH
Ein Benutzer könnte dazu verleitet werden, versehentlich eine ausführbare Datei im aktuellen Verzeichnis aufzurufen, die einen Namen mit einem allgemeinen Dienstprogramm teilt, das auf diesem bestimmten System nicht gefunden wurde. Aus diesem Grunde ist es üblich , ist nicht relative Pfadkomponenten als Teil des Standard zu haben$PATH
.quelle
echo $PATH
auf jedem der Systeme tun , sollten Sie dies.
als Teil vonPATH
on Red Hat sehen, jedoch nicht auf dem Ubuntu-System. Wenn Sie das gleiche Verhalten auf Ubuntu wollen könnte man anfügen ,.
um diePATH
auf Ubuntu mit dem Befehlexport PATH=$PATH:.
( als BeigabePATH=$PATH:.
zu ,~/.profile
um die Änderung dauerhaft zu machen), aber beachten Sie, dass diese gewisse Auswirkungen auf die Sicherheit hat , die ich versuche , in der editierten Antwort zu erklären../
in$PATH
. Unter Sicherheitsgesichtspunkten ist dies eine schlechte Idee und fördert schlampiges Verhalten, das Sie wirklich nicht brauchen.echo $PATH
in red hat hat.
am ende des pfads keinen namen wie du gesagt hastecho $PATH
hat mir das tatsächlich gegeben/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin::/opt/oracle/product/11.2.0/clien t_1/bin:/home/H11/u756938/bin
und a.out arbeitet noch ....
und eine leere Zeichenfolge$PATH
beziehen sich auf das aktuelle Verzeichnis. Beachten Sie das::
Nachher/usr/bin
in der Ausgabe vonecho $PATH
.