2012-10-08 20 views
9

Tengo un quesiton que me intriga y me pregunto si alguien ha intentado lograr lo siguiente:Realizar la acción cuando el usuario cierra la sesión a través de SSH desde un host en particular

Vamos a suponer que esto es el resultado de mi 'última' comando en un entorno Linux:

root pts/1  192.168.1.10  Wed Feb 10 07:04 - 07:57 (00:52) 
root pts/2       Tue Feb 9 22:00 - 00:13 (02:13) 

¿Cómo puedo configurar una acción particular (digamos por ejemplo, un MOTD modificado o enviando un correo electrónico) si el usuario 'root' ha iniciado sesión desde 192.168.1.10. ¿Hay alguna forma de capturar esta información?

La segunda parte de esta pregunta es que ¿cómo puedo hacer lo anterior comprobar un poco más robusto - es decir, si tengo el siguiente:

mary pts/1  192.168.1.10  Wed Feb 10 07:04 - 07:57 (00:52) 
bob pts/2       Tue Feb 9 22:00 - 00:13 (02:13)  

Ahora me gustaría realizar una acción si el nombre de usuario es igual a 'mary' y el host es 192.168.1.10.

Cualquier sugerencia es bienvenida.

Gracias de antemano.

Respuesta

1

Gracias por todas sus respuestas. Eventualmente logré encontrar una solución que funcione por el momento, pero tiene un defecto que señalaré en un minuto.

he añadido lo siguiente al archivo/etc/bashrc (o /etc/bash.bashrc cualquier ambiente que está utilizando):

HOST="192.168.0.1" 
RHOST=`who am i | sed -n 's/.*(\([^) ]*\).*/\1/p; 1q'` 
if [ "$RHOST" == "$HOST" ]; then 
     echo "SAY WHAT!" 
     #add further actions here if needed 
fi 

La falla que yo hablaba antes en realidad puede no ser un defecto Si ya está SSH-ed en el sistema, y ​​quiere SSH a un huésped que vive en la misma IP, por ejemplo ssh [email protected]who am i sería entonces imprimir 'el huésped', pero yo creo que es la manera que debe ser.

No hace falta decir que la declaración anterior sed se puede modificar para que pueda capturar también el nombre de usuario, y puede ampliar la declaración if/else para adaptarla a sus necesidades.

Gracias de nuevo por todas sus respuestas.

+0

¿Has probado mi archivo 'sshrc'? =) –

+0

Me gusta su solución, así sputnick, gracias! :) – Tamas

+0

Hola sputnick. Estamos llegando al nivel 2 :) ¿Conoces una forma de excluir el registro de los comandos ssh que provienen de cronjobs/fragmentos de código? Solo me interesa el inicio de sesión de usuario desde una consola. Gracias. – Tamas

0

Una forma sería la de ejecutar un script sencillo periódicamente:

#!/bin/bash 
users=$(last | sed -ne '/192\.168\.1\.10/ s/\([^ ]*\).*/\1/p') 
for user in $users; do 
    sendmail "$user" < email.txt 
done 

Esto haría tubería en el último comando sed para extraer una lista de usuarios y guardarlo en la variable $users. El comando sed usa la bandera -n para que solo imprima lo que le decimos. Primero, seleccionamos líneas que contienen la dirección IP especificada, con la "dirección" /192\.168\.1\.10/. En esas líneas, intentamos extraer los caracteres antes de un espacio, y si logramos imprimir el resultado.

Luego, podemos recorrer la variable $users y actuar en consecuencia.

Una forma de llamar esto repetidamente sería a través de cron, y una forma más simple sería hacer while true; do ./my_script.bash; sleep 60; done.

+0

Re cron vs while, en su lugar use inotifywait para detectar cambios en/var/log/wtmp. –

+0

Gracias Janito. Creo que debe haber algo más "interactivo". Mi pensamiento es que si el lastlog se actualiza con un valor una vez que alguien ssh-s en el servidor, esa misma información podría ser capturado y se coloca en el archivo /etc/bash.bashrc por lo que sería llamado al iniciar la sesión. – Tamas

0

Puede agregar algo al /etc/profile o equivalente que hace algo dependiendo del valor de $SSH_CLIENT.

0

Parece que está usando last porque lee /var/log/wtmp de forma predeterminada, que es un registro de inicios de sesión. El comando who también le permite leer el mismo archivo pero con una interfaz más acorde a sus necesidades.

Por ejemplo:

$ who --ips /var/log/wtmp | grep '^msw.*127.0.0.1' 
msw  pts/2  2012-10-07 15:52 127.0.0.1 
msw  pts/3  2012-10-07 15:55 127.0.0.1 

donde ninguna de esas sesiones fueron activos, sino más bien histórico y conectado.

15

Hay un archivo especial /etc/ssh/sshrc donde puede poner algunos comandos que se ejecutarán cada vez que alguien se conecte por ssh.Escribí que para usted:

#!/bin/bash 

[email protected] 
monitored_user=root 
monitored_ip=x.x.x.x 

hostname=$(hostname) 

# add a welcome message: 
printf >&2 "\nWelcome on $hostname $USER\n" 

read -d " " ip <<< $SSH_CONNECTION 

[[ $ip == $monitored_ip && $USER == $monitored_user ]] || exit 0 

date=$(date "+%d.%m.%Y %Hh%M") 
reverse=$(dig -x $ip +short) 

mail -s "Connexion of $USER on $hostname" $mail <<EOF 

IP: $ip 
Reverse: $reverse 
Date: $date 
EOF 

poner este script en un archivo, a continuación, poner la ruta completa de la secuencia de comandos en /etc/ssh/sshrc

En man ssh:

/etc/ssh/sshrc : Commands in this file are executed by ssh when the user logs in, just before the user's shell (or command) is started. See the sshd(8) manual page for more information.

+0

Ponga esta secuencia de comandos en un archivo, luego ponga la ruta completa de la secuencia de comandos en '/ etc/ssh/sshrc', porque el archivo sshrc no maneja las pruebas de bash. POST editado en consecuencia. –

+1

Tengo un "Error de sintaxis: redirección inesperada". Línea 12. – Sergey

+0

Tengo el mismo problema que @Sergey. Además, no parece gustarle el '[['. Intenté 'echo $ SHELL' dentro del script para confirmar que era bash. FWIW '[' funciona. Ah, y 'dig' no está instalado. – Sparhawk

0

en Ubuntu pongo un guión en

/etc/profile.d 

y cuando alguien (ssh usuario) iniciar sesión, se envía un correo electrónico a mi correo

#/etc/profile.d/run_on_loggin.sh 
echo $(who i am) | mail -s 'SSH Login Notification' [email protected] 

quiero crear un archivo PHP con smtp, para enviar un correo electrónico con mi correo a mí ... algunas veces hotmail guardado en correo no deseado ...

si tengo el archivo php voy a ejecutar como this ...

si quiero pasar var a presentar php run como this ...

excusa mi Inglés: 3

nota: creo que este orden de marcha del usuario, sea cuidadosamente si el usuario doen't tiene permiso para usar algún comando o enviar un correo electrónico.

Cuestiones relacionadas