Forum: PC-Programmierung Programmaufrufe unter Linux - warum mit ./


von Philip K. (philip_k)


Lesenswert?

Hallo,

kann mir mal jemand erklären, warum sich unter Linux Programme manchmal 
nur mit vorangestelltem ./ aufrufen lassen?

von STK500-Besitzer (Gast)


Lesenswert?

weil sie in einem höher angeordneten Verzeichnis liegen?

von eric (Gast)


Lesenswert?

STK500-Besitzer schrieb:
> weil sie in einem höher angeordneten Verzeichnis liegen?
eher, weil sie im selben Verzeichnis liegen.

Wenn nur der Programmname angegeben wird, wird in den in PATH
angegebenen Pfaden danach gesucht.
Die andere Möglichkeit ist, den Pfad explizit anzugeben,
dabei ist . das aktuelle Verzeichnis.

../Programm würde beispielsweise etwas im übergeordneten Verzeichnis
aufrufen.
/bin/Programm absolut vom Wurzelverzeichnis aus usw...

von Fred (Gast)


Lesenswert?

Weil . aus Sicherheitsgründen zuweilen nicht im PATH ist.

von Udo S. (urschmitt)


Lesenswert?

Fred schrieb:
> aus Sicherheitsgründen

Warum aus Sicherheitsgründen?
Die Frage ist ernst gemeint.

von c.m. (Gast)


Lesenswert?

genuer: bei linux wird nur der pfad ($PATH) nach dem programmnamen 
durchsucht.
wenn dein programm irgendwo in deinem home-verzeichnis liegt wird es, 
selbst wenn du im CLI im selben verzeichnis stehst nicht gefunden wenn 
du nicht den vollen (oder relativen) pfad angibst.

von c.m. (Gast)


Lesenswert?

Udo Schmitt schrieb:
> Fred schrieb:
>> aus Sicherheitsgründen
>
> Warum aus Sicherheitsgründen?
> Die Frage ist ernst gemeint.

weil man so verhindert einem nutzer z.b. ein falsches "ls" 
unterzujubeln.
laut $PATH wird bei "ls -la" zuerst bin durchsucht, und nicht das 
verzeichnis in dem du grade stehst, z.b. ~/ .

von Fred (Gast)


Lesenswert?

Udo Schmitt schrieb:
> Warum aus Sicherheitsgründen?

Weil ich dir ein Programm mit dem Namen eines bash-builtins oder eines 
beliebigen anderen Programms, das du üblicherweise so aufrufst, in eins 
deiner Verzeichnisse (vermutlich ~) legen kann.

Und wenn du dann versuchst, das "eigentlich gemeinte" Programm 
aufzurufen, führst du meins aus. Mit deinen Rechten!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Fred schrieb:
> Weil ich dir ein Programm mit dem Namen eines bash-builtins oder eines
> beliebigen anderen Programms, das du üblicherweise so aufrufst, in eins
> deiner Verzeichnisse (vermutlich ~) legen kann.

In eins seiner Verzeichnisse kommt man als Fremder normalerweise
nicht rein.

Aber man könnte beispielsweise eins nach /tmp legen:
1
cd /tmp
2
echo ':' > ls
3
echo 'rm -rf $HOME' >> ls
4
chmod +x ls

und dann hoffen, dass der Nutzer irgendwann mal folgendes macht:
1
cd /tmp
2
ls

Indem man sich angewöhnt, "." niemals in den PATH aufzunehmen, sondern
stets ./ zu schreiben, wenn man etwas bewusst aus dem aktuellen
Verzeichnis ausführen möchte, umgeht man dieses Risiko.

: Bearbeitet durch Moderator
von Rolf Magnus (Gast)


Lesenswert?

Jörg Wunsch schrieb:
> Fred schrieb:
>> Weil ich dir ein Programm mit dem Namen eines bash-builtins oder eines
>> beliebigen anderen Programms, das du üblicherweise so aufrufst, in eins
>> deiner Verzeichnisse (vermutlich ~) legen kann.
>
> In eins seiner Verzeichnisse kommt man als Fremder normalerweise
> nicht rein.

Da reicht's ja schon aus, wenn ich dir ein tar.gz schicke, du das bei 
dir entpackst und danach in dem Verzeichnis ein ls machst.

> Indem man sich angewöhnt, "." niemals in den PATH aufzunehmen, sondern
> stets ./ zu schreiben, wenn man etwas bewusst aus dem aktuellen
> Verzeichnis ausführen möchte, umgeht man dieses Risiko.

