Re: mejor manera para desconectar usuarios remotos

2009-01-27 Por tema Horst H. von Brand
Victor Hugo dos Santos  wrote:

[...]

> he probado el -HUP y realmente desconecta a los usuarios remotos..
> pero la verdad es que en este caso no entiendo por que se usa el HUP.

HUP == Hang UP == "el telefono mediante el cual se conecta via modem el
usuario que corre este proceso se colgo".

> ya que siempre pense que el -HUP, serviria para hacer que un proceso
> leyera sus archivos de configurarcion sin "reiniciarlo" (un reload, en
> realiad)..

Se requeria hacer eso de alguna forma limpia, sin agregar tonteras nuevas a
sistemas limitadisimos, asi que pensaron en reusar alguna sen~al sin ningun
sentido en un daemon... o sea HUP ;-)

>y jamas lo utilizaria para el caso de mas arriba, pues
> "pensaba" que la senal TERM seria la mas apropiada.

TERM == TERMinate, termine. No es lo mismo, en caso de perder contacto
involuntariamente con el humano que controla el proceso puede tener sentido
seguir igual.


Estudia un poquitin la historia de Unix ;-)
-- 
Dr. Horst H. von Brand   User #22616 counter.li.org
Departamento de InformaticaFono: +56 32 2654431
Universidad Tecnica Federico Santa Maria +56 32 2654239
Casilla 110-V, Valparaiso, Chile 234   Fax:  +56 32 2797513


Re: mejor manera para desconectar usuarios remotos

2009-01-27 Por tema Horst H. von Brand
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 ???)  !!!
> he visto algunas opciones (ClientAliveInterval) en /etc/sshd/, pero no
> me funciona, por que necesito que se desconecten todos a las 02:00AM..
> y caso el condenado, perdon, el usuario este trabajando a las 02:00AM
> tampoco funcionaria el ClientAliveInterval.
> 
> Bueno, asi que pregunto a ustedes, cual es la mejor manera de
> desconectar los usuarios remotos ??
> 
> pienso que seria bueno:
> 1° - un mensaje indicando que el servicio sera desconectado en unos 5
> minutos (como en shutdown)

Puedes bajar el sistema a runlevel 1... eso debiera dejar fuera a los
pajaritos.

> 2° - algún comando que finalice correctamente los comandos que puedan
> estar ejecutando este usuario "desde esta conexión"..

Eso perfectamente puede tomar dias.

> 3° - un comando para finalizar la conexcion de todos los usuarios
> remotos.  la verdad es que podría hacer algo con KILL (-9 tal vez), pero
> creo que seria brusco..  por esto, pregunto por aca si alguien tiene
> alguna idea de como resolver esto.
-- 
Dr. Horst H. von Brand   User #22616 counter.li.org
Departamento de InformaticaFono: +56 32 2654431
Universidad Tecnica Federico Santa Maria +56 32 2654239
Casilla 110-V, Valparaiso, Chile 234   Fax:  +56 32 2797513


Re: mejor manera para desconectar usuarios remotos

2009-01-27 Por tema Aldrin Martoq
On Tue, 2009-01-27 at 10:55 -0300, Victor Hugo dos Santos wrote:
> 2009/1/27 Alvaro Herrera :
> > En realidad creo que con la primera iteración basta, porque si le mandas
> > un SIGHUP al proceso sshd que está dos niveles por debajo del proceso en
> > sshd.pid, éste se encarga de propagar la señal hacia los hijos de más
> > abajo, tal como se supone que un shell debe hacer.  En tu ejemplo de más
> > abajo:
> he cierto.. en el primer ejemplo que envio Aldrin, pense que el mejor
> seria obtener los PIDs de cada uno de los procesos y sus subprocesos y
> ordenarlos numéricamente y al revés... entonces enviar una senal desde
> el primer PID hasta el ultimo..
> pero no fue necesario... al menos no vi diferencia/errores en detener
> el proceso padre directamente.

Depende ... hay procesos porfiados que perfectamente se pueden quedar
pegados. Me ha pasado con java por ejemplo, que se colgaba y lo unico
para matarlo era kill -9. Aca un demo:

amar...@videopodcast:~$ more nomorire.sh 
#!/bin/bash
trap "echo no morire..." INT TERM EXIT HUP
while true; do sleep 10; done
amar...@videopodcast:~$ ./nomorire.sh 

