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-27 Por tema Aldrin Martoq
On Tue, 2009-01-27 at 10:55 -0300, Victor Hugo dos Santos wrote:
 2009/1/27 Alvaro Herrera alvhe...@alvh.no-ip.org:
  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 amar...@dcc.uchile.cl
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 Horst H. von Brand
Victor Hugo dos Santos listas@gmail.com 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 Horst H. von Brand
Victor Hugo dos Santos listas@gmail.com 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-26 Por tema Asdtaker
2009/1/26 Victor Hugo dos Santos listas@gmail.com

 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


Re: mejor manera para desconectar usuarios remotos

2009-01-26 Por tema Miguel Angel Amador L
2009/1/26 Asdtaker asdta...@gmail.com:
 2009/1/26 Victor Hugo dos Santos listas@gmail.com

 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 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 Eduardo Zamorano
2009/1/26 Victor Hugo dos Santos listas@gmail.com

 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 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 pid) ... y revivirlos a la
vuelta de la hora normal (kill -CONT pid)

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


-- 
Aldrin Martoq amar...@dcc.uchile.cl
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 Asdtaker
2009/1/26 Aldrin Martoq amar...@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.

  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 pid) ... y revivirlos a la
 vuelta de la hora normal (kill -CONT pid)

 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 amar...@dcc.uchile.cl
 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 Victor Hugo dos Santos
2009/1/26 Aldrin Martoq amar...@dcc.uchile.cl:
 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 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 Julio Pacheco T.

Victor Hugo dos Santos escribió:

2009/1/26 Aldrin Martoq amar...@dcc.uchile.cl:

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 Victor Hugo dos Santos
2009/1/26 Aldrin Martoq amar...@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.

...
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 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 amar...@dcc.uchile.cl
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 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 amar...@dcc.uchile.cl
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 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 amar...@dcc.uchile.cl
http://aldrin.martoq.cl/videopodcast/ http://aldrin.martoq.cl/techblog/


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