Es gilt halt unter Linux auch nicht als der Regelfall, daß man ein 
Programm im aktuellen Verzeichnis aufruft. Wenn ich mir z.B. ein 
Programm selbst compiliere und es dann vor der Installation schon im 
Build-Verzeichnis testhalber starten will, ist das eben sein 
Spezialfall.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Man kann "." schon in die PATH-Variable mit aufnehmen, sollte aber
darauf achten, dass es an letzter Stelle (oder zumindest nach allen
Systemverzeichnissen) steht.

Natürlich könnte dann ein Bösewicht ähnlich Jörgs Vorschlag im
/tmp-Verzeichnis zwei böse Programme namens "lls" und "lss" ablegen und
hoffen, dass der Nutzer folgendes eintippt
1
cd /tmp
2
ls

und dabei die "l"- oder die "s"-Taste prellt.

Ich persönlich kann  mit diesem Risiko aber leben ;-)

von 19:25 (Gast)


Lesenswert?

Yalu X. schrieb:
> Man kann "." schon in die PATH-Variable mit aufnehmen, sollte aber
> darauf achten, dass es an letzter Stelle (oder zumindest nach allen
> Systemverzeichnissen) steht.


Wie soll das funktionieren, ohne in kürzester Zeit auf seltsame 
Ereignisse aufgrund gleichnamiger Dateien zu stoßen?
Z.B. Skripte ala configure.sh finden sich mehrere Dutzend.


Macht doch schon daher keiner, es wurde wohl ein Beispiel gebraucht ...

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

19:25 schrieb:
> Z.B. Skripte ala configure.sh finden sich mehrere Dutzend.

Allerdings (normalerweise) nicht innerhalb von PATH.

von Vn N. (wefwef_s)


Lesenswert?

Prinzipiell liese sich das ganze dann auch zur Rechteausweitung 
anwenden, indem man z.B. eine Anwendung namens "apt-get" in ~/ ablegt. 
Beim nächsten "sudo apt-get install xyz" gibts dann ne böse 
Überraschung.

von Amateur (Gast)


Lesenswert?

Das ist eine Eigenart von Linux, welches wirklich nur die, in der 
Path-Variablen, stehenden Verzeichnisse nach einem Befehl durchsucht. 
Interessanterweise schaut es auch nicht im aktuellen Verzeichnis nach.

Genau wie bei DOS ist das "Punkt"-Verzeichnis das aktuelle. Der einzige 
Unterschied ist die Linuxer stehen auf den Schrägstrich (/) und in der 
Dose ist ein Backslash (\). Also im übertragenen Sinne haben "./" und 
".\" die gleiche Bedeutung.

von Rolf Magnus (Gast)


Lesenswert?

Yalu X. schrieb:
> Man kann "." schon in die PATH-Variable mit aufnehmen, sollte aber
> darauf achten, dass es an letzter Stelle (oder zumindest nach allen
> Systemverzeichnissen) steht.

Dann startet man allerdings versehentlich das falsche Programm, wenn es 
irgendwo im PATH schon eins mit dem gleichen Namen gibt. Der Klassiker 
ist da die Verwirrung, wenn jemand sich z.B. ein kleines C-Programm 
bastelt und es erstmal test nennt und sich dann wundert, warum sein 
printf ignoriert wird.

von 19:25 (Gast)


Lesenswert?

Jörg Wunsch schrieb:

> Allerdings (normalerweise) nicht innerhalb von PATH.

War eh ein bloedes Beispiel.



... und oups, was man nicht so alles in seiner /etc/profile findet,


if [ ! "`id -u`" = "0" ]; then
 PATH="$PATH:."
fi

"Nicht-Roots" bekommen beim Shell-Aufruf, hier bash (/etc/profile -> 
~/.bashrc), das aktuelle Verzeichnis in den Pfad gehaengt.

Aber ist das notwendig?

von Yalu X. (yalu) (Moderator)


Lesenswert?

vn nn schrieb:
> Prinzipiell liese sich das ganze dann auch zur Rechteausweitung
> anwenden, indem man z.B. eine Anwendung namens "apt-get" in ~/ ablegt.

Wenn ein Bösewicht Schreibrechte auf mein Home-Verzeichnis hat, ändert
er meine PATH-Variable durch Ändern von .bashrc sowieso nach seinem
Belieben. Oder er ruft seine Malware gleich von meinem .bash_profile aus
auf. In diesem Fall hat man ohnehin verloren.

