• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

gelöst [Befehl aus aktuellem Verzeichnis ausführen]

padersuse

Hacker
Hallo,

ich hab nur eine einfache Frage : will man einen Befehl aus einem aktuellem Verzeichnis ausführen, welcher nicht Bestandtteil der Variable PATH ist, so geht das über
Code:
./befehl_aus_akzuellem_verzeichnis
. Dafür müßte aber der Punkt
Code:
.
Bestandteil der Variable PATH sein. Den finde ich aber nicht mit echo $PATH. Auch .bashrc oder .profile helfen mir da nicht weiter. Wie erklärt sich das ?

Gruß
Padersuse
 

josef-wien

Ultimate Guru
Es wäre wohl gewaltig übertrieben, bei jedem Verzeichniswechsel den Pfad zu ändern. Der Punkt ist schlicht ein hardlink auf den Names des Verzeichnisses, so wie zwei Punkte ein hardlink auf den Namen des übergeordneten Verzeichnisses sind. Wenn Du den Namen des aktuellen Verzeichnisses benötigst, kannst Du $PWD verwenden.
 

RME

Advanced Hacker
Hallo,

Wenn Du einen Befehl mit Path-Angabe eingibst:
Code:
/<wo>/Befehl
dann wird dieser gefunden (sofern er dort existiert).

Wenn Du einen Befehl ohne Path-Angabe eingibst:
Code:
Befehl
dann wird dieser nur gefunden wenn sich dieser in einem von PATH spezifizierten Path befindet.

Die Angabe:
Code:
./Befehl
entspricht einer Eingabe mit Path-Angabe (nämlich "." == das lokale Verzeichnis).

Mach mal (in der Konsole):
Code:
ls -la
...da siehst Du das Verzeichnis "." welches das "working" Verzeichnis ist.

Daher:
Code:
ls -l .
(-l Abstand Punkt)

Gruss,
Roland
 
OP
P

padersuse

Hacker
Hallo Roland,

unter http://www.oreilly.de/german/freebooks/rlinux3ger/ch0411.html kann man nachlesen, dass der Punkt Bestandteil der PATH-Variable sein kann.
Hier müssen Sie genau hinsehen. Die Anzeige stellt eine Reihe von Pfadnamen dar, die durch Doppelpunkte getrennt sind. Der erste Pfadname in diesem Fall ist /usr/local/bin, der zweite /usr/bin usw. Wenn zwei Versionen eines Befehls vorhanden sind, die in /usr/local/bin und /usr/bin stehen, wird der Befehl in /usr/ local/bin ausgeführt. Der letzte Pfadname in diesem Beispiel ist einfach ein Punkt; dieser bezeichnet das aktuelle Verzeichnis. Anders als DOS durchsucht Unix nicht automatisch das aktuelle Verzeichnis, sondern Sie müssen es ausdrücklich dazu anweisen - so wie wir es hier gezeigt haben. Manche Leute halten das aus Gründen der Systemsicherheit für eine schlechte Idee. (Ein Eindringling, der in Ihren Account vordringt, könnte ein bösartiges Programm in eines Ihrer Arbeitsverzeichnisse kopieren.) Das betrifft aber hauptsächlich den Systemverwalter; normale Benutzer müssen sich wenig Sorgen darum machen.

Daher frage ich mich, wie opensuse damit umgeht. Unter opensuse12 kann man, indem man vor einen Befehl
Code:
./
anstellt, diesen aus dem aktuellen Verzeichnis ausführen. Der Punkt ist aber in meinem System kein Betsandteil der PATH-Variablen. Das verstehe ich nicht.

Gruß Padersuse
 

Rainer Juhser

Moderator
Teammitglied
padersuse schrieb:
Der Punkt ist aber in meinem System kein Betsandteil der PATH-Variablen. Das verstehe ich nicht.
Warum nicht? Ist doch erklärt:
Manche Leute halten das aus Gründen der Systemsicherheit für eine schlechte Idee. (Ein Eindringling, der in Ihren Account vordringt, könnte ein bösartiges Programm in eines Ihrer Arbeitsverzeichnisse kopieren.)
Zu den "manchen Leuten" gehören auch die Macher von Opensuse. Du musst den ./ explizit vor den Befehl schreiben, weil der Punkt und damit das aktuelle Verzeichnis nicht Bestandteil der PATH-Variable ist. Und das ist auch gut so!
 

Faxxon

Member
Dann füge den Punkt halt hinzu (z.B. in Deiner .bashrc). Funktionieren tut es jedenfalls:
Code:
~> echo -e '#!/bin/bash\n echo Test' >Test.bash
~> chmod u=rwx Test.bash
~> PATH="${PATH}:."
~> Test.bash
Test
~>
Was Du davon hast, verstehe ich allerdings nicht...
 

RME

Advanced Hacker
Der Punkt ist schlicht ein hardlink auf den Names des Verzeichnisses...
Zum Beispiel:
Code:
~/xxx > ls -lai
total 12
 921242 drwxr-xr-x  3 user0 users 4096 Oct  1 15:44 .
 915713 drwxr-xr-x 51 user0 users 4096 Oct  1 15:43 ..
 921293 -rw-r--r--  1 user0 users    0 Oct  1 15:44 testfile_1
