我正在尝试编写一个bash脚本,它将在pam_exec调用时执行rsync.我尝试了几种不同的方法,我不确定我做错了什么.
当我尝试通过添加登录时运行脚本
当我尝试通过添加登录时运行脚本
session optional pam_exec.so /usr/bin/local/sync.sh
如果我登录然后手动运行我的脚本,它允许我连接到远程服务器,它列出我的文件,但它实际上并没有同步任何东西.
我使用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:
原文链接:https://www.f2er.com/bash/385328.htmlthe following PAM items are exported as environment variables:
PAM_RHOST
,PAM_RUSER
,PAM_SERVICE
,PAM_TTY
,PAM_USER
andPAM_TYPE
[…]
在我的基于Debian的系统上,我在pam_motd的条目之前添加了这一行
# Run a script on login session optional pam_exec.so /usr/local/etc/pam_exec.sh
然后我创建了测试脚本,记住要使其可执行:
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
最后,我打开了一个新的登录会话到我的测试系统,并在会话开始时看到我在我的日志文件/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作为传输的客户端/服务器应用程序在开始协商之前不会受到意外输出的影响是必要的.如果你真的想把它呈现给用户,我建议你把它写到用户特定的日志文件,如“$HOME / .pam_exec.log”,然后在用户的.profile中使用这样的一行来输出它登录过程完成后:
if test -t 1 -a -s "$HOME/.pam_exec.log" then echo "Prelogin results" sed 's/^/| /' "$HOME/.pam_exec.log" fi