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ż
lsdrukuje ścieżki względne, użyjxargs printfrzeczy, aby dodać ścieżkę folderu i uczynić ją ścieżką bezwzględną;Wyślij je do
sudo rm -rfza 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 -rfjest 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ę, sudoponieważ 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
lsdane wyjściowe, jest to już źle napisane polecenie, nawet przy cytowaniu. lsmyślę, że używa także ustawień regionalnych do sortowania, więc nie rozumiem, jaki jest cel headusuwania 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, sudojeśli
printf -- '%s\0' /path/to/some/folder/* | head -zn -2 | xargs -0 rm?