diff options
Diffstat (limited to 'pam_script_ses_close')
| -rwxr-xr-x | pam_script_ses_close | 47 | 
1 files changed, 33 insertions, 14 deletions
diff --git a/pam_script_ses_close b/pam_script_ses_close index a806d2c..8340543 100755 --- a/pam_script_ses_close +++ b/pam_script_ses_close @@ -37,30 +37,49 @@ read auid < /proc/$$/loginuid  if [ "$auid" -eq 0 ]; then exit 0; fi  # for debugging, if needed -# logger -t mapuser $0 called with $PAM_USER pid=$$ session="$sess" auid="$auid" +#DEBUG logger -t mapuser $0 user=$PAM_USER pid=$$ session="$sess" auid="$auid"  if [ "$sess" -le 0 ] ; then -	logger -t $0 sessionid not set, no mapuser cleanup for \ -	   PID $$ user $PAM_USER -	exit 0 # never trigger an error +  logger -t $0 sessionid not set, no mapuser cleanup for \ +    PID $$ user $PAM_USER +  exit 0 # never trigger an error  fi  file=$dbdir/$sess -[ -e $file ] &&  { +if [ -e $file ]; then     IFS='=  ' read tag fauid <<< $(grep '^auid=' $file)     IFS='=  ' read tag fsess <<< $(grep '^session=' $file) -   # If info doesn't match, report it, but clean up anyway. -   [ "$auid" != "$fauid" -o "$sess" != "$fsess" ] && +   # If info doesn't match, report it, and don't clean up +   if [ "$auid" != "$fauid" -o "$sess" != "$fsess" ]; then       logger -t $0 "Session $sess mismatch auid $auid,$fauid session $sess,$fsess" - -   #OLSON rm -f $file -   } - -# OLSON, probably need to gc all files on exit from any, because -# original PID is always gone, but we don't want to remove on exit -# from su, sudo, etc. +   else +     uid=$(id -u) +     if [ "$uid" -ne 0 ]; then # shouldn't happen from pam_script +       logger -t $0 called with UID=$uid, no cleanup +       exit 0 +     fi +     pids=( $(egrep -w $fsess /proc/[1-9]*/sessionid | \ +              sed -e 's,/proc/,,' -e 's,/.*,,') ) +     clean=1 +     for pid in ${pids[*]}; do +       [ $pid -eq $$ ] && continue # skip ourselve +       read cmd  2>/dev/null < /proc/$pid/comm # ignore exited egrep, sed +       [ -z "$cmd" ] && continue # pid exited +       msg="$msg PID $pid comm=$cmd" +       case "$cmd" in +         sshd|sudo|login|su|telnetd)  ;; +         *) clean=0 ; cleancmd="$cmd" ;; +       esac +     done +     #DEBUG logger -t $0 sess=$fsess clean=$clean cmd=$cleancmd has $msg active +     [ $clean -eq 1 ] && { +       #DEBUG logger -t $0 cleanup session $fsess +       rm -f $file +     } +   fi +fi  # always succeed, this should not cause sessions shutdown errors  exit 0  | 