r...@videopodcast:~# pstree -Ap $(cat /var/run/sshd.pid )
sshd(4859)---sshd(5923)---sshd(5928)---bash(5931)---nomorire.sh(5961)---sleep
r...@videopodcast:~# kill -1 5931
r...@videopodcast:~# pstree -Ap $(cat /var/run/sshd.pid )
sshd(4859)
r...@videopodcast:~# pstree -Ap |grep nomo
|-nomorire.sh(5961)---sleep(6138)




-- 
Aldrin Martoq 
http://aldrin.martoq.cl/videopodcast/ http://aldrin.martoq.cl/techblog/


signature.asc
Description: This is a digitally signed message part


Re: mejor manera para desconectar usuarios remotos

2009-01-27 Por tema Victor Hugo dos Santos
2009/1/27 Alvaro Herrera :
> Aldrin Martoq escribió:
>
>> Yep, _mucho_ mejor! Solo te falto iterar todo el arbol hasta el final,
>> no solo la primera capa:
>
> En realidad creo que con la primera iteración basta, porque si le mandas
> un SIGHUP al proceso sshd que está dos niveles por debajo del proceso en
> sshd.pid, éste se encarga de propagar la señal hacia los hijos de más
> abajo, tal como se supone que un shell debe hacer.  En tu ejemplo de más
> abajo:
>
>> amar...@videopodcast:~$ pstree -Ap $(cat /var/run/sshd.pid)
>> sshd(4859)-+-sshd(7)---sshd(11125)---bash(11128)
>>`-sshd(12035)---sshd(12039)---bash(12042)
>> amar...@videopodcast:~$ ./h.sh
>> hijos sshd (4859): 11128 11125 7 12042 12039 12035
>
> Si uno da SIGHUP a los procesos 11125 y 12039, automáticamente se
> cierran también 11128 y 12042, y ellos propagan la señal también a sus
> hijos los cuales también se cierran si corresponde.

he cierto.. en el primer ejemplo que envio Aldrin, pense que el mejor
seria obtener los PIDs de cada uno de los procesos y sus subprocesos y
ordenarlos numéricamente y al revés... entonces enviar una senal desde
el primer PID hasta el ultimo..
pero no fue necesario... al menos no vi diferencia/errores en detener
el proceso padre directamente.

mmm.. consulta, por que mandas la senal al proceso sshd que esta dos
niveles por debajo del proceso padre y no al primer ??

===
$ pstree 3555 -p
sshd(3555)─┬─sshd(10517)───sshd(10541)───bash(10542)───pstree(13507)
   └─sshd(10575)───sshd(10577)───bash(10578)───top(10600)

$ sudo kill 10575

$ pstree 3555 -p
sshd(3555)───sshd(10517)───sshd(10541)───bash(10542)───pstree(13522)
===

salu2 y gracias
-- 
-- 
Victor Hugo dos Santos
Linux Counter #224399



Re: mejor manera para desconectar usuarios remotos

2009-01-27 Por tema Alvaro Herrera
Aldrin Martoq escribió:

> Yep, _mucho_ mejor! Solo te falto iterar todo el arbol hasta el final,
> no solo la primera capa:

En realidad creo que con la primera iteración basta, porque si le mandas
un SIGHUP al proceso sshd que está dos niveles por debajo del proceso en
sshd.pid, éste se encarga de propagar la señal hacia los hijos de más
abajo, tal como se supone que un shell debe hacer.  En tu ejemplo de más
abajo:

> amar...@videopodcast:~$ pstree -Ap $(cat /var/run/sshd.pid)
> sshd(4859)-+-sshd(7)---sshd(11125)---bash(11128)
>`-sshd(12035)---sshd(12039)---bash(12042)
> amar...@videopodcast:~$ ./h.sh 
> hijos sshd (4859): 11128 11125 7 12042 12039 12035

Si uno da SIGHUP a los procesos 11125 y 12039, automáticamente se
cierran también 11128 y 12042, y ellos propagan la señal también a sus
hijos los cuales también se cierran si corresponde.

> --h.sh---
> #!/bin/bash
> hijos() {
>   for i in $(ps --ppid $1 -o pid --no-headers); do
> (hijos $i)
> echo -n "$i "
>   done
> }
> sshdpid=$(cat /var/run/sshd.pid)
> 
> echo "hijos sshd ($sshdpid):" $(hijos $sshdpid)
> -

Top.

-- 
Alvaro Herrera   http://www.PlanetPostgreSQL.org/
The easiest way to resolve [trivial code guidelines disputes] is to fire
one or both of the people involved.  (Damian Conway)


