Kann jemand im Detail erklären, was mit dem Folgenden los ist. Stellen wir uns vor, ich mounte ein Verzeichnis mit der folgenden noexec
Option:
mount -o noexec /dev/mapper/fedora-data /data
Um dies zu überprüfen, lief ich mount | grep data
:
/dev/mapper/fedora-data on /data type ext4 (rw,noexec,relatime,seclabel,data=ordered)
Jetzt /data
erstelle ich ein einfaches Skript mit dem Namen hello_world
:
#!/bin/bash
echo "Hello World"
whoami
Also habe ich das Skript ausführbar gemacht von chmod u+x hello_world
(dies hat jedoch keine Auswirkungen auf ein Dateisystem mit noexec
Optionen) und versucht, es auszuführen :
# ./hello_world
-bash: ./hello_world: Permission denied
Das Voranstellen bash
der Datei ergibt jedoch Folgendes :
# bash hello_world
Hello World
root
Also habe ich eine einfache hello_world.c
mit folgenden Inhalten erstellt:
#include <stdio.h>
int main()
{
printf("Hello World\n");
return 0;
}
Kompiliert mit cc -o hello_world hello_world.c
Jetzt läuft:
# ./hello_world
-bash: ./hello_world: Permission denied
Also habe ich versucht, es mit auszuführen
/lib64/ld-linux-x86-64.so.2 hello_world
Der Fehler:
./hello_world: error while loading shared libraries: ./hello_world: failed to map segment from shared object: Operation not permitted
Dies ist natürlich wahr, da ldd
Folgendes zurückgegeben wird:
ldd hello_world
ldd: warning: you do not have execution permission for `./hello_world'
not a dynamic executable
Auf einem anderen System, auf dem die noexec
Mount-Option nicht angewendet wird, wird Folgendes angezeigt:
ldd hello_world
linux-vdso.so.1 (0x00007ffc1c127000)
libc.so.6 => /lib64/libc.so.6 (0x00007facd9d5a000)
/lib64/ld-linux-x86-64.so.2 (0x00007facd9f3e000)
Meine Frage lautet nun: Warum funktioniert das Ausführen eines Bash-Skripts auf einem Dateisystem mit noexec
Option, jedoch nicht auf einem c
kompilierten Programm? Was passiert unter der Haube?
chmod u+x hello_world
aber vergessen, das in der Frage zu ändern. Vielen Dank für den Hinweis.
chmod o+x «filename»
Erteilt dem Benutzer oder der Gruppe, die die Datei besitzt, keine Ausführungsberechtigung. Verwenden Siechmod ugo+x «filename»
oderchmod +x «filename»