Tentando fazer script de rsync usando pam_exec

4

Estou tentando escrever um script bash que executará o rsync quando chamado por pam_exec . Eu tentei algumas maneiras diferentes, e não tenho certeza do que estou fazendo de errado. Quando tento executar o script no login adicionando

session     optional      pam_exec.so /usr/bin/local/sync.sh

ao meu arquivo sshd , ele me dá um código de saída de 12.

Se eu fizer login e, em seguida, executar manualmente o meu script, ele permitirá que eu me conecte ao servidor remoto e liste meus arquivos, mas, na verdade, ele não sincroniza nada.

Eu tentei o código abaixo usando buth $USER e $PAM_USER . $PAM_USER não funciona de todo.

#!/bin/sh 
rsync -azv -e ssh $USER@remote_server:/home/html/$USER/ /home/html/$USER
    
por Ricky-Rose 28.06.2013 / 23:21

1 resposta

2

A página man do pam_exec explica que o módulo fornece $PAM_USER , não $USER :

the following PAM items are exported as environment variables: PAM_RHOST, PAM_RUSER, PAM_SERVICE, PAM_TTY, PAM_USER and PAM_TYPE [...]

No meu sistema baseado em Debian eu adicionei esta linha antes da entrada para pam_motd

# Run a script on login
session    optional     pam_exec.so /usr/local/etc/pam_exec.sh

Eu então criei o script de teste, lembrando-me de torná-lo executável:

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

Por fim, abri uma nova sessão de login no meu sistema de teste e vi que, no início da sessão, recebia informações como essa no meu arquivo de log /tmp/pam_exec.log :

Mon Nov  9 23:32:52 GMT 2015
PAM_USER=roaima, USER=.

Para implementar sua exigência, você precisaria usar um script como este:

#!/bin/sh
rsync -azq -e ssh "$PAM_USER"@remote_server:/home/html/"$PAM_USER"/ /home/html/"$PAM_USER" >/dev/null 2>&1

Observe que todas as saídas de rsync são descartadas. Isso é necessário para garantir que os aplicativos cliente / servidor que usam ssh como um transporte não sejam atingidos por uma saída inesperada antes que possam iniciar sua negociação. Se você realmente deseja apresentá-lo ao usuário, eu recomendo que você o grave em um arquivo de log específico do usuário, como "$HOME/.pam_exec.log" , e use uma linha como essa no .profile do usuário para gerá-lo após o processo de login concluído:

if test -t 1 -a -s "$HOME/.pam_exec.log"
then
    echo "Prelogin results"
    sed 's/^/| /' "$HOME/.pam_exec.log"
fi

Não está imune a uma condição de corrida, mas a maioria dos usuários do IME não faz login simultaneamente várias vezes no mesmo servidor. Se você acha que esse cenário é comum, há maneiras de lidar com isso.

    
por 10.11.2015 / 00:49

Tags