Создание пользователя Unix из приложения

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

Была распространена идея связать наших пользователей с пользователями системы, создавая соответствующие записи в / etc / passwd каждый раз, когда в нашей программе создается новый пользователь. Другое взаимодействие, такое как запрос uid / gid для имени пользователя или наоборот, проверка владения файловой системой и т. Д. У нас уже есть стандартные поля, такие как user.uid, user.gid, user.home, внутренние разрешения и т. Д., И нам просто нужен способ передать их в систему.

Проблема в том, что поиск любой информации в Интернете - это иголка в сценарии стога сена - мне не удалось найти никаких стандартных библиотек для средств получения и установки учетных записей пользователей, и я начинаю задаваться вопросом, существуют ли они вообще? Правильный ли подход здесь к созданию useradd? Похоже, должен быть способ получше!

Обратите внимание, что система, на которой это работает, является одноразовой (виртуализированной) для всех намерений и целей.

Окончательное редактирование: оказывается, что наиболее экономичным решением является:

useradd -g group -c "firstname lastname" -d /export/home/username -m -s /bin/bash username

person Derek_6424246    schedule 06.03.2013    source источник
comment
Я сомневаюсь, что установление отношения 1: 1 между пользователями базы данных и пользователями системы - хорошая идея. Это жестко привязывает db-app к базовой структуре ОС, что может быть не тем, что вам действительно нужно, по крайней мере, в долгосрочной перспективе. Возможно, вам будет лучше создать третий (независимый) объект, выполняющий аутентификацию, который затем может использоваться для аутентификации пользователя db и / или пользователей ОС. Для этого лучше всего подходит LDAP.   -  person alk    schedule 06.03.2013
comment
@OliCharlesworth Linux! = Солярис   -  person kay    schedule 06.03.2013
comment
@Kay: Справедливо! Читаю слишком быстро.   -  person Oliver Charlesworth    schedule 06.03.2013
comment
Это больше подходит для alt.se.prog   -  person Cole Johnson    schedule 06.03.2013
comment
@ColeJohnson, если он выходит за рамки SO, то unix.stackexchange.com будет подходящим местом для этого вопроса.   -  person kay    schedule 06.03.2013
comment
@Kay, но OP хочет сделать это из программы, которую он кодирует, а не из командной строки.   -  person Cole Johnson    schedule 06.03.2013


Ответы (2)


useradd то, что вы ищете?

useradd -g group -c "firstname lastname" -d /export/home/username -s /bin/ksh username
mkdir -p /export/home/username
chown username /export/home/username
person kay    schedule 06.03.2013
comment
Использование существующих функций ОС через внешние вызовы - последнее средство. Гораздо лучше сделать это в коде. - person Derek_6424246; 06.03.2013
comment
Не используйте собственную реализацию в производственном коде. Вы испортите свою систему, это точно. - person kay; 06.03.2013
comment
@ Derek_6424246: Вызов других программ - это способ работы Unix. Поступать таким образом настоятельно рекомендуется, и вы должны делать это именно так. На самом деле, выполнение этого в коде - худшее решение. - person datenwolf; 06.03.2013
comment
@datenwolf IIUC, он хочет знать, есть ли library, который может. Он не сам себе катится. Так что, если несуществующая библиотека написана разработчиками исполняемых файлов (разработчиками Debian), беспокоиться не о чем. - person Cole Johnson; 06.03.2013
comment
@ColeJohnson: Технически инструменты системного уровня являются библиотеками, вы просто используете их по-другому. Но есть еще одна причина для этого с помощью отдельной программы: SUID, который может понадобиться в определенной конфигурации системы. Вы не хотите, чтобы программы конечного пользователя были SUID. - person datenwolf; 06.03.2013
comment
@ColeJohnson Точно - мой вопрос можно перефразировать. Существуют ли программные хуки для создания учетной записи? (а если нет, то почему? Кажется, они должны существовать!) - person Derek_6424246; 06.03.2013
comment
@datenwolf SUID? setuserid? Я запутался. - person Cole Johnson; 06.03.2013
comment
@ColeJohnson: двоичные файлы SUID, то есть программы, которые выполняются с разрешениями пользователя: группа, владеющая исполняемым файлом программы. Многие инструменты, связанные с управлением учетными записями пользователей, используются или используются в качестве SUID. / usr / sbin / passwd - один из них: это корень SUID, и в противном случае он не смог бы обновить базу паролей системы новым паролем. - person datenwolf; 06.03.2013
comment
@ColeJohnson: Код, выполняемый с помощью SUID, критичен с точки зрения безопасности, и поэтому он должен быть написан тщательно и в первую очередь с учетом безопасности. Если бы существовала библиотека для управления пользователями, программа, связывающая этот двоичный файл, также должна была бы иметь SUID, что подразумевает очень строгие требования безопасности для программы-потребителя. Из-за этого подобная библиотека не может быть найдена ни в одной хорошо поддерживаемой (-подобной) системе Unix, так как такая библиотека была бы очень опасной по второй степени. - person datenwolf; 06.03.2013
comment
Что ж, оказалось, что для этого не существует никаких переключателей, как я надеялся. Мне придется использовать свое первоначальное решение (однострочная версия ответа выше): useradd -g group -c "firstname lastname" -d /export/home/username -m -s /bin/bash username - person Derek_6424246; 07.03.2013

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

Добавлено: вы также можете использовать ldap.

Но любой из этих двух будет означать, что вам нужно только поддерживать БД в актуальном состоянии. Passwd позаботится о себе

person fredrik    schedule 06.03.2013
comment
Учитывая мой первоначальный вопрос, это, вероятно, лучший ответ. Однако, учитывая затраты на реализацию этого в качестве решения (и относительно низкий приоритет проблемы), мне пришлось использовать внешние вызовы ОС. - person Derek_6424246; 07.03.2013
comment
Понятно. И я не буду удерживать это против тебя. Ты просто хороший программист, ленивый по натуре. : D - person fredrik; 07.03.2013