mejor manera para desconectar usuarios remotos

Victor Hugo dos Santos listas.vhs en gmail.com
Lun Ene 26 16:53:53 CLST 2009


2009/1/26 Aldrin Martoq <amartoq en dcc.uchile.cl>:
> On Mon, 2009-01-26 at 10:22 -0300, Victor Hugo dos Santos wrote:
>> debo de desconectar todos los usuarios remotos (ssh) de un servidor
>> durante un periodo de tiempo semanal..
>> a principio pensé que deteniendo el servicio (/etc/init.d/ssh stop)
>> resolvería el tema, pero las conexiones activas, continúan activas
>> (plop ???)  !!!
>
> Eso permite actualizar ssh remotamente: se actualiza, se reinica el
> servidor, pero sigues conectado.

mmmm...
no lo se.. creo que seria bueno que cuando uno indicara que el
servicio se detuviera, se cerrara todas las conexciones activas..
y en caso de las actualizaciones/mantenciones se podria utilizar
reload/HUP y asi mantener las sessiones abiertas.

[...]

abajo sigue, las lineas que enviaste con algunos ayustes...  entre ellos:
 - habia un error con el parametro "ps -ho" (al menos en RHEL, no
reconoce la opcion h)
 - ahora, se obtiene los tty en que esta el usuario
 - y un cambio de uniq para "sort -u"
 - tambien se envia un correo al admin con los usuarios que estaban

=================
#/bin/bash
# Script para desconectar los usuarios remotos en los servidores.
# http://listas.inf.utfsm.cl/pipermail/linux/2009-January/046459.html

PIDS_TEMP=`mktemp /tmp/$0.X`
USERS_TEMP=`mktemp /tmp/$0.X`
TIMEOUT=60

# Guardar los PIDs associados con el proceso SSH y sus subprocesos
# en un archivo temporal
pstree -up $(cat /var/run/sshd.pid ) | perl -ne '@a = ($_ =~
m/(\d+)/g); print join("\n", @a)."\n"' > $PIDS_TEMP

# Obtiente el nombre de los usuarios y los TTY en que estan conectados
# (util cuando el usuario tiene mas de una session abierta)
ps -o user,tty $(cat $PIDS_TEMP) | grep pts | egrep -v '(^root|^USER)'
| awk '{print $1" "$2}' | sort -u > $USERS_TEMP

# envia un mensaje al usuario
cat $USERS_TEMP |  while read USERS
do
        echo -e "El sistema desconectara todos los usuarios remotos en
$TIMEOUT SEGUNGOS\n" | write $USERS
done


# Caso no hay usuarios conectados, finaliza el proceso
# en caso contrario, enviar el listado al administrador
if [ "x$USERS_TEMP" = "x" ]; then
        exit 0
else
        cat $USERS_TEMP | mail root -s "Usuarios Conectados en el Sistema"
fi


# Espera el tiempo indicado para inicar el proceso de desconexcion
sleep $TIMEOUT

# Envia una senal HUP a todos los procesos
for PROCS in `pstree -up $(cat /var/run/sshd.pid ) | perl -ne '@a =
($_ =~ m/(\d+)/g); print join("\n", @a)."\n"'`
do
       kill -HUP $PROCS
done


# Espera 60 segundos para que los procesos se detengan y en caso contrario
# envia una senal TERM
sleep 60

for PROCS in `pstree -up $(cat /var/run/sshd.pid ) | perl -ne '@a =
($_ =~ m/(\d+)/g); print join("\n", @a)."\n"'`
do
	kill -HUP $PROCS
done


# espera otros 60 segundos y caso no hay logrado finalizar todos
# los procesos remotos, envia una senal KILL
sleep 60

for PROCS in `pstree -up $(cat /var/run/sshd.pid ) | perl -ne '@a =
($_ =~ m/(\d+)/g); print join("\n", @a)."\n"'`
do
	kill -HUP $PROCS
done
=================

salu2 y gracias nuevamente


-- 
-- 
Victor Hugo dos Santos
Linux Counter #224399



Más información sobre la lista de distribución Linux