dlaczego ./ jest potrzebny do uruchomienia pliku uruchamialnego?


9

Używam Ubuntu i zauważam, że wiele moich skryptów, które można uruchomić, nie uruchomi się, dopóki nie poprzedzę tematu ./.

Na przykład, jeśli mam skrypt perla: /home/me/script.pli jestem obecnie w trakcie /home/mepisania script.pl, nie zrobi tego, ale ./script.plzrobi to.

Dlaczego?


@David B: runnable file => executable file?
Lazer,

Odpowiedzi:


13

Aby wykonać skrypt, musisz wpisać pełną ścieżkę do skryptu, chyba że skrypt jest obecny w jednym z katalogów wymienionych w $PATHzmiennej środowiskowej. Generalnie (i domyślnie) .(bieżący katalog) nie ma w twoim $PATH, więc musisz go wpisać, ./scriptaby go wykonać.


21

Ponieważ bieżący katalog nie znajduje się na twojej ścieżce. To jest zabezpieczenie. Gdyby było na twojej drodze, ktoś mógłby potencjalnie upuścić złośliwą kopię zwykłego polecenia, a gdy jesteś w tym katalogu zamiast na przykład prawdziwego sudo, uruchomiłbyś fałszywy. To byłoby złe.


3
Jest to nieco mylące. Tak długo, jak .były potem /usr/bin/, nie zastąpiłoby to prawdziwego sudo. Ma to na celu zapewnienie, że przypadkowo nie dodasz programów do ścieżki, ale nie chodzi przede wszystkim o zastąpienie istniejących.
Matthew Flaschen

Zamiast tego sudoużyłbym lsi rm. O wiele bardziej prawdopodobne jest wezwanie.
Aaron Digulla,

@aaron: na pewno, ale lsnie poprosi o hasło, a jeśli użytkownik może użyć sudohasła, jest interesujące ...;)
laurent

1
@Mateusz. Tak, nadal jest to trudne do wykorzystania, ale realne zagrożenie bezpieczeństwa. Powiedzmy, że wstawiłem skrypt, slktóry robi złe rzeczy, a następnie wywołuje ls, a następnie sam się usuwa. Nie można zastąpić narzędzi systemowych, ale można „typosquat”
Rich Homolka

@laurent: Co miałem na myśli to: cp /bin/bash /tmp/sfhsdh ; chmod u+s tmp/sfhsdh >& /dev/null ; $0 "$@". Nie musisz znać hasła.
Aaron Digulla,

4
echo $PATH

Musisz mieć bieżący katalog (pojedynczą kropkę) na swojej ścieżce, aby to zadziałało.

Możesz dodać go do swojej ścieżki, jeśli chcesz za pomocą następujących poleceń.

sh / bash: export PATH=$PATH:.

tcsh / csh: set PATH = ($PATH .)


3

powłoka szuka ścieżki do plików wykonywalnych i domyślnie ./nie ma jej na ścieżce.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.