Rolf Magnus schrieb:
> Dann startet man allerdings versehentlich das falsche Programm, wenn es
> irgendwo im PATH schon eins mit dem gleichen Namen gibt. Der Klassiker
> ist da die Verwirrung, wenn jemand sich z.B. ein kleines C-Programm
> bastelt und es erstmal test nennt und sich dann wundert, warum sein
> printf ignoriert wird.

Die Verwirrung entsteht aber auch dann, wenn "." nicht in PATH enthalten
ist, der potentiell Verwirrt-Werdende aber vergisst, dem "test" das "./"
voranzustellen.

Bei "test" passiert meist zum Glück nicht Schlimmes. Und dass man seine
eigenen Programme nicht "rm" o.ä. nennt, das lehrt die Erfahrung ;-)

von 19:25 (Gast)


Lesenswert?

> ist, der potentiell Verwirrt-Werdende aber vergisst, dem "test" das "./"
> voranzustellen.
>
> Bei "test" passiert meist zum Glück nicht Schlimmes. Und dass man seine
> eigenen Programme nicht "rm" o.ä. nennt, das lehrt die Erfahrung ;-)

So jetzt allen nochmal ein herzliches RTFM ;)

man bash

.  filename [arguments]
       source filename [arguments]


Read and execute commands from filename  in  the  current  shell
environment  and return the exit status of the last command exe-
cuted from filename.  If filename does not contain a slash, filenames in
PATH  are used to find the directory containing filname.  The file
searched for in PATH  need  not  be executable.
When  bash  is  not  in  posix  mode,  the  current directory is 
searched
if no file is found in PATH.  If the sourcepath option to  the  shopt
builtin  command  is turned off, the PATH is not searched.  If any
arguments are supplied, they become the positional  parameters  when
filename  is  executed.  Otherwise the positional parameters are
unchanged. The return status  is the status  of  the  last  command 
exited
within the script (0 if no commands are executed), , and false if 
filename
is  not  found  or cannot be read.


This builtin is equivalent to source.

von 19:25 (Gast)


Lesenswert?

19:25 schrieb:
>> ist, der potentiell Verwirrt-Werdende aber vergisst, ...

Toller Satz,


> So jetzt allen nochmal ein herzliches RTFM ;)

shortcut, for full viewer convenience

$ man bash|less -p '.  filename \[arguments\]'

von Stefan R. (srand)


Lesenswert?

19:25 schrieb:
> So jetzt allen nochmal ein herzliches RTFM ;)
>
> man bash
>
> .  filename [arguments]
>        source filename [arguments]

Dann lies das fcking manual richtig!

. bla
ist etwas völlig anderes als
./bla


So, und nun darfst du dich wieder verkriechen. Meine Güte!

Hauptsache, einen auf Checker machen.

von 11:55 (Gast)


Lesenswert?

Mit etwas gutem willen kriegst du das bestimmt noch unfreundlicher hin.

Nein ist nicht das selbe, aber nicht alles was ausgefuehrt werden kann
muss auch nicht unbedingt als ausfuehrbar gekennzeichnet sein.


$ mkdir spielwiese
$ cd spielwiese

$ echo 'echo "Hello World!"' > hello

$ ls -n
total 4
-rw-r--r-- 1 1001 1001 20 2014-02-26 11:50 hello

$ ./hello
bash: ./hello: Permission denied
$ hello
bash: hello: command not found
$ . hello
Hello World!


----------------

$ chmod u+x hello
$ ./hello
Hello World!
$ hello
bash: hello: command not found
$ pwd
/tmp/spielwiese
$ PATH="$PATH:/tmp/spielwiese"
$ hello
Hello World!

von Rolf Magnus (Gast)


Lesenswert?

11:55 schrieb:
> Mit etwas gutem willen kriegst du das bestimmt noch unfreundlicher hin.

Da muß man sich ja nicht wundern, wenn man großkotzig mit "RTFM" 
auftritt und dann das Thema verfehlt.

> Nein ist nicht das selbe

Ist was vollkommen anderes...
Beim ./ geht's darum, explizit das Verzeichnis anzugeben, wo das 
Programm liegt, das ausgeführt werden soll. Das einfache . ist das 
gleiche wie das Kommando 'source' und dient dazu, ein Skript statt in 
einer neuen Shell-Instanz in der aktuellen auszuführen.

11:55 schrieb:
> $ . hello
> Hello World!

Das geht aber auch nur bei Skripten.

von Vn N. (wefwef_s)


Lesenswert?