1186135 drwxr-xr-x  2 user0 users 4096 Oct  1 15:44 yyy
~/xxx > 
~/xxx > cd yyy
~/xxx/yyy > 
~/xxx/yyy > ls -lai
total 8
1186135 drwxr-xr-x 2 user0 users 4096 Oct  1 15:44 .
 921242 drwxr-xr-x 3 user0 users 4096 Oct  1 15:44 ..
1186136 -rw-r--r-- 1 user0 users    0 Oct  1 15:44 testfile_2
~/xxx/yyy >
Du siehst von:
1186135 drwxr-xr-x 2 user0 users 4096 Oct 1 15:44 yyy
dass:
inode Nummer von yyy = 1186135

Aber auch:
1186135 drwxr-xr-x 2 user0 users 4096 Oct 1 15:44 .
hat die gleiche inode Nummer.
Daher:
"." ist ein Hardlink zu yyy

----------

Du könntest (wie Du schreibst) das "." Verzeichnis in der Variablen PATH hinzufügen -- aber wenn, dann umbedingt am Ende:
Code:
export PATH=$PATH:.
da sonst Probleme entstehen wenn in Deinem 'working' Verzeichnis eine Datei existiert welche den gleichen Namen hat wie eine System Routine. Z.B. wenn Du in Deinem 'working' Verzeichnis eine Datei mit Namen 'fdisk' hättest und das "." Verzeichnis am Anfang in der PATH Variablen wäre, dann würde ein Aufruf von 'fdisk' nicht die System- sondern Deine Datei aufrufen (dies wäre auch ein Sicherheits Risiko).

Gruss,
Roland
 

abgdf

Guru
padersuse schrieb:
Hallo Roland,

unter http://www.oreilly.de/german/freebooks/rlinux3ger/ch0411.html kann man nachlesen, dass der Punkt Bestandteil der PATH-Variable sein kann.
...
Daher frage ich mich, wie opensuse damit umgeht. Unter opensuse12 kann man, indem man vor einen Befehl
Code:
./
anstellt, diesen aus dem aktuellen Verzeichnis ausführen. Der Punkt ist aber in meinem System kein Betsandteil der PATH-Variablen. Das verstehe ich nicht.
Ich glaube, ich kann das aufklären:
Wenn der Punkt Bestandteil der PATH-Variable ist, kannst Du einen Befehl, der sich im aktuellen Verzeichnis befindet, mit
Code:
befehl
ausführen, also ohne das "./" davor. Eben, weil der Punkt in $PATH gefunden wird.
Wenn der Punkt nicht Bestandteil der PATH-Variable ist, kannst Du einen Befehl, der sich im aktuellen Verzeichnis befindet, mit
Code:
./befehl
ausführen. Das geht also immer.
Bei dem Abschnitt in dem Buch geht es also nur um die Frage, ob man Befehle im aktuellen Verzeichnis schlicht mit
Code:
befehl
ausführen kann oder nicht. Für "root" ist soweit ich weiß die Standardeinstellung, daß das aus Sicherheitsgründen nicht geht. Hier muß man "./befehl" verwenden, das geht wie gesagt immer.
 
A

Anonymous

Gast
Rainer Juhser schrieb:
Zu den "manchen Leuten" gehören auch die Macher von Opensuse. Du musst den ./ explizit vor den Befehl schreiben, weil der Punkt und damit das aktuelle Verzeichnis nicht Bestandteil der PATH-Variable ist. Und das ist auch gut so!

Sowas kann Kreuz-Gefährlich sein. Stell dir vor root hätte "." in der Pathvariable und dann auch noch gleich als erstes. (Das das bei root nicht gehen sollte, währe mir neu, müsste dann wohl in der Bash abgefangen werden)
Ein User braucht jetzt in sein Homeverzeichnis nur ein kleines "böses" Script unter dem Namen "ls" abzulegen und die Ausführungsrechte darauf zu vergeben.
Besucht root jetzt dieses Verzeichnis und gibt dort ein "ls" ab, nur um mal nachzusehen welche Dateien es dort gibt, dann startet er mit Rootrechten das bösartige Userscript. Wenn das raffiniert gemacht wird, merkt es root nicht mal, da das Script so geschrieben wurde, das des am Ende dann die Ausgabe von "ls" bringt, die Root ja sehen wollte und der Rest des Scriptes still und heimlich ohne Ausgaben abgelaufen ist. Bei "ls" könnte dort eventuell noch ein Alias das verhindern, doch bei 99.9% der typischen Befehle die root interaktiv ausführen könnte, gibt es normalerweise keinen Alias der das verhindern würde.

Wenn denn der Punkt wirklich mal temporär benötigt wird, dann immer nur als aller letzten Eintrag in der PATH-Variable, aber dann verstärkt aufpassen mit "typischen Verschreibern" in fremden Verzeichnissen :D


robi
 
Oben