it-swarm-es.tech

¿Cómo sacas a un usuario benigno de tu sistema?

Estaba buscando en Google hace un tiempo y noté un par de formas, pero supongo que Google no lo sabe todo. Entonces, ¿cómo sted expulsar a los usuarios de su caja de Linux? ¿también cómo haces para ver que están conectados en primer lugar? y relacionado ... ¿funciona su método si el usuario ha iniciado sesión en un X11 DE (no es un requisito, solo tengo curiosidad)?

68
xenoterracide

Probablemente haya una manera más fácil, pero hago esto:

  1. Vea quién ha iniciado sesión en su máquina: use who o w:

    > who  
    mmrozek  tty1         Aug 17 10:03  
    mmrozek  pts/3        Aug 17 10:09 (:pts/2:S.0)
    
  2. Busque el ID de proceso del Shell al que está conectado su TTY:

    > ps t  
    PID   TTY      STAT   TIME COMMAND  
    30737 pts/3    Ss     0:00 zsh
    
  3. Ríete de su inminente desconexión (este paso es opcional, pero se recomienda)

    > echo "HAHAHAHAHAHAHAHA" | write mmrozek pts/3
    
  4. Mata el proceso correspondiente:

    > kill -9 30737
    

Acabo de descubrir que puedes combinar los pasos 1 y 2 dando who el -u bandera; el PID es el número a la derecha:

> who -u
mmrozek  tty1         Aug 17 10:03 09:01        9250
mmrozek  pts/18       Aug 17 10:09 01:46       19467 (:pts/2:S.0)
147
Michael Mrozek

Como Micheal ya señaló, puede usar who para averiguar quién inició sesión. Sin embargo, si tienen múltiples procesos, hay una forma más conveniente que matar cada proceso individualmente: puede usar killall -u username para eliminar todos los procesos de ese usuario.

33
sepp2k

¡Nigromancia!

Aprecio el humor de la respuesta aceptada, pero profesionalmente no puedo defenderla.

El método más elegante que conozco es enviar un -HUP al Shell para simular el bloqueo de un usuario. Puede enviar esto al sshd inactivo del usuario para simular que se pierde su conexión, lo que desencadena una limpieza de todo el entorno Shell (incluidos los shells secundarios), o enviarlo a shells anidados específicos (por ejemplo, los que se configuran dentro de un multiplexor de terminal desconectado que te impiden desmontar un sistema de archivos) si quieres ser realmente preciso.

Usar write para enviar mensajes a ptys inactivos antes de arrancarlos es un pasatiempo divertido.

23
Andrew B

Salga del usuario 'nombre de usuario':

skill -KILL -u username

Ver man skill

13
bsd

Otro comando útil es pkill aquí pkill -u username && pkill -9 -u username. killall tiene la desventaja de que en Solaris IIRC significa algo completamente diferente, también pkill tiene opciones ligeramente más avanzadas.

11
Maciej Piechotka

En primer lugar, esto indica un problema mayor. Si tiene usuarios en los que no confía en su sistema, probablemente debería nivelarlo y volver a crear una imagen.

