我想为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 $1 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"
这种行为很奇怪。最后一行必须登出。
因此,Pam每次将条件设为假。但是为了进行测试,我将echo $PAM_TYPE;
设置为true,并且该回显通过注销显示在终端中。因此,如果if语句使用exit 0
导致 true ,但pam_exec将其视为false。
有人知道出了什么问题吗?
预先感谢
Helge
答案 0 :(得分:0)
我从另一个站点得到了这个答案:
您不能依赖close_session调用中PAM堆栈中的跳转。 pam模块堆栈在open_session中被“冻结”,并且在close_session调用中以相同顺序调用相同的模块。
我的脚本的行为现在很清楚:我的方法是不可能的!