我正在尝试编写一个 bash 脚本,该脚本将在调用时执行 rsync pam_exec
。我尝试了几种不同的方法,但不确定我做错了什么。当我尝试在登录时通过添加
session optional pam_exec.so /usr/bin/local/sync.sh
到我的sshd
文件,它给我一个退出代码 12。
如果我登录然后手动运行我的脚本,它允许我连接到远程服务器,并列出我的文件,但实际上它并没有同步任何内容。
$USER
我已经尝试使用 buth和下面的代码$PAM_USER
,但$PAM_USER
根本不起作用。
#!/bin/sh
rsync -azv -e ssh $USER@remote_server:/home/html/$USER/ /home/html/$USER
答案1
的手册页pam_exec
解释说该模块提供$PAM_USER
,而不是$USER
:
以下 PAM 项将作为环境变量导出:
PAM_RHOST
、、、、和[ ... ]PAM_RUSER
PAM_SERVICE
PAM_TTY
PAM_USER
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 大多数用户不会同时多次登录同一服务器。如果您发现这种情况很常见,那么有办法处理它。