Antworten:
Angenommen, Sie haben die Datei myscript
, die Folgendes enthält:
#!/bin/bash
echo "Hello, World!"
Wenn Sie diese Datei ausführbar machen und mit ausführen ./myscript
, erkennt der Kernel, dass die ersten beiden Bytes vorhanden sind #!
, was bedeutet, dass es sich um eine Skriptdatei handelt. Der Kernel verwendet dann den Rest der Zeile als Interpreter und übergibt die Datei als erstes Argument. So läuft es:
/bin/bash myscript
und bash liest die Datei und führt die darin enthaltenen Befehle aus.
Damit bash (oder welcher Interpreter auch immer Ihr Skript benötigt) das Skript "ausführen" kann, muss es nur in der Lage sein, die Datei zu lesen.
Bei Skripten erleichtert das Ausführungsbit die Ausführung. Solange bash ausführbar ist, können Sie bash immer mit der Skriptdatei als Argument ausführen oder bash interaktiv ausführen und das Skript Zeile für Zeile in Ihr Terminal kopieren, um die Befehle ausführen zu lassen.
Stellen Sie sicher, dass Sie "Ausführen des Shell-Skripts" nicht mit "Ausführen eines Shell-Skripts mit sh" verwechseln.
Dies wird nicht durch Dateiberechtigungen beeinflusst auf file.sh
:
sh file.sh
Sie führen aus sh
(was in das Programm aufgelöst wird /bin/sh
), was file.sh
den Code liest und ausführt.
Dateiberechtigungen werden wirksam, wenn Sie das Skript selbst ausführen :
./file.sh
Beachten Sie, dass Dateiberechtigungen von Nicht-Linux-Dateisystemen wie FAT nicht unterstützt werden. Selbst wenn Sie eine chmod -x file.sh
Datei ausführen , hat diese die vorherigen Berechtigungen.
Die Ausführungsberechtigung wird vom Dateisystem erzwungen. Programme können den Code aber auch "ausführen", indem sie den Dateiinhalt lesen, wodurch die Dateisystemberechtigungen bei "Ausführen" umgangen werden.
bash
) aufrufen , um die Ausführung durchzuführen - um zu blockieren, dass Sie auch ihre read
Erlaubnis entziehen müssten .
If you set the executable permission, the script can be run directly by users who have that permission - whether they have it on a group, world or owner basis
Aber wie wird die Berechtigung verschiedenen Benutzern durch Überprüfen der ausführbaren Berechtigung erteilt? Und ich habe deinen zweiten Punkt. Sie wollen damit die Leseberechtigung für das Skript entfernen, damit sie es nicht einmal durch Bash verarbeiten können. Recht?
sudo chmod g+x myfile.sh
im Terminal aufrufen , um Ausführungsberechtigungen für die Dateigruppe hinzuzufügen. Siehe Tutorial zu Dateiberechtigungen . Um Berechtigungen für mehrere Benutzer gleichzeitig zu verwalten, würden Sie Gruppen verwenden, siehe zum Beispiel Gruppen verwalten .
Denk nicht so darüber nach. Kann ich diese Datei ausführen? Stellen Sie sich das folgendermaßen vor: Wer kann diese Datei ausführen?
Wenn der Computer Ihnen gehört und die Datei Ihnen gehört, können Sie sie sicher ausführen. Vielleicht möchten Sie Befehle wie chmod und chown sowie Dateiberechtigungen genauer untersuchen.
Ich hoffe das hilft.
Der exec
Systemaufruf des Linux-Kernels schlägt fehl, EACCES
wenn die Datei nicht ausführbar ist
Während Sie dies tun können sh myprog.sh
(was nur das Lesen der Dateien und Interpretationen betrifft), kann der Versuch, das Programm so auszuführen, ./myprog.sh
nicht funktionieren, da Sie dies tun:
exec
Systemaufruf auf./myprog.sh
exec
Systemaufruf des Linux-Kernels wie folgt interpretiert : https://stackoverflow.com/questions/2429511/why-do-people-write-the-usr-bin-env-python-shebang-on -die-erste-zeile-eines-pyt / 40938801 # 40938801Dies kann überprüft werden mit main.c
:
#define _XOPEN_SOURCE 700
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
int main(void) {
char *argv[] = {"myprog", NULL};
char *envp[] = {NULL};
int ret;
ret = execve("myprog.sh", argv, envp);
perror("execve");
printf("%d\n", errno);
printf("%d\n", EACCES);
}
und myprog.sh
:
#!/bin/sh
echo worked
Wenn myprog.sh
nicht ausführbar, main
schlägt fehl mit:
execve: Permission denied
13
13
Getestet in Ubuntu 17.10 gcc -std=c99
.
POSIX 7 erwähnt, dass bei:
Die exec-Funktionen mit Ausnahme von fexecve () schlagen fehl, wenn:
[EACCES] Die Suchberechtigung wird für ein Verzeichnis verweigert, das im Pfadpräfix der neuen Prozessabbilddatei aufgeführt ist, oder die neue Prozessabbilddatei verweigert die Ausführungsberechtigung.
Weitere Gründe finden Sie unter: https://security.stackexchange.com/questions/66550/unix-execute-permission-can-easly-bypassed-is-it-superfluous-or-whats-the