Was bedeutet das NOEXEC-Flag beim Mounten von Verzeichnissen auf RHEL?

11

Ich versuche, das NOEXEC-Flag beim Mounten zu verstehen.

Ich habe ein Ausführungsproblem im Verzeichnis / tmp auf einem anderen Computer, auf das ich nicht zugreifen kann, wenn das Verzeichnis / tmp auf einem anderen Laufwerk als '/' bereitgestellt ist und NOEXEC vorhanden ist. Ich wollte versuchen, dieses Szenario auf meinem Computer neu zu erstellen, habe aber keine zweite Festplatte. Ich habe versucht, den folgenden Befehl auszuführen:

mount --bind /test1 /test2

Ich habe dann die bindFlagge entfernt und NOEXECin / etc / fstab hinzugefügt . Dann habe ich in / test2 eine Datei namens test.sh erstellt, in der nur "Hallo Welt" wiedergegeben wird. Ich versuche es auszuführen und es stand "Erlaubnis verweigert". Ich lief dann chmod 777 test.shund konnte die Datei ganz gut ausführen. Ich dachte, dass das NOEXEC-Flag mir nicht erlauben sollte, etwas auszuführen?

Ist das mount --bind /test1 /test2nicht dasselbe wie das Mounten von einem völlig anderen physischen Laufwerk? Wie in / test1 und / test2 befinden sich auf unterschiedlichen Laufwerken?

user972276
quelle
Ich vermute, Sie sind möglicherweise Opfer einer Besonderheit des Bind Mount. Siehe diese Antwort .
Kamil Maciorowski

Antworten:

7

Das Optionsflag 'NOEXEC' im mountBefehl erlaubt nicht die Ausführung von ausführbaren Binärdateien im gemounteten Dateisystem 1 . Wenn jedoch ein Skript (eine Textdatei, die mit der She-Bang-Zeile beginnt, dh eine Zeile, die mit beginnt #!) einigen Shells (Bash) zugewiesen wird, führt es die in dieser Zeile genannte ausführbare Datei aus (z. B. /usr/bin/perl) und übergibt die Pfad des Shell-Skripts als erstes Argument. Der eigentliche Interpreter befindet sich möglicherweise nicht auf diesem Mountpoint.
__________
1 Der mountBefehl stellt normalerweise ein Dateisystem bereit . (Loopback oder bindMounts können möglicherweise als Ausnahme von dieser Allgemeinheit angesehen werden.) In einigen Fällen (z. B. /tmp) enthält dieses Dateisystem nur ein Verzeichnis.

KJ4IPS
quelle
Obwohl sich die sh-Datei in / test2 befindet, wird sie in / bin / sh ausgeführt, nicht in / test2? Auf dem anderen Computer gibt es einen Java-Prozess, der Shell-Skripte in das Verzeichnis / tmp schreibt und diese dann ausführt. Ich denke, ich erinnere mich, dass die Shell-Skripte, die es erstellt, #!/bin/shoben stehen. Ich weiß nicht, wie das Shell-Skript ausgeführt wird, außer dass es Java und Referenzen / bin / sh durchläuft. Wenn es auf / bin / sh verweist und das bin-Verzeichnis über Ausführungsberechtigungen verfügt, warum werden die Shell-Skripte dann nicht wie in meinem Test ausgeführt?
user972276
Das hängt alles vom Aufruf der Shell / des Programms ab. Shell-Skripte sind keine ELFs und können nicht direkt ausgeführt werden. Einige Shells lassen jedoch nicht zu, dass ein Skript auf einem FS, auf dem NOEXEC gemountet ist, ausgeführt wird. Sie sterben einfach ab. Ich bin mir nicht sicher, wie sich / bin / sh in diesem Fall verhalten soll. (Zumal ich nicht weiß, welches Sie verwenden, gibt es einige Geschmacksrichtungen).
KJ4IPS
Wenn Sie die Shell verwenden, bemerkt das System das #! line und ruft den entsprechenden Interpereter (/ bin / bash /tmp/file.sh) auf. Wenn das Java-Bit jedoch nur (/tmp/file.sh) aufruft, funktioniert dies nicht.
KJ4IPS
Die Java-Instanz befindet sich nicht im Verzeichnis / tmp und müsste einen Interpreter verwenden, um Shell-Skripte auszuführen, oder? Es sei denn, Java verfügt über diese integrierte Funktionalität, was bedeutet, dass die Ausführung im Verzeichnis / tmp immer noch nicht stattfinden würde.
user972276
Meiner Meinung nach behauptet Ihre Antwort fälschlicherweise , es sei die Aufgabe der Shell, einen Schebang zu lesen. Siehe diese Antwort .
Kamil Maciorowski