Ich habe ein Skript geschrieben, das alle außer den letzten beiden Dateien in einem Ordner löscht:
#!/bin/bash
ls -1 --quoting-style=shell-always /path/to/some/folder \
| head -n -2 \
| xargs printf -- "'/path/to/some/folder/%s'\n" \
| xargs sudo rm -rf
Dieses Skript wird jeden Tag als Cron-Job ausgeführt.
Die Argumentation ist wie folgt:
Erhalten Sie eine Liste aller Dateien mit
ls -1
(so dass ich eine Datei pro Zeile bekomme);Entfernen Sie die letzten beiden aus der Liste mit
head -n -2
;Da
ls
relative Pfade gedruckt werden,xargs printf
stellen Sie dem Ordnerpfad das Element voran und machen Sie ihn zu einem absoluten Pfad.Senden Sie sie an
sudo rm -rf
usingxargs
.
Jeder hat Zugriff auf diesen Ordner, sodass jeder alle Dateien in diesem Ordner erstellen und löschen kann.
Das Problem ist: sudo rm -rf
ist beängstigend. xargs sudo rm -rf
ist unglaublich beängstigend.
Ich möchte sichergehen, dass niemand andere Ordner / Systeme beschädigen kann, indem er clevere Dateien erstellt, die (versehentlich oder absichtlich) gelöscht werden sollen. Ich weiß nicht, etwas Kluges wie:
file with / spaces.txt
was zu einer super beängstigend führen könnte sudo rm -rf /
.
EDIT: Mein Fehler, Dateinamen können nicht enthalten /
, so dass dieses spezielle Problem nicht auftreten würde, aber die Frage, ob es andere Risiken gibt oder nicht, bleibt bestehen.
Aus diesem Grund verwende ich --quoting-style=shell-always
, dies sollte Tricks mit Dateien mit Leerzeichen verhindern. Aber jetzt frage ich mich, ob jemand mit Leerzeichen und Anführungszeichen im Dateinamen vielleicht besonders klug sein könnte .
Ist mein Skript sicher?
Hinweis: Ich brauche, sudo
weil ich auf den Ordner remote zugreife (von einem zugeordneten Netzwerklaufwerk mit mount
) und ich ihn ohne sudo nicht zum Laufen bringen könnte.
/
im Namen erstellt werden
ls
Ausgabe analysieren, ist dies selbst beim Zitieren bereits ein schlecht geschriebener Befehl. ls
Ich denke, es wird auch das Gebietsschema zum Sortieren der Reihenfolge verwendet, sodass ich nicht sehe, wozu die head
letzten 2 entfernt werden sollen (es sei denn, Sie versuchen, sie zu entfernen, .
und ..
welche iirc sind rm
sowieso nicht als Argumente zulässig . Verwenden Sie sie einfach find /path/to/folder -type f delete
. Und Nein, sudo
wenn Sie von Cron laufen - Cron ist bereits auf Root-Ebene
printf -- '%s\0' /path/to/some/folder/* | head -zn -2 | xargs -0 rm
?