Con eso en mente, puede hacer algo o todo lo siguiente:

 # configurar el entorno 
 $ BADUSER = foo # donde foo es el nombre de usuario en cuestión 
 $ USERLINE = $ (grep '^ $ {BADUSER}:'/etc/passwd ) 
 $ BADUID = $ (echo $ {USERLINE} | awk -F: '{print $ 3}') 
 $ BADGID = $ (echo $ {USERLINE} | awk -F: '{ print $ 4} ') 
 $ BADHOMEDIR = $ (echo $ {USERLINE} | awk -F:' {print $ 6} ') 
 $ BDIR = "~/backup/home-backup /" 
 $ TSTAMP = $ (fecha +% F) 
 $ TAR_FILENAME = "$ {BADUSER} - $ {TSTAMP} .tar.bz2" 
 $ OWNED_FILENAME = "$ {BADUSER } -files - $ {TSTAMP} .txt "
 
 # deshabilita el inicio de sesión futuro del usuario 
 $ Sudo chsh -s/bin/false" $ {BADUSER} "
 
 # elimina todos los procesos del usuario 
 $ BADPROCS = $ (ps auwx | grep '^ $ {BADUSER}' | awk '{print $ 2}') 
 $ Sudo kill -9 $ {BADPROCS} 
 
 # Copia de seguridad/borrar el directorio de inicio del usuario 
 $ Mkdir -p $ {BDIR} 
 $ Sudo tar -cfj $ {BDIR}/$ {TAR_FILENAME} $ {BADHOMEDIR} 
 $ Sudo rm -rf $ {BADHOMEDIR} /.* $ {BADHOMEDIR}/* 
 
 # Encuentra todos los archivos propiedad del usuario [.__ __.] $ Sudo find/-user $ {BADUSER}> ~/backup/$ {OWNED_FILENAME} 
 
 # Remove user 
 $ Sudo userdel $ {BADUSER} 
3
cjac

Miré a mi alrededor y no pude encontrar un solo script para automatizar esta tarea.

Entonces, en base a las soluciones propuestas aquí, mezclé todo en n script Bash interactivo que enumera los usuarios y las sesiones de who -u para que el usuario elija qué hacer.

Entonces puedes:

  • matar todas las sesiones para un usuario killall -u <username> -HUP
  • matar una sesión específica kill <PID>

Toda la información requerida proviene de who -u y luego se analiza usando mapfile y awk.

Agregaré la posibilidad de enviar un mensaje usando write más tarde (bifurcando el proceso con retraso).

Probablemente agregaré la opción de matar una sesión específica con kill -9 también. Pero no tuve problemas con solo kill y como lo señalaron otros, kill -9 debe evitarse si es posible.

Puede verificar el código en github si desea probarlo u obtener más información sobre cómo lo estoy haciendo de manera automática:

0
Gus Neves

En mi opinión, no es realmente útil usar killall -u username porque si es el mismo usuario que tú, comenzarás. Entonces kill el proceso será una mejor solución.

0
Mailo

Entonces, ¿cómo sacas a los usuarios [benignos] de tu caja de Linux?

Al final, todo se reduce a identificar y finalizar los procesos que son propiedad, asociados o generados desde una identificación de usuario. Los comandos que use para alcanzar ese objetivo final no necesariamente importan mientras llegue allí.

Básicamente dos respuestas ...

Opción A: provocando un cierre de sesión de dicho usuario, para lo que sea y sin importar cuántos inicios de sesión tengan. Entonces, esto significaría identificar aquellos procesos que son propiedad de un usuario, rastreables por uid y clasificados como parte de algún proceso de inicio de sesión para la distribución de Linux dada que está ejecutando. Tenga en cuenta que hay procesos primarios como SSH o VNC antes del "inicio de sesión" y procesos secundarios como GDM después del "inicio de sesión". Por lo general, eliminar un proceso primario eliminará el proceso secundario, pero no siempre. Por lo tanto, desearía eliminar estos otros procesos que obviamente ya no son necesarios después del cierre de sesión. Al hacer todo esto, esto mantendría los trabajos en segundo plano en ejecución ... porque es un usuario benigno y tal vez solo desee cerrar la sesión. Por lo que sé, /usr/bin/w y /usr/bin/who informará quién ha pasado por el proceso de inicio de sesión.

opción B: finalizar todos los procesos propiedad de un uid específico por completo, lo que simplemente significaría eliminar todos y cada uno de los procesos propiedad de dicho usuario, esto también los cerraría si están conectados. Esto satisfaría el expulsarlos del sistema . Eso solo tiene que ser un simple ps -ef | grep <uid> y luego finalizar todos esos procesos de cualquier manera que sea aceptable.

fwiw en SLES 11 informa

habilidad del hombre ... Estas herramientas son probablemente obsoletas e inportables. La sintaxis del comando está mal definida. Considere usar los comandos killall, pkill y pgrep en su lugar.

kill -9 FTW!

0
ron