Czy jest jakiś sposób, aby zapobiec usunięciu niektórych plików z katalogu należącego do użytkownika?

42

Załóżmy, że użytkownik ma Directory1 i zawiera File1 File2 CantBeDeletedFile Jak to zrobić, aby użytkownik nigdy nie mógł usunąć pliku CantBeDeletedFile ?

Jeśli zmienię własność Directory1 i usunę uprawnienia do zapisu, użytkownicy nie będą mogli usunąć żadnego pliku. Nie będą też mogli dodawać nowych plików itp.

Chcę tylko móc ustawić niektóre pliki, które nigdy nie zostaną usunięte.

Bardziej szczegółowy opis.

Tworzę profile użytkowników. Tworzę pliki uruchamiające aplikacje na pulpicie . Chcę więc ustawić niektóre pliki uruchamiania (.desktop) i sprawić, aby użytkownik mógł je tylko uruchamiać i nie mogli zmienić nazwy ani usunąć, po prostu uruchom.

Obecnie, jeśli użytkownik jest właścicielem katalogu zawierającego dowolny plik. On może usunąć.

Jeśli nie ma ogólnego sposobu dla wszystkich * nix, jest to Linux i ext4 FS.

bakytn
źródło

Odpowiedzi:

40

(Nie lubię ingerować w dom użytkowników, myślę, że należy im pozwolić robić wszystko, co chcą robić ze swoimi domami… ale w każdym razie…)

To powinno działać na Linuksie (przynajmniej). Zakładam, że userjest już członkiem grupy user. Rozwiązaniem jest zmiana własności Directory1i ustawienie lepkiego bitu w katalogu:

chown root:user Directory1
chmod 1775 Directory1

Następnie użyj:

chown root Directory1/CantBeDeletedFile

Teraz usernie będzie w stanie usunąć tego pliku z powodu lepkiego bitu¹. userNadal jest w stanie dodać / usunąć swoje pliki Directory1. Zauważ jednak, że nie będą w stanie usunąć, Directory1ponieważ nigdy nie zostaną opróżnione.

-
1. Gdy bit lepki jest włączony w katalogu, użytkownicy (inni niż właściciel) mogą usuwać tylko własne pliki z katalogu. Jest to używane w katalogach, takich jak /tmpczyje uprawnienia to 1777= rwxrwxrwt.

Stéphane Gimenez
źródło
Też mi się nie podoba, ale użytkownicy są nowicjuszami w świecie Linuksa. JEŚLI przypadkowo usuną program uruchamiający, zaczynają spamować nasze wsparcie techniczne :)
bakytn
Dziękuję, działa! Nie jestem pewien, jak mam postępować. Z chattr lub w ten sposób. Jeśli zrobisz to po drodze. Nadal mogę usunąć katalog jako root. Przy górnym rozwiązaniu (chattr) nawet root nie może usunąć folderu.
bakytn
@bakytn: czy to tylko środek ostrożności, czy rzeczywiście otrzymałeś pomoc techniczną? Ponieważ większość początkujących prawdopodobnie będzie zbyt przestraszona, aby zadzierać z plikami, których nie znają.
Lie Ryan,
@Lie Ryan 100% pewności, że zadzwonią po wsparcie. Ale tak, obecnie jest to tylko środek ostrożności.
bakytn
Wcześniej czy później koła treningowe muszą spaść ... a jeśli nie nauczyli się jeździć na rowerze, wypadek będzie czymś wartym uwagi. Zgadzam się z odpowiedzią, prawdopodobnie uzupełnioną obszerną pomocą on-line i spamem w puszkach „Jeśli„ przypadkowo ”usunąłeś plik ThisDesktopFile, najpierw idź do najbliższej ściany i uderz ją mocno 3 razy (na szczęście), a następnie zrób to cp /here/is/the/master/ThisDesktopFile $HOME. : BOfH ”
vonbrand
63

Ustaw plik jako niezmienny za pomocą tego iatrybutu.

chattr +i file.desktop

zobacz man chattrpo więcej informacji.

Keith
źródło
8
Dodam tę notatkę, ponieważ nie byłem w stanie wydedukować jej ze wspomnianej strony podręcznika: chattrdziała tylko na systemach plików ext2 / ext3 / ext4.
manatwork
To jest takie fajne! Zadziałało! Dziękuję Panu! Eleganckie rozwiązanie, ale jedno ograniczenie. Nawet root nie może usunąć tych plików bez uprzedniej modyfikacji. Ale to jest naprawdę fajne. Nie byłem pewien, którą odpowiedź zaakceptować. Zaakceptowano bardziej ogólny sposób, ale mniej szybki
bakytn
@manatwork działa również na XFS, zgaduję, że niektóre inne systemy plików również obsługują te atrybuty.
Ruslan
Aby „cofnąć” to polecenie, po prostu zróbchattr -i file.desktop
GreenRaccoon23
1
Właśnie przetestowałem to na ZFS na Linuksie i działało. Chciałem zapobiec usunięciu pliku używanego do poinstruowania programu baculado tworzenia kopii zapasowych, aby zignorował folder.
drescherjm
2

Nie sądzę, że istnieje sposób, aby zapobiec usunięciu pojedynczego pliku z uprawnieniami do plików uniksowych, ale mogę wymyślić obejście: napisz demona, który zastąpi go po usunięciu. inotify-toolsjest idealny do tego typu rzeczy, jeśli korzystasz z Linuksa.

Istnieje kilka sposobów na zastąpienie usuniętego elementu: skopiuj nowy na miejscu lub zachowaj prawdziwy plik w bezpiecznym miejscu i po prostu skopiuj link do katalogu użytkownika. W przypadku linku możesz użyć dowiązania symbolicznego lub twardego. Zacznę od dowiązania symbolicznego, ale niektóre (bardzo niewiele) programów nie obsługuje poprawnie dowiązań symbolicznych. Jeśli okaże się, że użytkownik napotka taki program, użyj zamiast tego twardego łącza.

Shawn J. Goff
źródło
0

Prosty

chmod -i filename

„ochroni” ten plik przed usunięciem.

rm filename
rm: remove write-protected regular file 'filename'?

Nadal możesz go usunąć, ale przynajmniej musisz mieć pewność co do tego, co robisz.

Fiatjaf
źródło