我想实现 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 每次都将条件设为 false。但为了测试,我设置了 echo $PAM_TYPE;
true 条件,并且此回显通过 logout 显示在终端中。因此,if 语句导致真的但exit 0
pam_exec 将其视为错误。
有人知道出了什么问题吗?
提前致谢,
黑尔格
答案1
我从另一个网站得到这个答案:
您不能依赖 close_session 调用中的 PAM 堆栈跳转。pam 模块堆栈在 open_session 中被“冻结”,并且在 close_session 调用中以相同顺序调用相同的模块。
我的脚本的行为现在很清楚:我的方法是不可能的!
答案2
在 /etc/pam.d/sshd 中
会话需要 pam_exec.so /etc/pam_scripts/pam_exec.sh
其中 pam_exec.sh 有类似
如果 [ "$PAM_TYPE" == "open_session" ] && [ "$PAM_USER" != "root" ]; 然后
..做一点事
别的
做点别的事
菲
出口 0