我尝试在用户使用 pam_exe.so 登录时运行脚本。
/etc/pam.d/common-sesion
是:
session required pam_unix.so
session optional pam_sss.so
session optional pam_systemd.so
session optional pam_ecryptfs.so unwrap
session optional pam_ck_connector.so nox11
session required pam_oddjob_mkhomedir.so umask=0077
# end of pam-auth-update config
session optional pam_exec.so debug seteuid log=/tmp/pam_exec.log /usr/local/createlink
createlink 脚本是:
#!/bin/bash
if [ ! -L /home/$PAM_RUSER/zdrive ]; then
ln -s /mnt/dcs/home/$PAM_RUSER /home/$PAM_RUSER/zdrive
fi
和
$ ls -l /usr/local/createlink
-rwxr-xr-x 1 root root 200 Apr 18 15:10 createlink*
但是这样用户就不能登录了。图形登录时显示身份验证失败
当我从命令行执行 su - 时,出现“su:权限被拒绝错误”。未创建日志文件 /tmp/pam_exec.log。
运行 Linux Mint 18
我为此失去了理智...欢迎任何帮助!!!
感谢大家的时间
答案1
现在所有登录都失败的一个可能原因是脚本的退出状态。如果脚本返回非零,则视为失败,并且会话设置可能会中止。(实际中止的决定并不明显;这似乎与堆栈中涉及的模块pam_exec
数量有关。)optional
查看您的代码,您正在使用$PAM_RUSER
而不是$PAM_USER
识别正在登录的用户帐户。$PAM_RUSER
通常为空,因此您的代码等同于此
if [ ! -L /home/zdrive ]; then
ln -s /mnt/dcs/home/ /home/zdrive
fi
如果链接才不是最初存在,它被创建,并且脚本的退出状态为良好。第二次及后续调用脚本时,链接将要最初存在,因此测试失败,这是脚本的隐含退出状态。
您可以通过稍微修改代码来解决这个问题:
#!/bin/bash
if [ ! -L "/home/$PAM_USER/zdrive" ]; then
ln -s "/mnt/dcs/home/$PAM_USER" /home/$PAM_USER/zdrive"
fi
exit 0
另一个有用的调试工具是系统记录器。不要低估它。例如,将这一行放在该#!
行后面,将为您提供信息/var/log/user.log
或您的发行版的等效信息:
logger -t "${0/*\/}" "id=$(id); PAM_RHOST=$PAM_RHOST, PAM_RUSER=$PAM_RUSER, PAM_SERVICE=$PAM_SERVICE, PAM_TTY=$PAM_TTY, PAM_USER=$PAM_USER, PAM_TYPE=$PAM_TYPE."
输出示例ssh roaima@localhost whoami
:
Jul 4 22:48:56 vml1 pam_exec_test.sh: id=uid=0(root) gid=0(root) groups=0(root); PAM_RHOST=localhost, PAM_RUSER=, PAM_SERVICE=sshd, PAM_TTY=ssh, PAM_USER=roaima, PAM_TYPE=open_session.
Jul 4 22:48:56 vml1 pam_exec_test.sh: id=uid=0(root) gid=0(root) groups=0(root); PAM_RHOST=localhost, PAM_RUSER=, PAM_SERVICE=sshd, PAM_TTY=ssh, PAM_USER=roaima, PAM_TYPE=close_session.