Назад | Перейти на главную страницу

Проблемы с OSX chown после создания пользователей с помощью dscl

Хорошо, я создал пользователя и группу с помощью dscl следующим образом:

dscl . -create /Users/deadline
dscl . -create /Groups/deadline
dscl . -append /Groups/deadline GroupMembership deadline

Теперь я пытаюсь переварить такие вещи:

mkdir /tmp/stuff
chown deadline:deadline /tmp/stuff

Но проблема в том, что вместо этого «крайнего срока» пользователя он устанавливает никого и группу. Какое свойство magic voodoo мне нужно добавить пользователю и группе, чтобы они правильно установили разрешения unix?

Кроме того, почему Apple должна ненавидеть меня и мой опыт работы с Unix :(

Вы создали запись пользователя, но не задали для нее никаких настроек, поэтому она использует значения по умолчанию.

sudo dscl . -append /Groups/deadline PrimaryGroupID 100
sudo dscl . -append /Users/deadline UniqueID 1000 PrimaryGroupID 100

Возможно, вы захотите посмотреть на результат, например:

dscl . -read /Users/$USER
dscl . -read /Groups/admin

чтобы увидеть, какие атрибуты можно установить.

Фактически, вы столкнетесь с более или менее той же проблемой в любой системе unix: вы не назначили идентификаторы пользователей и групп новому пользователю и группе, поэтому нет возможности идентифицировать их файлы. Решение: присвоить ID. Видеть этот предыдущий вопрос, особенно ответы Палмера и мои; если вы сложите их вместе, это будет довольно полный процесс создания нового пользователя (хотя стандартно, чтобы новые пользователи в OS X имели PrimaryGroupID 20 [персонал] вместо 80 [admin]).

Группы довольно похожи, но их PrimaryGroupID должен создаваться уникальным образом (и им не нужны UserShell, UniqueID, NFSHomeDirectory или пароль.

Добавление пользователей в группы также немного сложнее, чем вы привыкли. Чтобы сделать это правильно, вы должны как добавить RecordName пользователя в список GroupMembership группы, так и добавить GeneratedUID пользователя в список GroupMembers группы. Делать это с помощью dscl сложно, но вы можете легко это сделать с помощью:

dseditgroup -o edit -a username -t user groupname

(Примечание: dseditgroup также может создавать группы, но я не думаю, что это особенно проще, чем dscl.)