Primeiro, os scripts de shell retornarão o status de saída do último comando. Um dos comandos que você está usando está saindo com o status 8 . Em segundo lugar, pam_exec não terá o mesmo ambiente que você. Então, quando rodar manualmente, não necessariamente funcionará como seria quando executado como parte da pilha de pam (que você está experimentando).
pam_exec tem várias variáveis de ambiente incorporadas que o ajudarão aqui. Eu iria reescrever o script assim:
#!/bin/bash
PATH=/bin:/usr/bin
SUBJ="Alert - Remote SSH access from ${PAM_USER}"
mail -s $SUBJ << __MESSAGE__
ALERT - Remote SSH Shell Access (${HOSTNAME}) on $(date)
User ${PAM_USER} logged in from ${PAM_RHOST}
$(who)
__MESSAGE__