尝试使用 pam 身份验证执行脚本

尝试使用 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。

答案1

这似乎是一场收割竞赛。调用进程(sockd?)设置 SIGCHLD 处理程序,它收割 test.sh 而不是 pam_exec。见https://lists.andrew.cmu.edu/pipermail/cyrus-sasl/2009-January/001627.html

编辑:抱歉,让我解释一下您可以在上面的链接中找到什么:当我遇到这个错误时,我不得不重新编译 pam_exec.so,并对 pam_exec.c 进行一些修改。在 fork() 之前将 SIGCHLD 处理程序设置为默认值,并在 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);

相关内容