Napisałem skrypt, który usuwa wszystkie oprócz dwóch ostatnich plików w folderze:
#!/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
Ten skrypt będzie wykonywany codziennie jako zadanie crona.
Rozumowanie jest następujące:
Uzyskaj listę wszystkich używanych plików
ls -1
(aby uzyskać jeden plik w wierszu);Usuń dwa ostatnie z listy za pomocą
head -n -2
;Ponieważ
ls
drukuje ścieżki względne, użyjxargs printf
rzeczy, aby dodać ścieżkę folderu i uczynić ją ścieżką bezwzględną;Wyślij je do
sudo rm -rf
za pomocąxargs
.
Każdy ma dostęp do tego folderu, więc każdy może tworzyć i usuwać dowolne pliki w tym folderze.
Problem w tym, że sudo rm -rf
jest straszny. xargs sudo rm -rf
jest niesamowicie przerażający.
Chcę mieć pewność, że nikt nie może uszkodzić innych folderów / systemów, tworząc sprytne pliki do usunięcia (przypadkowo lub celowo). Nie wiem, coś sprytnego jak:
file with / spaces.txt
co może spowodować bardzo przerażające sudo rm -rf /
.
EDYCJA: Mój błąd, nazwy plików nie mogą zawierać /
, więc ten konkretny problem nie miałby miejsca, ale pytanie o to, czy istnieją inne zagrożenia, wciąż pozostaje aktualne.
Dlatego używam --quoting-style=shell-always
, to powinno zapobiec wszelkim sztuczkom z plikami ze spacjami. Ale teraz zastanawiam się, czy ktoś może być wyjątkowo sprytny ze spacjami i cudzysłowami w nazwie pliku.
Czy mój skrypt jest bezpieczny?
Uwaga: Potrzebuję, sudo
ponieważ uzyskuję dostęp do folderu zdalnie (przy użyciu zmapowanego dysku sieciowego mount
) i nie mogłem go uruchomić bez sudo.
/
w imię być tworzone staram się osiągnąć ten tu
ls
dane wyjściowe, jest to już źle napisane polecenie, nawet przy cytowaniu. ls
myślę, że używa także ustawień regionalnych do sortowania, więc nie rozumiem, jaki jest cel head
usuwania ostatnich 2 (chyba że próbujesz się pozbyć .
i ..
które iirc nie są dozwolone jako argumenty rm
. Po prostu użyj find /path/to/folder -type f delete
. I nie, sudo
jeśli
printf -- '%s\0' /path/to/some/folder/* | head -zn -2 | xargs -0 rm
?