Intereting Posts
Разверните вывод двух команд `awk` Шифрование и обфускация имен файлов Отображение эскизов или какого-либо предварительного просмотра в всплывающем меню рабочего пространства Gnome? Switch-User не работает на Lightdm Разрешить su без пароля для пользователей в определенной группе Active Directory при использовании pam_winbind Простой читатель CLI rss, который может печатать только тему и uri, основываясь на новом с временного интервала Поиск файлов, содержащих определенные строки в каталоге Ищете карту xinit / startx rabbithole Замена для аудита в OpenVZ Как выполнить поиск в архивах списков рассылки ядра Linux? Обновление PATH не остается после перезагрузки что означает «^ $ 1» в сценарии оболочки? Есть ли способ запустить скрипт сразу после деактивации учетной записи? Есть ли менеджер обновлений без зависимостей gnome для xfce? Какая лучшая книга должна читать каждый пользователь Unix или Linux?

Как диспетчер отображает пользователя?

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

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

Я думаю, что я достиг некоторого прогресса в понимании этого вопроса, поэтому я опубликую то, что знаю здесь. Этот ответ в настоящее время относится к тем системам, которые используют PAM . Я добавлю другие способы входа в систему, когда я их встречу.

После ввода имени пользователя и пароля в поля вашего диспетчера дисплеев менеджер отображает эти два поля и запускает процесс аутентификации PAM.

Сначала он вызывает pam_start() . Это сообщает PAM, какая функция разговора (мы доберемся до того, что это) вы используете, и что pam_handle_t struct для инициализации. Вы передаете эту структуру pam_handle_t во все следующие вызовы.

Затем вы можете установить любые свойства, такие как имя пользователя, используя pam_set_item() . Вам не нужно указывать имя пользователя здесь. Когда вы вызываете pam_authenticate() , он запрашивает любую информацию, которую он еще не имеет.

Затем вы вызываете pam_authenticate() чтобы узнать, являются ли имя пользователя и пароль действительными. На этом этапе pam_authenticate() получает любую информацию, которая у него не использовалась с помощью функции разговора . Вы можете посмотреть эту ссылку для деталей, но вкратце, PAM вызовет функцию разговора, которую вы предоставили в структуре, переданной в pam_start() после того как вы вызвали pam_authenticate() . Затем он передаст массив сообщений этой функции. Если msg_stylePAM_PROMPT_ECHO_ON , он запрашивает имя пользователя, а если msg_stylePAM_PROMPT_ECHO_OFF , он запрашивает пароль. Два других варианта описаны в спецификации и используются для сообщений об ошибках и информации. В зависимости от типа сообщения, залейте resp массив ответами и верните правильный код ошибки.

Теперь, если pam_authenticate() возвращает PAM_SUCCESS , это означает, что пользователь существует. Затем нам нужно вызвать pam_acct_mgmt() чтобы убедиться, что у пользователя есть разрешение на вход в это время (я не знаю, где и как это разрешение установлено).

На этом этапе мы получаем токен, используя pam_setcred() а затем открываем сеанс с помощью pam_open_session() . Я не знаю, какова цель этого или как используется токен, но это требуется. Дайте мне знать, если вы знаете больше информации.

Теперь мы можем установить все переменные bash, которые мы хотим, используя pam_putenv() . Когда в нашей среде есть все, что нам нужно, мы можем развить новый процесс, а затем exec команду startx .

Когда этот процесс завершается, пользователь выходит из системы. На этом этапе мы вызываем pam_close_session() , pam_setcred (с возможностью удаления учетных данных) и pam_end() в этом порядке.

Если это неверно или у вас есть дополнительная информация, пожалуйста, дайте мне знать. Для примера вы можете увидеть мой диспетчер дисплеев (все еще в разработке).