Re: mejor manera para desconectar usuarios remotos

2009-01-26 Por tema Aldrin Martoq
On Mon, 2009-01-26 at 18:25 -0300, Alvaro Herrera wrote:
> Aldrin Martoq escribió:
> > #!/bin/bash
> > hijos_ssh () {
> >   sshdpid=$(cat /var/run/sshd.pid)
> >   pstree -p $sshdpid \
> >   | perl -ne \
> >   '@a = ($_ =~ m/(\d+)/g); print join("\n", @a)."\n"' \
> >   | grep -v "^$sshdpid$"
> > }
> Yo creo que esta es una forma horrible de hacer esto.  Yo me inclinaría
> por algo así:
> ps --ppid $(cat /var/run/sshd.pid) -o pid --no-headers
> y luego iterar (una vez) para obtener los hijos de esos procesos, o sea
> for pid in $(ps --ppid $(cat /var/run/sshd.pid) -o pid --no-headers); do
>   ps --ppid $pid -o pid --no-headers
> done


Yep, _mucho_ mejor! Solo te falto iterar todo el arbol hasta el final,
no solo la primera capa:

--h.sh---
#!/bin/bash
hijos() {
  for i in $(ps --ppid $1 -o pid --no-headers); do
(hijos $i)
echo -n "$i "
  done
}
sshdpid=$(cat /var/run/sshd.pid)

echo "hijos sshd ($sshdpid):" $(hijos $sshdpid)
-


