Назад | Перейти на главную страницу

Попытка написать сценарий rsync с помощью pam_exec

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