Ausführen eines Skripts mit zsh-Dateiberechtigungen

16

Ich bin verwirrt darüber, dass sich die Berechtigungen zum Ausführen von Dateien nicht wie erwartet verhalten. Wahrscheinlich, weil meine Erwartungen falsch sind. Wie auch immer:

Ich habe eine Skriptdatei, die der Einfachheit halber nur aufgerufen wird sund sich in befindet ~/bin. In diesem Beispiel enthält die Datei nur die folgenden Zeilen:

#!/bin/zsh
echo "Test";

Sehr einfach.

Ich navigieren Sie zu dem ~/binVerzeichnis und chmoddie Dateiberechtigungen von szu 400- also schreibgeschützt nur für mich. Keine Ausführungsberechtigung. Dann versuche ich, das Skript auszuführen, indem ich seinen Pfad eingebe.

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

So weit, ist es gut. Die Datei kann aufgrund falscher Berechtigungen nicht ausgeführt werden. Das Anhäufen von Berechtigungen bis 500(gewährte Ausführungsberechtigung) funktioniert ebenfalls einwandfrei. Mit diesen Berechtigungen wird die Datei einwandfrei ausgeführt:

% ./s
Test

Das ist alles wie erwartet. Aber dann habe ich die chmodBerechtigung zurückgesetzt 400(Berechtigung erneut ausführen aus), um sourcedie Datei zu testen, und dies passiert:

% source s
Test

Obwohl Berechtigungen vorhanden sind 400, wird das Skript ausgeführt.

Hier ist meine Frage: Warum schlägt ./sfehl (wie es sollte), wird aber source snormal ausgeführt? Hat dies nicht den ganzen Zweck der Ausführungserlaubnis zunichte gemacht?

Bei 400Berechtigungen sh sund zsh sauch arbeiten.

Ich bin sicher, dass ich irgendwo etwas schrecklich Falsches tue oder verstehe. Kann jemand Punkt, wo ich, und den Unterschied zwischen erklären ./s, source s, sh sund zsh s?

C106
quelle

Antworten:

17

Wenn Sie ausführen ./s, weisen Sie den Kernel an, das Programm auszuführen s. Wenn Sie über die Ausführungsberechtigung verfügen, liest der Kernel die ersten Bytes der Datei, erkennt die #!Zeile und erkennt, dass es sich um ein Skript handelt, führt den Interpreter aus und übergibt ihm den Skriptnamen als erstes Argument. Wenn Sie keine Ausführungsberechtigung haben, bricht der Kernel die Ausführung im ersten Schritt ab.

Wenn Sie ausführen zsh s, führen Sie zshdie Datei aus und weisen sie an, die aufgerufene Datei zu lesen sund als Befehle zu interpretieren. Sie führen nicht aus s, Sie führen aus zsh. Gleiches mit sh soder cat s.

Wenn Sie erneut ausführen source s, weisen Sie zsh an, eine Datei zu lesen. Wichtig ist also, dass Sie über Leseberechtigungen verfügen.

Gilles 'SO - hör auf böse zu sein'
quelle
Okay, das macht Sinn. Aber ist das nicht völlig sinnlos, wenn man die Ausführungsberechtigung hat? Egal ob gesetzt oder nicht, ich kann das Skript immer ausführen (oder zsh anweisen, die Befehle im Skript zu interpretieren, was äquivalent ist).
C106
Druckt auch cat snur den Inhalt der Datei. cat s | zshübergibt sie an zshund druckt Test.
C106
1
@ C106 Mit der Ausführungsberechtigung wird angegeben, dass die Datei etwas darstellt, das Sie ohne zusätzliche Informationen ausführen können. Es ist auch wichtig, wenn die Datei setuid / setgid ist. Eine Datei hat möglicherweise keine Ausführungsberechtigung, besteht jedoch aus Anweisungen, die möglicherweise von einem Computerprogramm ausgeführt werden.
Gilles 'SO- hör auf böse zu sein'
Das macht sehr viel Sinn und ist in der Tat unglaublich offensichtlich. Vielen Dank.
C106