it-swarm.com.de

Können Skripte auch dann ausgeführt werden, wenn sie nicht als ausführbar festgelegt wurden?

Ich kann scheinen, Indexe (.sh) mit und ohne sie laufen zu lassen, die als ausführbar eingestellt werden. Wo genau ist das wichtig?

23
Ashfame

Angenommen, Sie haben die Datei myscript, die Folgendes enthält:

#!/bin/bash
echo "Hello, World!"

Wenn Sie diese Datei ausführbar machen und mit ./myscript ausführen, erkennt der Kernel, dass die ersten beiden Bytes #! 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.

21
geirha

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 für file.sh beeinflusst:

sh file.sh

Sie führen sh aus (das in das Programm /bin/sh aufgelöst wird), das file.sh liest und dessen Code ausführt.

Dateiberechtigungen werden wirksam, wenn Sie wirklich das Skript selbst ausführen:

./file.sh

Beachten Sie, dass Dateiberechtigungen von Nicht-Linux-Dateisystemen wie FAT nicht unterstützt werden. Selbst wenn Sie chmod -x file.sh ausführen, hat die Datei 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.

15
Lekensteyn

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 sich eingehender mit Befehlen wie chmod und chown und Dateiberechtigungen befassen.

Ich hoffe das hilft.

1
myusuf3

Der Systemaufruf exec des Linux-Kernels schlägt mit EACCES fehl, wenn die Datei nicht ausführbar ist

Während Sie sh myprog.sh ausführen können (das nur die Dateien liest und interpretiert), kann der Versuch, das Programm als ./myprog.sh auszuführen, nicht funktionieren, da Sie dies tun:

Dies kann mit main.c überprüft werden:

#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 ist, schlägt main 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-be-easy-bypassed-is-it-superfluous-or- was ist das