Wie kann das Löschen (aber nicht das Erstellen) von Elementen in einem Ordner verhindert werden?

Wie kann das Löschen (aber nicht das Erstellen) von Elementen in einem Ordner verhindert werden?

In meinem Home-Verzeichnis wird ein Ordner in einem anderen Ordner erstellt, und ich möchte den Inhalt dieses Ordners analysieren können. Allerdings habe ich ein Problem: Wenn der Ordner erstellt wird, wird er sofort von demselben Programm gelöscht, das ihn erstellt hat. Gibt es eine Möglichkeit, dass ich zulassen kann, dass der Ordner erstellt wird, ihn dann aber nicht löscht? Ich verwende Ubuntu GNOME 15.10 mit GNOME 3.18.

Antwort1

Es gibt keine Berechtigungseinstellungen, die dies ermöglichen, auch nicht mit ACLs, aber Sie können mit dem Programm konkurrieren, indem Sie Folgendes verwenden inotifywait:

In einem Terminal habe ich Folgendes ausgeführt:

while sleep 0.5; do if mkdir foo/bar; then echo foo; rmdir foo/bar; fi; done

Wie Sie sehen, wird dadurch ein Verzeichnis erstellt, eine Meldung ausgegeben und das Verzeichnis entfernt – und das alles geschieht für menschliche Verhältnisse sehr schnell.

Und in einer anderen:

while true
do
    if inotifywait -e create foo
    then
        chmod -w foo
        if [[ -d foo/bar ]]
        then
            break 
        else
            chmod +w foo
        fi
    fi
done

Dieser Befehl wartet auf die Erstellung von irgendetwas in foo, entfernt dann die Schreibberechtigung von foound prüft, ob es rechtzeitig war, das Unterverzeichnis zu erfassen. Wenn nicht, fügt er die Schreibberechtigung wieder hinzu und beginnt erneut.

Nach kurzem Warten:

foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
rmdir: failed to remove ‘foo/bar’: Permission denied
mkdir: cannot create directory ‘foo/bar’: File exists
mkdir: cannot create directory ‘foo/bar’: File exists
mkdir: cannot create directory ‘foo/bar’: File exists
mkdir: cannot create directory ‘foo/bar’: File exists

Dies beruht auf einerRennbedingung, es ist also Glückssache, ob Sie es fangen können.


foo/barist das Verzeichnis, das das Programm erstellt. Wenn Sie den Namen nicht kennen, können Sie es auf andere Weise versuchen:

  • Stellen Sie sicher, dass sich nichts anderes im Verzeichnis befindet, sodass beim Erstellen eines Unterverzeichnisses dieses foo/nicht leer ist. Einige Tests für nicht leere Verzeichnisse finden Sie indieser U&L-Beitrag:

    shopt -s nullglob
    if [ -n "$(ls -A foo/)" ]
    then
        break
    

    Das hat schnell genug geklappt.

  • Lesen Sie den Namen des erstellten Verzeichnisses aus inotifywaitder Ausgabe von :

    if dir=$(inotifywait -e create --format '%f' foo)
    then
        chmod -w foo
        if [[ -d foo/$dir ]]
    

    Das hat bei mir (noch) nicht funktioniert; der Aufwand für die Erstellung der Subshell scheint es gerade langsam genug zu machen, damit die andere Schleife jedes Mal gewinnt. Vielleicht inotifykönnte das funktionieren, wenn es in C unter Verwendung der API codiert wird.

verwandte Informationen