如何使用 pam_exec 和 PAM_TYPE 创建条件行为?

How to create conditional behaviour with pam_exec and PAM_TYPE?

我想实现 PAM_TYPE open_session 和 close_session 的条件。有了这个,我可以在不同的时间触发不同的操作来登录和注销。

我有一个测试变量 PAM_TYPE 并给出适当退出代码的脚本:成功时退出 0,否则退出 1。

但是我在组装时遇到了奇怪的问题; pam_exec 没有从脚本中获得正确的退出代码。

这是我的测试实现:

/etc/pam.d/common-session中我添加了:

session [success=ignore default=1] pam_exec.so debug seteuid /usr/sbin/test.sh logout
session optional        pam_exec.so debug log=/tmp/test_pam.txt /bin/echo "logout reached"
session [success=1 default=ignore] pam_exec.so debug seteuid /usr/sbin/test.sh logout
session optional        pam_exec.so  debug log=/tmp/test_pam.txt /bin/echo "login reached"

剧本/usr/sbin/test.sh

#!/bin/bash
# some actions
# invocted by pam_exec.so

echo $PAM_TYPE
case  in
logout)
  if [ $PAM_TYPE == "close_session" ]; then echo $PAM_TYPE; exit 0; else exit 1; fi
  ;;
esac

当我向用户发出 su 并立即注销时,我进入了日志文件

$ cat /tmp/test_pam.txt 
*** Mon Jun  3 12:14:07 2019
"login reached"
*** Mon Jun  3 12:15:00 2019
"login reached"

这种行为很奇怪。最后一行必须是 logout reached.
所以 Pam 每次都将条件设为假。但是为了测试,我将 echo $PAM_TYPE; 置于真实条件下,并且此回显通过注销显示在终端中。所以 if 语句导致 true with exit 0 但 pam_exec 将其视为 false.

有人知道出了什么问题吗?

提前致谢,

赫尔格

我从另一个网站得到这个答案:

You cannot depend on jumps in PAM stack in the close_session calls. The pam module stack is "frozen" in the open_session and identical modules in the same order are invoked in the close_session call.

我的脚本的行为现在很清楚了:我的方法是不可能的!