Почему один пользователь может удалить 755 файлов другого пользователя?

35

У меня есть скрипт резервного копирования, который загружает файлы scp на другой сервер, используя пользователя upload. Затем другой скрипт на целевом сервере передает их другому пользователю и устанавливает режим файла на 755.

Если я затем использую SSH на целевом сервере, используя uploadпользователя, я могу удалить разбитые файлы. Разве они не должны быть только для чтения?

Вот как выглядит файл на целевом сервере, и пользователь uploadможет удалить его.

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

Пользователь uploadбыл добавлен только с помощью useraddи не является частью maciekishгруппы.

При попытке удалить файл как uploadчерез ssh у меня возникает вопрос, хочу ли я удалить «обычный файл, защищенный от записи», и могу ли я сказать Yи удалить его.

Maciej Swic
источник
4
По сути дубликат Почему можно rmудалить файлы только для чтения?
G-Man говорит: «Восстановите Монику»

Ответы:

64

Файлы только для чтения; однако удаление файла не изменяет его, а только родительский каталог (он в основном удаляет файл из списка каталогов) - и похоже, что у вас есть полные права на запись в каталог.

Вы можете установить stickyбит - так называемый флаг «ограниченное удаление» - который будет препятствовать любому, кроме владельца, переименовывать или удалять файлы в этом каталоге (например, в /tmp). Для этого запустите chmod o+t *directory*от имени владельца каталога.

grawity
источник
12

В типичной файловой системе Unix любой файл может быть идентифицирован по произвольному количеству записей каталога, каждая из которых содержит «жесткую ссылку».

С точки зрения реализации существует разница между удалением последней записи каталога (жесткой ссылки) для файла и простым удалением одной ссылки из многих. Однако с семантической точки зрения нет никакой разницы.

Если существует несколько жестких ссылок на файл, запись в файл с использованием любой из них изменяет файл, который видят все они. Однако использование rmссылки просто приводит к недоступности файла по этой ссылке. Другие ссылки на файл продолжают видеть тот же файл.

Supercat
источник
3
Обычно известный как жесткие ссылки.
Боб
1
@Bob: я знаю, что термин "жесткая ссылка" используется для описания ссылок, которые созданы на уже существующий файл; в тех случаях, когда файл никогда не имел более одной ссылки на него, эта одиночная ссылка все еще называется «жесткой ссылкой»?
суперкат
3
Нет разницы между ссылками. Создайте файл A, создайте жесткую ссылку B, удалите файл A. Является ли B файлом или жесткой ссылкой? Чтобы понять, как это работает, лучше рассмотреть его как N жестких ссылок, а не как 1 файл и (N-1) жестких ссылок. Там также ссылки, которые существуют, когда файл открывается.
gnasher729
@ gnasher729: Я согласен с тем, что в тех случаях, когда существует несколько ссылок на один или несколько файлов, имеет смысл ссылаться на них как на «жесткие ссылки», если между ними нет семантической разницы. С другой стороны, я бы подумал, что как с точки зрения семантики, так и с точки зрения производительности, может быть выгодно различать запись каталога, которая всегда была единственной ссылкой на файл, и запись, на которую могли быть созданы другие жесткие ссылки. В любом случае, я не знал, будет ли правильно ссылаться, скажем, на записи каталога, «каждая из которых называется« жесткой ссылкой »».
суперкат
2
@supercat это не очень часто, но это правильно. Рассмотрим поле st_nlink(«количество жестких ссылок») в struct stat. Проще говоря, каталоги содержат жесткие ссылки на файлы.
Хоббс