Ich arbeite an einer LAMP-Web-App und es gibt irgendwo einen geplanten Prozess, bei dem ständig ein Ordner erstellt wird, der shop
im Stammverzeichnis der Site aufgerufen wird . Jedes Mal, wenn dies auftritt, kommt es zu Konflikten mit den Umschreiberegeln in der App, was nicht gut ist.
Gibt es eine Möglichkeit, die Erstellung eines Ordners shop
im Stammverzeichnis zu verhindern, bis ich das fehlerhafte Skript gefunden habe ? Ich weiß, dass ich die Berechtigungen für einen Ordner ändern kann, um zu verhindern, dass der Inhalt geändert wird, aber ich habe keine Möglichkeit gefunden, die Erstellung eines Ordners mit einem bestimmten Namen zu verhindern.
linux
directory
directory-structure
Andrew
quelle
quelle
Antworten:
Dies ist nicht möglich, da der Benutzer, der das Verzeichnis erstellt, über ausreichende Schreibrechte für das übergeordnete Verzeichnis verfügt.
Sie können stattdessen die
inotify
Familie der vom Linux-Kernel bereitgestellten Systemaufrufe nutzen, um nach der Erstellung (und optionalenmv
Angabe) eines Verzeichnissesshop
in dem angegebenen Verzeichnis zumv
suchen , sofern das Verzeichnis erstellt wurde (oder optional -ed ist)rm
.Das Userspace-Programm, das Sie in diesem Fall benötigen, ist
inotifywait
(im Lieferumfang enthalteninotify-tools
, installieren Sie es bei Bedarf zuerst).Angenommen, das Verzeichnis
shop
befindet sich im/foo/bar
Verzeichnis, legen wir eine Überwachung für die/foo/bar/shop
Erstellung fest, und zwarrm
sofort, wenn sie erstellt wird:inotifywait -qme create /foo/bar
Überwachungsverzeichnis/foo/bar
für jede Datei / jedes Verzeichnis, das erstellt werden könnte, dh Überwachung für jedescreate
EreignisWenn erstellt,
awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }'
überprüft , ob die Datei ein Verzeichnis sein geschieht und der Name istshop
(/,ISDIR shop$/
), wenn sorm
das Verzeichnis (system("rm -r -- /foo/bar/shop")
)Sie müssen den Befehl als Benutzer ausführen, der über die Schreibberechtigung
/foo/bar
fürshop
das Verzeichnis verfügt, um ihn aus dem Verzeichnis zu entfernen .Wenn Sie auch
mv
-ing-Vorgänge überwachen möchten , fügen Sie auch watch formoved_to
event hinzu:Beachten Sie, wenn Sie nach einer Datei suchen, nicht nach einem Verzeichnis mit dem Namen
shop
:quelle
inotifywait
dies verwenden, ist es außerdem möglich, dass der Auslöser den Prozess auch mitps -ef
Um buchstäblich auf die Frage zu antworten, ob ein Ordner mit einem bestimmten Namen nicht erstellt werden soll.
touch shop
Sie können kein Verzeichnis erstellen, wenn eine Datei mit demselben Namen vorhanden ist
mkdir: cannot create directory ‘shop’: File exists
quelle
chattr +i shop
auf Linux-Systemen, um es unveränderlich zu machen. Bis das unveränderliche Flag entfernt wird, kann es nicht einmal umbenannt / gelöscht werden.rename(2)
, dass es immer noch funktioniert, da name kein Teil von inode ist, aber es ist nicht so. Schnelle Internetsuche verrät nicht warum. Irgendwelche Hinweise?rename
.Was ist mit der Entführung von
mkdir
syscall mitLD_PRELOAD
...?Beachten Sie, dass Sie in diesem Handler die PID des Prozesses protokollieren können, der stattdessen dieses Verzeichnis erstellen möchte:
Sie müssen dies in
~/.bashrc
root platzieren (oder wer auch immer Ihre App ausführt), um sicherzustellen, dass dies verwendet wird:quelle
LD_PRELOAD
Hacks wie diese sind im Grunde immer falsch, und wenn Sie wissen , was Sie tun, können sie schlecht das Programm , das Sie sie in laden , indem Sie Eigenschaften wie der Asynchron-Signal-Sicherheit der Funktion brechen Sie ersetzen brechen.fopen
sollte"a"
statt"w"
, so dass es frühere Protokolle bewahren kann(Hätte die Antwort von Miati kommentiert, kann mich aber nicht an meinen alten Account erinnern und habe in diesem neuen nicht genug Ansehen ...)
Sie können die Erstellung blockieren, indem Sie eine Datei erstellen und anschließend die Dateiattribute ändern.
Jeder Versuch, irgendetwas mit dieser Datei zu tun, wird blockiert - auch wenn der Benutzer root wird.
quelle
Erstellen Sie einen Symlink, der auf einen nicht vorhandenen Speicherort in einem nicht vorhandenen Verzeichnis verweist. Dies hat einige spaßige Auswirkungen:
EEXIST
(Datei existiert).ENOENT
(Keine solche Datei oder kein solches Verzeichnis) fehl.ENOENT
. lstat wird selbstverständlich die Informationen über den Symlink zurücksenden.Dies hat zwei Vorteile gegenüber einigen anderen hier vorgeschlagenen Lösungen: (a) Sie müssen keinen Dienst ausführen, der die Erstellung des Verzeichnisses verfolgt, und (b) der Name scheint für die meisten Befehle nicht zu existieren.
Sie werden es versuchen müssen, aber ich vermute, dass die Umschreiberegeln, die Sie haben, weder lstat noch andere nicht dereferenzierende Befehle verwenden, was dazu führt, dass sie fehlschlagen.
quelle