Verhindern Sie, dass eine Datei auch nach rm -f gelöscht wird

Verhindern Sie, dass eine Datei auch nach rm -f gelöscht wird

Normalerweise bleibe ich bei StackOverflow, aber ich denke, dass Sie hier zu diesem Thema viel mehr Experten sind.

Die heutige Übung ist also komisch, ich muss eine schreiben script.shund darin alles tun, was ich kann, um zu verhindern, test.txtdass sie gelöscht wird, aber der Haken ist, dass die letzte Zeilehatzu sein

rm -f test.txt

Ich weiß nicht wirklich viel über Shell (normalerweise mache ich C/Objective-C), also habe ich mir ein Buch besorgt, habe es noch nicht fertig gelesen, weiß aber immer noch nicht, wie das geht.

Ich habe über Berechtigungen nachgedacht, aber dem Skript werden beim Testen alle Berechtigungen erteilt, daher ist dies keine Option … (Ich weiß nicht, ob es wichtig ist, aber das Skript wird unter OS X ausgeführt).

Antwort1

Unter Linux können Sie das Flag immutable verwenden, chattrum schreibgeschützten Zugriff auf Dateisystemebene zu erreichen (erfordert jedoch entsprechende Berechtigungen). Ich verwende OS X nicht und weiß nicht, ob es dort etwas Ähnliches gibt, aber Sie können „nach Ausführung des Skripts test.txtnoch vorhanden“ erreichen, indem Sie Folgendes verwenden:

#!/bin/sh
mv test.txt test.bak
trap "mv test.bak test.txt" EXIT

rm -f test.txt

Dieses Skript benennt es test.txtin um test.bakund benennt es wieder zurück, wenn das Skript beendet wurde (nach rm -f test.txt). Dies ist nicht wirklich schreibgeschützt, aber kill -KILLes sollte zumindest Ihre Daten bewahren, es sei denn, Sie verwenden Ihr Skript.

Alternative Idee: Wenn Sie darauf bestehen, dass diese Zeile drin ist, warum beenden Sie das Programm nicht früher?

#!/bin/sh
# do your thing
exit
# my boss insisted to have the 'rm' line below.

rm -f test.txt

Alternative, die sich rmin eine Funktion verwandelt, die nichts tut:

#!/bin/sh
# do your thing
rm() {
    # this function does absolutely nothing
    : # ... but it has to contain something
}

rm -f test.txt

Ähnlich der Funktionsmethode oben, jedoch unter Verwendung des veralteten aliasBefehls als Alias rm​​für die trueintegrierte Funktion, die nichts tut (außer einen echten Exit-Code zurückgibt):

#!/bin/sh
# do your thing
alias rm=true

rm -f test.txt

Alternative, die rmaus der Umgebung entfernt (unter der Annahme, dass keine rmintegrierte Funktion vorhanden ist):

#!/bin/sh
# do your thing
PATH= # now all programs are gone, mwuahaha

# gives error: bash: rm: No such file or directory
rm -f test.txt

Ein weiteres Beispiel, das sich $PATHdurch die Verwendung eines Stub- rmProgramms (das /tmpals Suchpfad verwendet wird) ändert:

#!/bin/sh
# do your thing
>/tmp/rm # create an empty "rm" file
chmod +x /tmp/rm
PATH=/tmp

rm -f test.txt

Weitere Informationen zu integrierten Funktionen erhalten Sie, indem Sie „ help <built-in>for details“ ausführen. Beispiel:

true: true
    Return a successful result.

    Exit Status:
    Always succeeds.

Verwenden Sie für andere Befehle man rmdie Manualpage oder schauen Sie dort nach man bash.

Antwort2

Zum Entfernen einer Datei ist Schreibberechtigung für das Verzeichnis erforderlich, das sie enthält.

$ chmod -w .
$ rm -f test.txt
rm: cannot remove `test.txt': Permission denied

Sie sollten dies wahrscheinlich in einem temporären Verzeichnis tun, das zu diesem Zweck erstellt wurde. Sie möchten beispielsweise nicht die Schreibberechtigung für Ihr Home-Verzeichnis entfernen, obwohl es einfach genug ist, es wiederherzustellen mitchmod +w .

verwandte Informationen