Wykonywanie skryptu w Zsh - uprawnienia do plików

16

Jestem zdezorientowany, że uprawnienia do wykonywania plików nie zachowują się zgodnie z oczekiwaniami. Prawdopodobnie dlatego, że moje oczekiwania są błędne. Tak czy siak:

Mam plik skryptu, bo dla uproszczenia właśnie się nazywa s, znajduje się w ~/bin. Na potrzeby tego przykładu plik zawiera tylko następujące wiersze:

#!/bin/zsh
echo "Test";

Bardzo prosty.

Przechodzę do ~/binkatalogu i chmoduprawnienia sdo pliku 400- tj. Tylko do odczytu tylko dla mnie. Brak uprawnień do wykonania. Następnie próbuję wykonać skrypt, wpisując jego ścieżkę, podając:

% ./s
zsh: permission denied: ./s

Jak na razie dobrze. Plik nie może zostać wykonany z powodu złych uprawnień. Zezwala się również na uprawnienia do blokowania 500(przyznane uprawnienia do wykonywania) - przy tych uprawnieniach plik działa poprawnie:

% ./s
Test

To wszystko zgodnie z oczekiwaniami. Ale potem chmodprzywracam uprawnienia do 400(ponownie uruchamiam uprawnienia), próbuję sourceplik i tak się dzieje:

% source s
Test

Chociaż uprawnienia są 400, skrypt wykonuje się.

Oto moje pytanie: dlaczego ./szawodzi (tak jak powinno), ale source swykonuje się normalnie? Czy nie narusza to całego celu zezwolenia na wykonanie?

Na 400uprawnienia, sh sa zsh stakże działa.

Jestem pewien, że gdzieś coś robię lub rozumiem coś okropnie nie tak. Może ktoś wskaż, gdzie mnie i wyjaśnić różnicę między ./s, source s, sh si zsh s?

C106
źródło

Odpowiedzi:

17

Kiedy uruchamiasz ./s, mówisz jądru, aby uruchomiło program s. Jeśli masz uprawnienia do wykonywania, jądro odczytuje pierwsze kilka bajtów pliku, widzi #!linię, aby wiedzieć, że jest to skrypt, i uruchamia interpreter, przekazując mu nazwę skryptu jako pierwszy argument. Jeśli nie masz uprawnień do wykonywania, jądro przerywa wykonywanie w pierwszym kroku.

Po uruchomieniu zsh swykonujesz polecenie zshi każesz mu odczytać nazwany plik si zinterpretować go jako polecenia. Nie wykonujecie s, wykonujecie zsh. To samo z sh slub cat s.

Po uruchomieniu source sponownie każesz zsh przeczytać plik, więc ważne jest, abyś miał do niego uprawnienia do odczytu.

Gilles „SO- przestań być zły”
źródło
Ok, to ma sens. Ale czy to nie całkowicie pokonuje punktu posiadania pozwolenia na wykonanie? Nie ma znaczenia, czy jest ustawiony, czy nie, zawsze będę mógł wykonać skrypt (lub powiedzieć zsh, aby zinterpretował polecenia w skrypcie, co jest równoważne).
C106,
Ponadto cat spo prostu drukuje zawartość pliku. cat s | zshprzekazuje je zshi drukuje Test.
C106,
1
@ C106 Celem uprawnienia do wykonywania jest wskazanie, że plik reprezentuje coś, co można wykonać bez dodatkowych informacji. Jest to również ważne, jeśli plik jest setuid / setgid. Plik może nie mieć uprawnień do wykonywania, ale mimo to składa się z instrukcji, że zdarza się, że jakiś program komputerowy gdzieś się uruchamia.
Gilles „SO- przestań być zły”
To ma sens i jest naprawdę niesamowicie oczywiste. Dzięki.
C106