Dlaczego jeden użytkownik może usunąć pliki 755 innego użytkownika?

35

Mam skrypt do przesyłania kopii zapasowej, który scp pliki na inny serwer przy użyciu użytkownika upload. Kolejny skrypt na serwerze docelowym wyświetla go innemu użytkownikowi i ustawia tryb pliku na 755.

Jeśli następnie uploadpołączę SSH z serwerem docelowym za pomocą użytkownika, będę mógł usunąć wybrane pliki. Czy nie powinny być tylko do odczytu?

Oto jak wygląda plik na serwerze docelowym, a użytkownik uploadmoże go usunąć.

-rwxr-xr-x 1 maciekish maciekish 650M Nov  1 01:07 2014-11-01-data.tar.bz2

Użytkownik uploadzostał właśnie dodany przy użyciu useraddi nie należy do maciekishgrupy.

Kiedy próbuję usunąć plik jak uploadza pośrednictwem ssh, pojawia się pytanie, czy chcę usunąć „zapisz chroniony zwykły plik” i jestem w stanie to powiedzieć Yi usunąć.

Maciej Swic
źródło
4
Zasadniczo duplikat Dlaczego można rmusuwać pliki tylko do odczytu?
G-Man mówi „Przywróć Monikę”

Odpowiedzi:

64

Pliki tylko do odczytu; jednak usunięcie pliku nie modyfikuje go, a jedynie katalog macierzysty (w zasadzie usuwa plik z listy katalogów) - i wygląda na to, że masz pełne uprawnienia do zapisu do katalogu.

Możesz ustawić stickybit - aka flagę „ograniczonego usuwania” - która uniemożliwi każdemu oprócz właściciela zmiany nazwy lub usuwanie plików w tym katalogu (np /tmp. In ). Aby to zrobić, uruchom chmod o+t *directory*jako właściciel katalogu.

grawitacja
źródło
12

W typowym systemie plików Unix każdy plik można zidentyfikować na podstawie dowolnej liczby pozycji katalogu, z których każda zawiera „twardy link”.

Z punktu widzenia implementacji istnieje różnica między usunięciem ostatniego wpisu katalogu (twardego łącza) dla pliku a po prostu usunięciem jednego z wielu odniesień. Jednak z semantycznego punktu widzenia nie ma różnicy.

Jeśli istnieje wiele twardych dowiązań do pliku, zapis do pliku przy użyciu dowolnego z nich zmienia plik widoczny dla wszystkich. rmJednak użycie linku powoduje, że plik nie jest dostępny za pośrednictwem tego linku. Inne łącza do pliku nadal wyświetlają dokładnie ten sam plik.

supercat
źródło
3
Powszechnie znany jako twarde linki.
Bob
1
@Bob: Wiem, że termin „twardy link” jest używany do opisania odniesień, które są tworzone do już istniejącego pliku; czy w przypadku, gdy plik nigdy nie miał więcej niż jednego odwołania do niego, to pojedyncze odwołanie nadal nazywane jest „twardym łączem”?
supercat
3
Nie ma różnicy między linkami. Utwórz plik A, utwórz twardy link B, usuń plik A. Czy B jest teraz plikiem czy twardym linkiem? Aby zrozumieć, jak to działa, lepiej widzieć go jako N twardych linków, a nie jako 1 plik i (N-1) twardych linków. Istnieją również łącza, które istnieją po otwarciu pliku.
gnasher729
@ gnasher729: Zgadzam się, że w przypadkach, gdy istnieje wiele linków lub plików do pliku, sensowne jest nazywanie ich wszystkich „twardymi linkami”, jeśli nie ma między nimi znaczącej różnicy semantycznej. Z drugiej strony wydaje mi się, że zarówno z punktu widzenia semantycznego, jak i wydajnościowego, korzystne może być rozróżnienie pozycji katalogu, która zawsze była jedynym odniesieniem do pliku, w porównaniu z pozycją, do której mogły zostać utworzone inne dowiązania twarde. W każdym razie nie wiedziałem, czy byłoby właściwe odnieść się do powiedzmy o pozycjach katalogu, „z których każdy nazywa się„ twardym łączem ””.
supercat
2
@supercat nie jest niezwykle powszechny, ale jest poprawny. Rozważ pole st_nlink(„liczba twardych linków”) w struct stat. Krótko mówiąc, katalogi zawierają twarde linki do plików.
hobbs