[114806]Думаю, я добился некоторого прогресса в понимании этого вопроса, так что я напишу то, что знаю здесь. Этот ответ в настоящее время для тех систем, которые используют [115307]PAM[115308]. Я добавлю больше о других методах входа в систему по мере того, как я с ними сталкиваюсь.[12211]После того, как вы вводите имя пользователя и пароль в поля диспетчера дисплея, диспетчер дисплея принимает эти два поля и запускает процесс аутентификации PAM.[12212]Сначала он вызывает [115309]pam_start()[115310]. Он сообщает PAM, какую функцию взаимодействия (мы доберёмся до того, что это такое) вы используете и какую структуру [115311]pam_handle_t[115312] инициализировать. Вы передаёте эту [115313]pam_handle_t[115314] структуру во все следующие вызовы.[12213]Затем с помощью [115315]pam_set_item()[115316] вы можете установить любые свойства, подобные имени пользователя. Здесь не нужно устанавливать имя пользователя. Когда вы вызываете [115317]pam_authenticate()[115318], он запросит любую информацию, которой у него еще нет.[12214]Далее вы вызываете [115319]pam_authenticate()[115320], чтобы проверить, действительны ли имя пользователя и пароль. В этот момент [115321]pam_authenticate()[115322] получает любую информацию, которой она не обладала, используя функцию [115323] разговора [115324]. Подробности можно посмотреть по этой ссылке, но короче говоря, PAM вызовет функцию conversation, которую вы указали в структуре, переданной в [115325]pam_start()[115326], после вызова [115327]pam_authenticate()[115328]. Затем она передаст массив сообщений в эту функцию взаимодействия. Если [115329]msg_style[115330] - это [115331]PAM_PROMPT_ECHO_ON[115332], то запрашивается имя пользователя, а если [115333]msg_style[115334] - это [115335]PAM_PROMPT_ECHO_OFF[115336], то запрашивается пароль. Остальные две опции описаны в спецификации и используются для сообщений об ошибках и информационных сообщений. В зависимости от типа сообщения заполните массив [115337]или [115338] ответами и верните правильный код ошибки.[12215] Теперь, если [115339]pam_authenticate()[115340] возвращает [115341]PAM_SUCCESS[115342], это означает, что пользователь существует. Затем мы должны вызвать [115343]pam_acct_mgmt()[115344], чтобы убедиться, что пользователь имеет разрешение на вход в систему в это время (я не знаю, где и как это разрешение установлено).[12216] В этот момент мы получаем токен, используя [115345]pam_setcred()[115346], а затем открываем сессию с помощью [115347]pam_open_session()[115348]. Я не знаю, для чего это нужно и как на самом деле используется токен, но это необходимо. Дайте мне знать, если узнаете больше.[12217]Теперь мы можем установить все нужные нам bash-переменные с помощью [115349]pam_putenv()[115350]. Когда в нашем окружении будет всё, что нам нужно, мы сможем вскрыть новый процесс, а затем [115351]выполнить [115352] команду [115353]startx[115354].[12218]Когда этот процесс завершится, пользователь выйдет из системы. В этот момент мы вызываем [115355]pam_close_session()[115356], [115357]pam_setcred[115358] (с возможностью удаления учетных данных) и [115359]pam_end()[115360] в этом порядке.[12219]Если что-то из этого неправильно или у вас есть дополнительная информация для добавления, пожалуйста, сообщите мне об этом. Для примера можно посмотреть [115361]мой менеджер дисплеев[115362] (все еще находится в разработке). [114825]
27.01.2020, 21:23
Ссылка