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

Попытка выполнить скрипт с аутентификацией pam

Я хочу иметь возможность выполнять пользовательский скрипт, когда 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);