Unterschied zwischen a.out und ./a.out

9

Meine Verwirrung

a.outist 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.outim 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?

Munai Das Udasin
quelle
2
+1 Ich bin mir nicht sicher, warum diese gültige Frage abgelehnt wurde.
HeatfanJohn
4
Warten, RedHat enthält ./in $PATHstandardmäßig? Ewwwwww ...
Shadur

Antworten:

17

Das Verhalten, das Sie erleben, hängt höchstwahrscheinlich von Unterschieden in der Umgebungsvariablen ab $PATH. Dies $PATHist im Wesentlichen eine durch Doppelpunkte getrennte Liste von Verzeichnissen, die nach einer bestimmten ausführbaren Datei durchsucht werden, wenn ein Programm mithilfe eines execBetriebssystemaufrufs aufgerufen wird. Die $PATHkö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, z a.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 $PATHhat potenzielle Auswirkungen auf die Sicherheit, da ausführbare Dateien in Verzeichnissen früher in $PATHausfü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 /binin $PATH. Wenn es einem Angreifer gelingt, ein schädliches Skript, das einen Namen mit einem häufig verwendeten Systemdienstprogramm teilt, beispielsweise lsim 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 aufzurufen ls. Auch wenn .erst am Ende angehängt wird$PATHEin 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.

Thomas Nyman
quelle
Hey thomas .. Ich versuche a.out in Unbuntu 12.10 aus derselben Datei auszuführen, in der es gespeichert ist. Aber es funktioniert immer noch nicht. Ich muss ./a.out anders als in redhat verwenden.
Munai Das Udasin
Wenn Sie dies echo $PATHauf jedem der Systeme tun , sollten Sie dies .als Teil von PATHon Red Hat sehen, jedoch nicht auf dem Ubuntu-System. Wenn Sie das gleiche Verhalten auf Ubuntu wollen könnte man anfügen , .um die PATHauf Ubuntu mit dem Befehl export PATH=$PATH:.( als Beigabe PATH=$PATH:.zu , ~/.profileum 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.
Thomas Nyman
1
+1 für die Sicherheitswarnung von ./in $PATH. Unter Sicherheitsgesichtspunkten ist dies eine schlechte Idee und fördert schlampiges Verhalten, das Sie wirklich nicht brauchen.
Shadur
hi thomas .... echo $PATHin red hat hat .am ende des pfads keinen namen wie du gesagt hast echo $PATHhat 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/binund a.out arbeitet noch ...
munai das udasin
1
Beide .und eine leere Zeichenfolge $PATHbeziehen sich auf das aktuelle Verzeichnis. Beachten Sie das ::Nachher /usr/binin der Ausgabe von echo $PATH.
Thomas Nyman