Разрешения для папки Linux - PullRequest
3 голосов
/ 13 марта 2009

В моем офисе у нас есть структура сетевой директории, подобная этой:

/jobs/2004/3999-job_name/...
/jobs/2004/4000-job_name/...

Проблема заключается в том, что сотрудники переименовывают папки «4000-job_name» (что, в свою очередь, нарушает другие аспекты, основанные на соответствии имени с базой данных).

Как я могу запретить пользователям переименовывать родительскую папку, в то же время предоставляя им полный контроль над содержимым этой папки?

Помните, что это общий ресурс Samba, к которому будут обращаться пользователи Windows.

Ответы [ 3 ]

6 голосов
/ 13 марта 2009

Я думаю, вы хотите сделать это:

chmod a=rx /jobs     #chdir and lsdir allowed, modifying not
chmod a=rwx /jobs/*  #allow everything to everyone in the subdirectories

Поскольку каталоги /jobs/* фактически являются файлами в /jobs, их имена нельзя изменить без разрешения на запись для /jobs. В подкаталогах /jobs/ каждый может делать что-либо с указанными выше командами.

Кроме того, не забудьте установить разрешения новых каталогов для rwx при их добавлении.

(редактировать Биллом К, чтобы исправить примеры - решение было правильным, но он неправильно прочитал вопрос из-за странной окраски, добавленной SO)

3 голосов
/ 14 марта 2009

На вопрос уже дан ответ, поэтому я просто сделаю краткое замечание: в своем вопросе вы используете термины «папка» и «каталог» взаимозаменяемо. Эти два очень разные, и, по моему опыту, 99% всех проблем с разрешениями Unix связаны с их смешением. Помните: в Unix есть каталоги, а не папки.


РЕДАКТИРОВАТЬ: папка представляет собой два склеенных вместе кусочка картона, которые содержат файлов. Итак, папка - это контейнер, фактически она содержит файлы, которые она содержит. Таким образом, очевидно, что файл может находиться только в одном контейнере за раз. Чтобы переименовать файл, вам нужен не только доступ к папке, но и доступ к файлу. То же самое, чтобы удалить файл.

Каталог, OTOH, сам файл. [Фактически именно так были реализованы каталоги в старых файловых системах Unix: просто обычные файлы со специальным флагом, вы даже можете открыть их в редакторе и изменить их.] Он содержит список сопоставления от имени к месту (например, телефонный справочник или большой склад). [В Unix эти сопоставления называются links или hardlinks .] Поскольку каталог содержит только имена файлов, а не сами файлы, один и тот же файл может присутствовать в нескольких каталогах под разными именами. Чтобы изменить имя файла (или, точнее, изменить a имя файла, поскольку он может иметь более одного файла), вам нужен только доступ на запись в каталог, а не в файл. То же самое, чтобы удалить файл. Ну, на самом деле, вы не можете удалить файл, вы можете удалить только запись в каталоге - в других каталогах могут быть другие записи, указывающие на этот файл. [Вот почему функция syscall / library для удаления файла называется unlink, а не delete: потому что вы просто удаляете ссылку, а не сам файл; файл автоматически «собирается», если на него больше нет ссылок, указывающих на него.]

Вот почему я считаю, что метафора папок для каталогов Unix неверна и даже опасна. Секретный вопрос номер один в одном из списков рассылки Unix, на котором я нахожусь: «Почему А может удалять файлы Б, даже если у него нет доступа к ним для записи?» и ответ таков: ему нужен только доступ для записи в каталог. Таким образом, из-за метафоры папок люди думают, что их файлы безопасны, даже если это не так. С помощью метафоры каталога было бы намного проще объяснить, что происходит: если я хочу удалить вас из моей телефонной книги, мне не нужно выслеживать вас и убивать, мне просто нужен карандаш!

2 голосов
/ 14 марта 2009

Если вы сделаете родительский каталог - / jobs / 2004 / - недоступным для записи для пользователей, они не смогут переименовать эту папку.

Я провел следующий эксперимент на своей машине, чтобы проиллюстрировать это:

ndogg@seriallain:/tmp$ sudo mkdir jobs
ndogg@seriallain:/tmp$ sudo mkdir jobs/2004
ndogg@seriallain:/tmp$ sudo mkdir jobs/2004/3999-job_name/
ndogg@seriallain:/tmp$ cd jobs/2004/
ndogg@seriallain:/tmp/jobs/2004$ sudo chown ndogg.ndogg 3999-job_name/
ndogg@seriallain:/tmp/jobs/2004$ ls -alh
total 12K
drwxr-xr-x 3 root  root  4.0K 2009-03-13 18:23 .
drwxr-xr-x 3 root  root  4.0K 2009-03-13 18:23 ..
drwxr-xr-x 2 ndogg ndogg 4.0K 2009-03-13 18:23 3999-job_name
ndogg@seriallain:/tmp/jobs/2004$ touch 3999-job_name/foo
ndogg@seriallain:/tmp/jobs/2004$ mv 3999-job_name/ blah
mv: cannot move `3999-job_name/' to `blah': Permission denied
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...