尝试使用 pam_exec 编写 rsync 脚本

尝试使用 pam_exec 编写 rsync 脚本

我正在尝试编写一个 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_RUSERPAM_SERVICEPAM_TTYPAM_USERPAM_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 大多数用户不会同时多次登录同一服务器。如果您发现这种情况很常见,那么有办法处理它。

相关内容