尝试使用pam_exec脚本编写脚本

我试图编写一个bash脚本,它将在被pam_exec调用时执行rsync。 我尝试了几种不同的方式,我不确定我做错了什么。 当我尝试通过添加login运行脚本

 session optional pam_exec.so /usr/bin/local/sync.sh 

到我的sshd文件,它给了我12退出码。

如果我login然后手动运行我的脚本,它允许我连接到远程服务器,它列出了我的文件,但它实际上并没有同步任何东西。

我已经尝试了下面的代码使用buth $USER$PAM_USER$PAM_USER根本不起作用。

 #!/bin/sh rsync -azv -e ssh $USER@remote_server:/home/html/$USER/ /home/html/$USER 

pam_exec的手册页说明模块提供了$PAM_USER ,而不是$USER

以下PAM项目被导出为环境variables: PAM_RHOSTPAM_RUSERPAM_SERVICEPAM_TTYPAM_USERPAM_TYPE […]

在我的基于Debian的系统上,我在pam_motd的条目之前添加了这行

 # Run a script on login session optional pam_exec.so /usr/local/etc/pam_exec.sh 

然后我创build了testing脚本,记住要使其可执行:

 cat >/usr/local/etc/pam_exec.sh <<'EOF'; chmod a+rx /usr/local/etc/pam_exec.sh #!/bin/bash # test open_session = "$PAM_TYPE" && { echo date echo "PAM_USER=$PAM_USER, USER=$USER." } >>/tmp/pam_exec.log exit 0 EOF 

最后,我打开了一个新的login会话到我的testing系统,看到在会话开始时我收到了如下信息在我的日志文件/tmp/pam_exec.log

 Mon Nov 9 23:32:52 GMT 2015 PAM_USER=roaima, USER=. 

要实现你的需求,你需要使用这样的脚本:

 #!/bin/sh rsync -azq -e ssh "$PAM_USER"@remote_server:/home/html/"$PAM_USER"/ /home/html/"$PAM_USER" >/dev/null 2>&1 

注意, rsync所有输出都被丢弃了。 这对于确保使用ssh作为传输的客户端/服务器应用程序在启动协商之前不会受到意外输出的影响是必要的。 如果你真的想把它呈现给用户,我build议你把它写到用户特定的日志文件,如"$HOME/.pam_exec.log" ,然后在用户的.profile使用这样的一行来输出它login过程完成后:

 if test -t 1 -a -s "$HOME/.pam_exec.log" then echo "Prelogin results" sed 's/^/| /' "$HOME/.pam_exec.log" fi 

对于竞争条件来说,这并不是免疫的,但大多数用户不会同时多次login同一个服务器。 如果你发现这种情况是常见的,有办法处理它。