Я пытаюсь написать сценарий bash, который будет выполнять rsync при вызове pam_exec
. Я пробовал несколько разных способов и не уверен, что делаю не так. Когда я пытаюсь запустить сценарий при входе в систему, добавляя
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
:
следующие элементы 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 не заходят одновременно несколько раз на один и тот же сервер. Если вы обнаружите, что этот сценарий распространен, есть способы с ним справиться.