bash – 尝试使用pam_exec编写rsync脚本

我正在尝试编写一个bash脚本,它将在pam_exec调用时执行rsync.我尝试了几种不同的方法,我不确定我做错了什么.
当我尝试通过添加登录时运行脚本
session     optional      pam_exec.so /usr/bin/local/sync.sh

到我的sshd文件,它给我一个12的退出代码.

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

我使用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:

the following PAM items are exported as environment variables: PAM_RHOST,PAM_RUSER,PAM_SERVICE,PAM_TTY,PAM_USER and PAM_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

它不能免受竞争条件的影响,但IME大多数用户不会多次同时登录同一台服务器.如果您发现这种情况很常见,有办法解决它.

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...