1

У моего OSX Mountain Lion есть два пользователя (скажем, me и otheruser).

Когда вы вошли как me , я могу посмотреть /Users/otheruser/Public и перетащить файлы в /Users/otheruser/Public/Drop Box , где я их не вижу. Это работает так же с finder и shell (ls "/Users/otheruser/Public/Drop Box" печатает ls: .: Permission denied доступе ).

Однако, если файл с именем, идентичным тому, который вы пытаетесь добавить в /Users/otheruser/Public/Drop Box , уже существует, все изменится:

С Finder: ,

С оболочкой:

$ cp a.txt "/Users/otheruser/Public/Drop Box"

$

Копирование выполнено успешно, и файл в /Users/otheruser/Public/Drop Box переопределен.

Файл также перезаписывается, если копия выполняется через API файловой системы в программе.

Что вызывает разницу в поведении? Является ли разница намеренной (то есть, хочет ли Apple этого)? Если это не преднамеренно, какое поведение является правильным?

1 ответ1

2

Я бы посчитал поведение Finder ошибкой, но разница отчасти преднамеренная (и из-за разницы в философии). Когда вы используете cp для копирования одного файла поверх другого, он просто заменяет файл, не спрашивая (или даже не замечая, что это произошло). Обычно Finder спросит, уверены ли вы, что хотите заменить его; в этом случае, похоже, что права доступа к папке не позволяют ей сделать это успешно, поэтому вы получите сообщение об ошибке.

Я, вероятно, должен немного объяснить разрешения для папки Drop Box, чтобы уточнить, что разрешения на самом деле разрешают и запрещают. Существует три основных права доступа к папке: чтение, запись и "выполнение" (иногда называемое "поиск"). Чтение дает вам возможность прочитать названия элементов в папке, но на самом деле не дает никакой возможности прикоснуться к ним каким-либо образом. Запись дает возможность добавлять, удалять и переименовывать элементы в папке. "Выполнить" дает возможность "коснуться" содержимого папки, если вы знаете имена файлов.

Когда вы используете Finder для предоставления кому-то "только для чтения" доступа к папке, он фактически предоставляет чтение и выполнение; это означает, что они могут видеть имена файлов и папок в нем и взаимодействовать с ними (с учетом разрешений для самих элементов). Если вы фактически предоставили доступ на чтение без выполнения, они могли бы видеть имена файлов, но не что-либо еще о файлах (то есть ls в такой папке работало бы, но ls -l получит ошибки прав доступа, когда попытается получить свойства файлов).

Если вы предоставляете кому-либо доступ к папке (и ничему другому), это означает, что он может работать с файлами в этой папке, если они знают (или предполагают) имена файлов. ls /path/to/exec-folder , но ls -l /path/to/exec-folder/filename будет работать, если файл с таким именем существует.

В папке Drop Box есть запись и выполнение (но без прав чтения) для всех, кроме владельца. Это означает, что в /Users /otheruser /Public /Drop Box вы можете добавлять файлы, перечислять их свойства (если вы знаете их имена) и даже перемещать, переименовывать или удалять их (опять же, если вы знаете их имена). Искатель не может воспользоваться этим, потому что он действительно хочет иметь возможность просматривать содержимое папки; поскольку он не может этого сделать, он перестает взаимодействовать с Drop Box. Многие инструменты командной строки гораздо более точны в том, что они делают, и, следовательно, даже не замечают, что они работают в нечитаемой папке:

$ echo "This is the file's contents." >somefile.txt
$ cp somefile.txt /Users/otheruser/Public/Drop\ Box
$ ls /Users/otheruser/Public/Drop\ Box    # Unable to look around
ls: Drop Box: Permission denied
$ ls -l /Users/otheruser/Public/Drop\ Box/somefile.txt    # But if you know the filename...
-rw-r--r--+ 1 gordon  staff     29 Mar 26 21:35 /Users/otheruser/Public/Drop Box/somefile.txt
$ more /Users/otheruser/Public/Drop\ Box/somefile.txt
This is the file's contents.
$ mv /Users/otheruser/Public/Drop\ Box/somefile.txt /Users/otheruser/Public/Drop\ Box/newname.txt
$ rm /Users/otheruser/Public/Drop\ Box/newname.txt
$

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .