Я хочу иметь возможность выполнять пользовательский скрипт, когда pam выполняет аутентификацию, но я получаю сообщение об ошибке, которое не могу пройти:
Feb 20 17:39:47 DC03R07DS25-08 sockd[2874]: pam_exec(sockd:auth): send password to child
Feb 20 17:39:47 DC03R07DS25-08 sockd[2893]: pam_exec(sockd:auth): Calling /tmp/test.sh ...
Feb 20 17:39:47 DC03R07DS25-08 sockd[2874]: pam_exec(sockd:auth): waitpid returns with -1: No child processes
Это очень простой сценарий, который просто распечатывает 0
позволять все.
#!/bin/bash
# read the users password from stdin (pam_exec.so gives the provided password
# if invoked with expose_authtok)
read password
echo $password > /tmp/a.txt
exit 0
А вот и мой конфиг pam.d:
auth required pam_exec.so debug expose_authtok /tmp/test.sh
account required pam_permit.so
мне очень нужно expose_authtok
так что я могу получить доступ к паролю в этом скрипте.
Я использую Ubuntu 14.04.
Кажется, это гонка жатва. вызывающий процесс (sockd?) устанавливает обработчик SIGCHLD, который получает test.sh вместо pam_exec. видеть https://lists.andrew.cmu.edu/pipermail/cyrus-sasl/2009-January/001627.html
Изменить: извините, позвольте мне объяснить, что вы можете найти по ссылке выше: когда я столкнулся с этой ошибкой, мне пришлось перекомпилировать pam_exec.so с некоторыми изменениями в pam_exec.c. Установите для обработчика SIGCHLD значение по умолчанию перед fork () и сбросьте его после waitpid () и после сбоя fork (pid == - 1 ветка). Что-то вроде:
устанавливать:
struct sigaction newact, oldact;
newact.sa_handler = SIG_DFL;
newact.sa_flags = 0;
sigfillset(&newact.sa_mask);
sigaction (SIGCHLD, &newact, &oldact);
сброс:
sigaction (SIGCHLD, &oldact, NULL);