amar...@videopodcast:~$ pstree -Ap $(cat /var/run/sshd.pid)
sshd(4859)-+-sshd(7)---sshd(11125)---bash(11128)
   `-sshd(12035)---sshd(12039)---bash(12042)
amar...@videopodcast:~$ ./h.sh 
hijos sshd (4859): 11128 11125 7 12042 12039 12035



-- 
Aldrin Martoq 
http://aldrin.martoq.cl/videopodcast/ http://aldrin.martoq.cl/techblog/


signature.asc
Description: This is a digitally signed message part


Re: mejor manera para desconectar usuarios remotos

2009-01-26 Por tema Alvaro Herrera
Aldrin Martoq escribió:

> #!/bin/bash
> 
> hijos_ssh () {
>   sshdpid=$(cat /var/run/sshd.pid)
>   pstree -p $sshdpid \
>   | perl -ne \
>   '@a = ($_ =~ m/(\d+)/g); print join("\n", @a)."\n"' \
>   | grep -v "^$sshdpid$"
> }

Yo creo que esta es una forma horrible de hacer esto.  Yo me inclinaría
por algo así:

ps --ppid $(cat /var/run/sshd.pid) -o pid --no-headers

y luego iterar (una vez) para obtener los hijos de esos procesos, o sea

for pid in $(ps --ppid $(cat /var/run/sshd.pid) -o pid --no-headers); do
ps --ppid $pid -o pid --no-headers
done

-- 
Alvaro Herrera  Developer, http://www.PostgreSQL.org/
"How strange it is to find the words "Perl" and "saner" in such close
proximity, with no apparent sense of irony. I doubt that Larry himself
could have managed it." (ncm, http://lwn.net/Articles/174769/)


Re: mejor manera para desconectar usuarios remotos

2009-01-26 Por tema Aldrin Martoq
On Mon, 2009-01-26 at 16:53 -0300, Victor Hugo dos Santos wrote:
> 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

Yo quitaria los archivos temporales. Aca un ejemplo de como hacerlo

#!/bin/bash

hijos_ssh () {
  sshdpid=$(cat /var/run/sshd.pid)
  pstree -p $sshdpid \
  | perl -ne \
  '@a = ($_ =~ m/(\d+)/g); print join("\n", @a)."\n"' \
  | grep -v "^$sshdpid$"
}

for i in $(hijos_ssh); do echo pid $i; done
-


Lo otro, cuidado que esto no es perfecto... si un proceso se llama "1"
podrias matar el proceso init (por decir algo pq no se puede, pero
podrias matar apache o cualquier otro proceso). Ejemplo:

sshd(12627)───sshd(12659,amartoq)───bash(12662)───10.sh(13649)

Calza por mientras aparece algo mejor los numeros entre parentesis y
quita el -u...

-- 
Aldrin Martoq 
http://aldrin.martoq.cl/videopodcast/ http://aldrin.martoq.cl/techblog/


signature.asc
Description: This is a digitally signed message part


Re: mejor manera para desconectar usuarios remotos

2009-01-26 Por tema Alvaro Herrera
Aldrin Martoq escribió:
> On Mon, 2009-01-26 at 15:51 -0300, Germán Póo-Caamaño wrote:
> > Los pasos 2 y 3 te los ahorras usando el viejo y casi olvidado
> > wall(1).
> 
> Pero eso alertaria a usuarios que estan conectados de otras formas
> (ejemplos: tty serial o un XDMCP remoto).

Victor Hugo no ha especificado para qué quiere desconectar sólo a los
usuarios por SSH de esta forma, así que no sabemos si es bueno o malo.

-- 
Alvaro Herrera  Developer, http://www.PostgreSQL.org/
Hi! I'm a .signature virus!
cp me into your .signature file to help me spread!


Re: mejor manera para desconectar usuarios remotos

2009-01-26 Por tema Aldrin Martoq
On Mon, 2009-01-26 at 15:51 -0300, Germán Póo-Caamaño wrote:
> Los pasos 2 y 3 te los ahorras usando el viejo y casi olvidado
> wall(1).

Pero eso alertaria a usuarios que estan conectados de otras formas
(ejemplos: tty serial o un XDMCP remoto).


-- 
Aldrin Martoq 
http://aldrin.martoq.cl/videopodcast/ http://aldrin.martoq.cl/techblog/


signature.asc
Description: This is a digitally signed message part


Re: mejor manera para desconectar usuarios remotos

2009-01-26 Por tema Victor Hugo dos Santos
2009/1/26 Aldrin Martoq :
> 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.

...
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



Re: mejor manera para desconectar usuarios remotos

2009-01-26 Por tema Germán Póo-Caamaño
On Mon, 2009-01-26 at 14:16 -0300, Aldrin Martoq wrote:
> 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. 
> 
> > Bueno, asi que pregunto a ustedes, cual es la mejor manera de
> > desconectar los usuarios remotos ??
> 
> 1ero: deja un aviso en el /etc/motd explicando tus politicas [mira el
> man de motd, aca en debian debes modificar /etc/motd.tail]
> 
> 
> 2do: determina quienes se conectaron via ssh. Una aproximacion es ver
> que procesos son hijos de sshd; aca un ejemplo:
> 
> // listar procesos hijos de sshd
> # pstree -p $(cat /var/run/sshd.pid )
> 
> // extraer PID's
> # pstree -up $(cat /var/run/sshd.pid )|\
> perl -ne '@a = ($_ =~ m/(\d+)/g); print join("\n", @a)."\n"'
> > /tmp/listapid.txt
> 
> // buscar usuarios (salvo root)
> # ps -ho user,tty $(cat /tmp/listapid.txt) | grep -v ^root
> # ps -ho user,tty $(cat /tmp/listapid.txt) | grep -v ^root \
> | awk '{print $1}' | uniq > /tmp/listausuarios.txt
> 
> 
> 3ero: avisa  a los usuarios
> // write a dichos usuarios
> # for i in $(cat /tmp/listausuarios.txt); do echo 'el mundo se va a
> acabar...' | write $i ; done

Los pasos 2 y 3 te los ahorras usando el viejo y casi olvidado wall(1).
> 
-- 
Germán Póo-Caamaño
http://www.calcifer.org/



Re: mejor manera para desconectar usuarios remotos

2009-01-26 Por tema Julio Pacheco T.

Victor Hugo dos Santos escribió:

2009/1/26 Aldrin Martoq :

On Mon, 2009-01-26 at 10:22 -0300, Victor Hugo dos Santos wrote:


[...]


// listar procesos hijos de sshd
# pstree -p $(cat /var/run/sshd.pid )

// extraer PID's
# pstree -up $(cat /var/run/sshd.pid )|\
perl -ne '@a = ($_ =~ m/(\d+)/g); print join("\n", @a)."\n"'

/tmp/listapid.txt

// buscar usuarios (salvo root)
# ps -ho user,tty $(cat /tmp/listapid.txt) | grep -v ^root
# ps -ho user,tty $(cat /tmp/listapid.txt) | grep -v ^root \
| awk '{print $1}' | uniq > /tmp/listausuarios.txt


interessante.. me salvaste unas cuantas neuronas !! :D

[...]


4to: mata los procesos (deberias regenerar el /tmp/listapid.txt)

// kill por favor de los procesos
# for i in $(cat /tmp/listapid.txt); do kill -HUP $i; done
# sleep 60


he probado el -HUP y realmente desconecta a los usuarios remotos..
pero la verdad es que en este caso no entiendo por que se usa el HUP.


De signal(7):

SIGHUP1   TermHangup detected on controlling terminal
 or death of controlling process

Pensado en modem, le cuelgas el telefono a la conexion. (Históricamente,
precisamente esa era la acción que gatillaba un SIGHUP)


ya que siempre pense que el -HUP, serviria para hacer que un proceso
leyera sus archivos de configurarcion sin "reiniciarlo" (un reload, en
realiad).. y jamas lo utilizaria para el caso de mas arriba, pues
"pensaba" que la senal TERM seria la mas apropiada.


En varios daemons se ha reutilizado HUP para ese proposito.
Otros usan SIGUSR1/2 para lo mismo.

--
Julio Pacheco T.
Consultor Tecnológico
ProVectis S.A.
Fono: 2319910 anexo 109


Re: mejor manera para desconectar usuarios remotos

2009-01-26 Por tema Alvaro Herrera
Victor Hugo dos Santos escribió:

> he probado el -HUP y realmente desconecta a los usuarios remotos..
> pero la verdad es que en este caso no entiendo por que se usa el HUP.

HUP viene de "hang up", que es la expresión que los gringos usan para
colgar el teléfono.  La analogía es obvia: si estás corriendo un
intérprete en un servidor remoto y "cuelgas", obviamente lo que tiene
que pasar es que el intérprete se cierre (para terminar la conexión).
Además, el intérprete propaga la señal a sus procesos hijos.

El que SIGHUP se use para indicar otra cosa es una reliquia histórica;
como obviamente no tiene sentido pedirle a un daemon que "cuelgue la
conexión" (dado que la idea era que siguiera funcionando), se puede
reciclar la señal para el significado "releer los archivos de
configuración" que no tenía señal propia.  Es más; es muy conveniente
usarla para este significado, porque si echas a andar un proceso
cualquiera y luego cierras el terminal, el proceso se muere; pero si
este proceso está pensado para mantenerse vivo después del cierre,
entonces nada mejor que darle un uso que sea "inocuo".

Mira las primeras 15 señales: HUP, INT, QUIT, ILL, TRAP, ABRT, BUS, FPE,
KILL, USR1, SEGV, USR2, PIPE, ALRM, TERM ... ya están todos los posibles
significados usados, el único que es susceptible de reciclarse es HUP.
(El valor 0 por alguna razón no tiene nombre, pero tiene sus propios
usos).

-- 
Alvaro Herrera http://www.amazon.com/gp/registry/DXLWNGRJD34J
"Cuando miro a alguien, más me atrae cómo cambia que quién es" (J. Binoche)


Re: mejor manera para desconectar usuarios remotos

2009-01-26 Por tema Victor Hugo dos Santos
2009/1/26 Aldrin Martoq :
> On Mon, 2009-01-26 at 10:22 -0300, Victor Hugo dos Santos wrote:

[...]

> // listar procesos hijos de sshd
> # pstree -p $(cat /var/run/sshd.pid )
>
> // extraer PID's
> # pstree -up $(cat /var/run/sshd.pid )|\
> perl -ne '@a = ($_ =~ m/(\d+)/g); print join("\n", @a)."\n"'
>> /tmp/listapid.txt
>
> // buscar usuarios (salvo root)
> # ps -ho user,tty $(cat /tmp/listapid.txt) | grep -v ^root
> # ps -ho user,tty $(cat /tmp/listapid.txt) | grep -v ^root \
> | awk '{print $1}' | uniq > /tmp/listausuarios.txt

interessante.. me salvaste unas cuantas neuronas !! :D

[...]

> 4to: mata los procesos (deberias regenerar el /tmp/listapid.txt)
>
> // kill por favor de los procesos
> # for i in $(cat /tmp/listapid.txt); do kill -HUP $i; done
> # sleep 60

he probado el -HUP y realmente desconecta a los usuarios remotos..
pero la verdad es que en este caso no entiendo por que se usa el HUP.

ya que siempre pense que el -HUP, serviria para hacer que un proceso
leyera sus archivos de configurarcion sin "reiniciarlo" (un reload, en
realiad).. y jamas lo utilizaria para el caso de mas arriba, pues
"pensaba" que la senal TERM seria la mas apropiada.

salu2 y gracias.

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


Re: mejor manera para desconectar usuarios remotos

2009-01-26 Por tema Asdtaker
2009/1/26 Aldrin Martoq 

> 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.
>
> > Bueno, asi que pregunto a ustedes, cual es la mejor manera de
> > desconectar los usuarios remotos ??
>
> 1ero: deja un aviso en el /etc/motd explicando tus politicas [mira el
> man de motd, aca en debian debes modificar /etc/motd.tail]
>
>
> 2do: determina quienes se conectaron via ssh. Una aproximacion es ver
> que procesos son hijos de sshd; aca un ejemplo:
>
> // listar procesos hijos de sshd
> # pstree -p $(cat /var/run/sshd.pid )
>
> // extraer PID's
> # pstree -up $(cat /var/run/sshd.pid )|\
> perl -ne '@a = ($_ =~ m/(\d+)/g); print join("\n", @a)."\n"'
> > /tmp/listapid.txt
>
> // buscar usuarios (salvo root)
> # ps -ho user,tty $(cat /tmp/listapid.txt) | grep -v ^root
> # ps -ho user,tty $(cat /tmp/listapid.txt) | grep -v ^root \
> | awk '{print $1}' | uniq > /tmp/listausuarios.txt
>
>
> 3ero: avisa  a los usuarios
> // write a dichos usuarios
> # for i in $(cat /tmp/listausuarios.txt); do echo 'el mundo se va a
> acabar...' | write $i ; done
>
>
>
> 4to: mata los procesos (deberias regenerar el /tmp/listapid.txt)
>
> // kill por favor de los procesos
> # for i in $(cat /tmp/listapid.txt); do kill -HUP $i; done
> # sleep 60
>
> // kill a los procesos porfiados...
> # for i in $(cat /tmp/listapid.txt); do kill -TERM $i; done
> # sleep 60
>
> // kill a los ultra ultra porfiados
> # for i in $(cat /tmp/listapid.txt); do kill -KILL $i; done
>
>
>
> > 1° - un mensaje indicando que el servicio sera desconectado en unos 5
> > minutos (como en shutdown)
> > 2° - algún comando que finalice correctamente los comandos que puedan
> > estar ejecutando este usuario "desde esta conexión"..
> > 3° - un comando para finalizar la conexcion de todos los usuarios
> remotos.
> >
> > la verdad es que podría hacer algo con KILL (-9 tal vez), pero creo
> > que seria brusco..
> > por esto, pregunto por aca si alguien tiene alguna idea de como resolver
> esto.
>
> Otra opcion podria ser que evites login (touch /etc/nologin) y
> _suspender_ esos procesos (kill -STOP ) ... y revivirlos a la
> vuelta de la hora normal (kill -CONT )
>
> Asi nadie pierde nada; pero depende de porque necesitas matar esos
> procesos ...

Guau! ¿así quien no? Excelente solución, se va derecho a Golden Doc.

Tks!

>
>
>
> --
> Aldrin Martoq 
> http://aldrin.martoq.cl/videopodcast/ http://aldrin.martoq.cl/techblog/
>



-- 
Saludos, LSM.
Existen 10 tipos de personas:
los que entienden binarios y los que no


Re: mejor manera para desconectar usuarios remotos

2009-01-26 Por tema Aldrin Martoq
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. 

> Bueno, asi que pregunto a ustedes, cual es la mejor manera de
> desconectar los usuarios remotos ??

1ero: deja un aviso en el /etc/motd explicando tus politicas [mira el
man de motd, aca en debian debes modificar /etc/motd.tail]


2do: determina quienes se conectaron via ssh. Una aproximacion es ver
que procesos son hijos de sshd; aca un ejemplo:

// listar procesos hijos de sshd
# pstree -p $(cat /var/run/sshd.pid )

// extraer PID's
# pstree -up $(cat /var/run/sshd.pid )|\
perl -ne '@a = ($_ =~ m/(\d+)/g); print join("\n", @a)."\n"'
> /tmp/listapid.txt

// buscar usuarios (salvo root)
# ps -ho user,tty $(cat /tmp/listapid.txt) | grep -v ^root
# ps -ho user,tty $(cat /tmp/listapid.txt) | grep -v ^root \
| awk '{print $1}' | uniq > /tmp/listausuarios.txt


3ero: avisa  a los usuarios
// write a dichos usuarios
# for i in $(cat /tmp/listausuarios.txt); do echo 'el mundo se va a
acabar...' | write $i ; done



4to: mata los procesos (deberias regenerar el /tmp/listapid.txt)

// kill por favor de los procesos
# for i in $(cat /tmp/listapid.txt); do kill -HUP $i; done
# sleep 60

// kill a los procesos porfiados...
# for i in $(cat /tmp/listapid.txt); do kill -TERM $i; done
# sleep 60

// kill a los ultra ultra porfiados
# for i in $(cat /tmp/listapid.txt); do kill -KILL $i; done



> 1° - un mensaje indicando que el servicio sera desconectado en unos 5
> minutos (como en shutdown)
> 2° - algún comando que finalice correctamente los comandos que puedan
> estar ejecutando este usuario "desde esta conexión"..
> 3° - un comando para finalizar la conexcion de todos los usuarios remotos.
> 
> la verdad es que podría hacer algo con KILL (-9 tal vez), pero creo
> que seria brusco..
> por esto, pregunto por aca si alguien tiene alguna idea de como resolver esto.

Otra opcion podria ser que evites login (touch /etc/nologin) y
_suspender_ esos procesos (kill -STOP ) ... y revivirlos a la
vuelta de la hora normal (kill -CONT )

Asi nadie pierde nada; pero depende de porque necesitas matar esos
procesos ...


-- 
Aldrin Martoq 
http://aldrin.martoq.cl/videopodcast/ http://aldrin.martoq.cl/techblog/


signature.asc
Description: This is a digitally signed message part


Re: mejor manera para desconectar usuarios remotos

2009-01-26 Por tema Eduardo Zamorano
2009/1/26 Victor Hugo dos Santos 

> Hola,
>
> 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 ???)  !!!
> he visto algunas opciones (ClientAliveInterval) en /etc/sshd/, pero no
> me funciona, por que necesito que se desconecten todos a las 02:00AM..
> y caso el condenado, perdon, el usuario este trabajando a las 02:00AM
> tampoco funcionaria el ClientAliveInterval.
>
> Bueno, asi que pregunto a ustedes, cual es la mejor manera de
> desconectar los usuarios remotos ??
>
> pienso que seria bueno:
> 1° - un mensaje indicando que el servicio sera desconectado en unos 5
> minutos (como en shutdown)
> 2° - algún comando que finalice correctamente los comandos que puedan
> estar ejecutando este usuario "desde esta conexión"..
> 3° - un comando para finalizar la conexcion de todos los usuarios remotos.
>
> la verdad es que podría hacer algo con KILL (-9 tal vez), pero creo
> que seria brusco..
> por esto, pregunto por aca si alguien tiene alguna idea de como resolver
> esto.


Yo lo haria con iptables algo asi como.

iptables -A INPUT -p tcp -s $mi_lan -d $ip_servidor --dport 22 -m state
--state NEW,ESTABLISHED -m time --timestart 06:30 --timestop 02:00 -days
Mon,Tue,Wed,Thu,Fri -j ACCEPT

slds


>
>
> salu2 a todos y que tengamos un excelente inicio de semana.
>
> --
> --
> Victor Hugo dos Santos
> Linux Counter #224399
>
>


Re: mejor manera para desconectar usuarios remotos

2009-01-26 Por tema Alvaro Herrera
Victor Hugo dos Santos escribió:

> a principio pensé que deteniendo el servicio (/etc/init.d/ssh stop)
> resolvería el tema, pero las conexiones activas, continúan activas
> (plop ???)  !!!
> he visto algunas opciones (ClientAliveInterval) en /etc/sshd/, pero no
> me funciona, por que necesito que se desconecten todos a las 02:00AM..
> y caso el condenado, perdon, el usuario este trabajando a las 02:00AM
> tampoco funcionaria el ClientAliveInterval.
> 
> Bueno, asi que pregunto a ustedes, cual es la mejor manera de
> desconectar los usuarios remotos ??

Si el usuario no está en la estación a las 2:00 AM, entonces no servirá
de nada mandarle un mensaje, porque no se va a desconectar manualmente.
Pero si alguno llega a estarlo, se va a molestar si lo desconectas sin
avisarle con anticipación.  Así que estoy de acuerdo con tu plan:

> pienso que seria bueno:
> 1° - un mensaje indicando que el servicio sera desconectado en unos 5
> minutos (como en shutdown)
> 2° - algún comando que finalice correctamente los comandos que puedan
> estar ejecutando este usuario "desde esta conexión"..
> 3° - un comando para finalizar la conexcion de todos los usuarios remotos.

La verdad es que no sé cómo hacer el paso 2, pero para terminar las
conexiones SSH lo que puedes hacer es un kill -HUP ("hang up") del
shell, con lo cual éste corta la conexión y se cierra.  Obviamente si
algún usuario dejó procesos con "nohup" o daemons de otro tipo no se van
a cerrar, pero no creo que eso importe mucho ...

-- 
Alvaro Herrera  http://www.amazon.com/gp/registry/5ZYLFMCVHXC
"La gente vulgar solo piensa en pasar el tiempo;
el que tiene talento, en aprovecharlo"


Re: mejor manera para desconectar usuarios remotos

2009-01-26 Por tema Miguel Angel Amador L
2009/1/26 Asdtaker :
> 2009/1/26 Victor Hugo dos Santos 
>
>> Hola,
>>
>> 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 ???)  !!!
>> he visto algunas opciones (ClientAliveInterval) en /etc/sshd/, pero no
>> me funciona, por que necesito que se desconecten todos a las 02:00AM..
>> y caso el condenado, perdon, el usuario este trabajando a las 02:00AM
>> tampoco funcionaria el ClientAliveInterval.
>>
>> Bueno, asi que pregunto a ustedes, cual es la mejor manera de
>> desconectar los usuarios remotos ??
>>
>> pienso que seria bueno:
>> 1° - un mensaje indicando que el servicio sera desconectado en unos 5
>> minutos (como en shutdown)
>> 2° - algún comando que finalice correctamente los comandos que puedan
>> estar ejecutando este usuario "desde esta conexión"..
>> 3° - un comando para finalizar la conexcion de todos los usuarios remotos.
>>
>> la verdad es que podría hacer algo con KILL (-9 tal vez), pero creo
>> que seria brusco..
>
> no se que tan brusco será, pero prueba con killall(1).

Podrias mandarles un avisito con 'wall' antes del kill
-- 
Miguel



Re: mejor manera para desconectar usuarios remotos

2009-01-26 Por tema Asdtaker
2009/1/26 Victor Hugo dos Santos 

> Hola,
>
> 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 ???)  !!!
> he visto algunas opciones (ClientAliveInterval) en /etc/sshd/, pero no
> me funciona, por que necesito que se desconecten todos a las 02:00AM..
> y caso el condenado, perdon, el usuario este trabajando a las 02:00AM
> tampoco funcionaria el ClientAliveInterval.
>
> Bueno, asi que pregunto a ustedes, cual es la mejor manera de
> desconectar los usuarios remotos ??
>
> pienso que seria bueno:
> 1° - un mensaje indicando que el servicio sera desconectado en unos 5
> minutos (como en shutdown)
> 2° - algún comando que finalice correctamente los comandos que puedan
> estar ejecutando este usuario "desde esta conexión"..
> 3° - un comando para finalizar la conexcion de todos los usuarios remotos.
>
> la verdad es que podría hacer algo con KILL (-9 tal vez), pero creo
> que seria brusco..

no se que tan brusco será, pero prueba con killall(1).

>
> por esto, pregunto por aca si alguien tiene alguna idea de como resolver
> esto.
>
> salu2 a todos y que tengamos un excelente inicio de semana.
>
> --
> --
> Victor Hugo dos Santos
> Linux Counter #224399
>
>


-- 
Saludos, LSM.
Existen 10 tipos de personas:
los que entienden binarios y los que no


mejor manera para desconectar usuarios remotos

2009-01-26 Por tema Victor Hugo dos Santos
Hola,

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 ???)  !!!
he visto algunas opciones (ClientAliveInterval) en /etc/sshd/, pero no
me funciona, por que necesito que se desconecten todos a las 02:00AM..
y caso el condenado, perdon, el usuario este trabajando a las 02:00AM
tampoco funcionaria el ClientAliveInterval.

Bueno, asi que pregunto a ustedes, cual es la mejor manera de
desconectar los usuarios remotos ??

pienso que seria bueno:
1° - un mensaje indicando que el servicio sera desconectado en unos 5
minutos (como en shutdown)
2° - algún comando que finalice correctamente los comandos que puedan
estar ejecutando este usuario "desde esta conexión"..
3° - un comando para finalizar la conexcion de todos los usuarios remotos.

la verdad es que podría hacer algo con KILL (-9 tal vez), pero creo
que seria brusco..
por esto, pregunto por aca si alguien tiene alguna idea de como resolver esto.

salu2 a todos y que tengamos un excelente inicio de semana.

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