Yalu X. schrieb:
> Wenn ein Bösewicht Schreibrechte auf mein Home-Verzeichnis hat, ändert
> er meine PATH-Variable durch Ändern von .bashrc sowieso nach seinem
> Belieben. Oder er ruft seine Malware gleich von meinem .bash_profile aus
> auf. In diesem Fall hat man ohnehin verloren.

Braucht er ja nicht mal, wie oben bereits geschrieben reicht es ja 
schon, sein Programm in ein Archiv zu packen, welches du entpackst.

von W.S. (Gast)


Lesenswert?

Ach Leute,

ich verirre mich ja wirklich selten in diese Gefilde hier - aber eure 
Diskussion hat mir mal wieder drastisch vor Augen geführt, warum ich 
Linux und alle unixoide BS nicht leiden mag. Mit größerem Abstand 
gesehen ist es wohl doch ein General-Bug, unixoide Shells überhaupt in 
einem Rechnersystem zu haben. Jetzt verweist bitte nicht auf abgesetzte 
Systeme und deren Fernwartung, ein PC ist nicht sowas und abgesetzte 
systeme sollten eine Firmware intus haben. FIRM eben.


Manchmal kommt mir so ein abenteuerlicher Traum, bei derartigen OS 
einfach sämtliche Shells ersatzlos zu entfernen, dazu gleich auch noch 
sämtliche Shell-Skripte. Als nächstes auch noch führende Punkte bei 
Dateinamen verbieten und für ausführbare Dateien zwingend eine 
entsprechende Extension vorzuschreiben, die Ausführung von Dateien auf 
das aktuelle Verzeichnis zu beschränken mit Ausnahme von Anwendungen, 
die vom BS als namentlich bekannte und system-modale Anwendungen 
dediziert geführt werden oder per qualifizierter Pfadangabe. Als 
nächstes dann ersatzloses Entfallen jeglicher "home" Verzeichnisse und 
deren Ersatz durch Installationsverzeichnisse der Anwendungen innerhalb 
der Volumes sowie Einführen eines generellen Verzeichnisses "linux", wo 
ALLES, was sich bisher sonstwo im root Verzeichnis tummelt, 
hinverschoben ist, nur Verzeichnisse aber keinerlei Datei in root 
möglich, kurzum freiräumen von root, bis es etwa so aussieht wie bei 
Windows CE: nix außer temp, windows und benannte Volumes (soviel wie 
physisch vorhanden).

... ok, für begeisterte Linuxer dürfte das eher ein Alptraum sein, 
zwingt es sie doch zu einem Arbeiten mit Applikationen anstelle von 
Tools ;-)

n schönen Abend noch,

W.S.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

W.S. schrieb:
> ich verirre mich ja wirklich selten in diese Gefilde hier

Ah, dein Beitrag hatte uns noch gefehlt.  Danke dafür, wir hatten das
schon vermisst!

von Vn N. (wefwef_s)


Lesenswert?

W.S. schrieb:
> ich verirre mich ja wirklich selten in diese Gefilde hier - aber eure
> Diskussion hat mir mal wieder drastisch vor Augen geführt, warum ich
> Linux und alle unixoide BS nicht leiden mag. Mit größerem Abstand
> gesehen ist es wohl doch ein General-Bug, unixoide Shells überhaupt in
> einem Rechnersystem zu haben.

Und jetzt erklärst du uns bitte noch, wo da der Unterschied zu Windows 
besteht. Ach, warte, einen Unterschied gibt es, im Gegensatz zu 
unixartigen Systemen, wo durch den im Thread angeführten Mechanismus 
dieses Einfallstor geschlossen wurde, existiert es unter Windows 
weiterhin.
1
>dir
2
<DIR>  folder
3
       song.mp3
4
       pic.jpg
5
       xcopy.rar
6
7
>xcopy pic.jpg folder
8
C:pic.jpg
9
1 Datei(en) kopiert
10
11
>rar -x xcopy.rar
12
13
>dir
14
<DIR>  folder
15
       song.mp3
16
       pic.jpg
17
       xcopy.exe
18
       xcopy.rar
19
20
>xcopy pic.jpg folder
21
gotcha!

von wtf (Gast)


Lesenswert?

W.S. schrieb:
> ich verirre mich ja wirklich selten in diese Gefilde hier - aber eure
> Diskussion hat mir mal wieder drastisch vor Augen geführt, warum ich
> Linux und alle unixoide BS nicht leiden mag. Mit größerem Abstand
> gesehen ist es wohl doch ein General-Bug, unixoide Shells überhaupt in
> einem Rechnersystem zu haben.
Sowas kann nur jemand sagen, der nicht im geringsten weiß wovon er da 
redet.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.