Ejecutar script (sistema) en el inicio de sesión SSH y / o cierre de sesión


12

Me gustaría que mi servidor OpenSSH inicie un script cada vez que un usuario inicie sesión con SSH, idealmente pasando el nombre de host o IP, así como el nombre de usuario. Además, me gustaría ejecutar un script cada vez que finalice una sesión (pasando el nombre de usuario). Estos scripts no deben ejecutarse en la sesión del usuario, sino en todo el sistema.

La idea es dar una advertencia de audio al iniciar y cerrar sesión, por ejemplo espeak, usando , y para mostrar la información en una pantalla externa.

He visto que hay un pam-scriptspaquete pero no estoy seguro si hace lo que quiero, ni cómo usarlo.

Respuestas:


10

Puede forzar un comando en sus usuarios SSH en lugar del que solicitan (o su shell si no dan un comando específico). Esto se puede hacer especificando ese comando con algo como ForceCommand /root/ssh-wrapperen /etc/ssh/sshd_config(no importa dónde se encuentre el script o cómo se llama, solo asegúrese de que sea ejecutable por todos los usuarios y que el archivo de configuración sshd lo señale). También necesita reiniciar / recargar sshd. El comando original es accesible para el comando forzado como $SSH_ORIGINAL_COMMAND.

Acabo de hackear este script juntos:

#! /bin/sh

# add logger options when needed
log="logger -t ssh-wrapper"

# find IP address
ip=`echo $SSH_CONNECTION | cut -d " " -f 1`

$log $USER login from $ip
espeak "$USER just logged in from $ip" > /dev/null 2>&1

$log command: ${SSH_ORIGINAL_COMMAND:-shell}
${SSH_ORIGINAL_COMMAND:-shell}

$log $USER logout
espeak "$USER just logged out" > /dev/null 2>&1

Ahora, cada vez que inicio o cierre sesión, una voz me informa al respecto y una entrada de registro se escribe en syslog. También registra el comando. Puede usar algo como lo siguiente para "seguir" su uso de sshd:

tailf /var/log/syslog | grep ssh-wrapper

Tenga en cuenta que este script no se ha probado en su mayoría, ¡así que úselo bajo su propio riesgo! ;-)

PD: recuerde que este script se ejecuta como el usuario que inició sesión, por lo que no puede hacer todo lo que quiera si lo cambia para agregar más funciones ...


Hola, ¿Hay alguna forma de detectar una situación cuando el usuario acaba de cerrar la ventana con el cliente ssh? Su guión no engancha esta situación. Gracias.
Dmitry Eskin

En shell$ {SSH_ORIGINAL_COMMENT: -shell} debe reemplazarse con la ruta real al shell, por ejemplo. / bin / bash? Cuando solo trato de ejecutar eso, se queja de que no existe un comando como shell. En realidad, supongo que quizás lo que quisiste decir es $ SHELL? Eso debería ejecutar el shell especificado del usuario.
Ibrahim

1

He visto estos eventos coincidentes en el archivo de registro antes (lo que le permitiría flexibilidad para hacer coincidir cualquier cosa). Esta página está mal formateada pero podría ayudarlo a comenzar: https://help.ubuntu.com/community/AudibleLogs#Play with esound


Creo que te refieres en espeaklugar de esound?
JanC

0

(Respuesta cruzada de la misma pregunta en ServerFault )

Simplemente escriba un script para hacer lo que quiera y luego péguelo /etc/profileo posiblemente /etc/bash.bashrcsegún sus necesidades. Los cambios en esos archivos se aplicarán a todos los usuarios. Sin embargo, no estoy seguro de cómo haría para notificar al cerrar sesión con este enfoque.

Alternativamente, otra forma de hacer esto sería tener un simple monitoreo de daemon /var/log/authpara nuevas (y cerrando) sesiones ssh. De esa manera, podría enviar notificaciones tanto al iniciar sesión como al cerrar sesión.


0

Puede usar sshrc (man sshd, buscar sshrc)

ssh ejecutará / etc / ssh / sshrc si existe y puede ejecutar un script (o llamar a múltiples scripts) desde allí

puede llamar a cualquier variable bash, como $USERu obtener la IP a través de

read -d " " ip <<< $SSH_CONNECTION

puedes escribir un script para probar o registrar lo que quieras.

Cerrar sesión script ... bueno, eso es lo que estoy buscando! :RE


0

Creo que PAM es la mejor opción. Es todo el sistema y no puede ser anulado por los archivos de configuración del usuario.

Puedes seguir estos pasos. Trabajaron para mí en Ubuntu 14.04.4 LTS.

Correr:

$ sudo pico /opt/custom/bin/info-session.sh

Edite ese archivo vacío y agregue estas líneas:

#!/bin/sh

[ "$PAM_TYPE" = "open_session" ] || exit 0

INFO=$(date +"%Y/%m/%d %T $PAM_USER ($PAM_RHOST) $PAM_SERVICE $PAM_TTY") # You can customize message.

echo "PAM access: $INFO" | write user > /dev/null 2>&1 # See Note 1.

exit 0

Después de eso, otorgue permiso de ejecución al script:

$ sudo chmod ugo+x /opt/custom/bin/info-session.sh

Ahora ejecuta:

$ sudo pico /etc/pam.d/common-session

Agregue estas líneas al final del archivo:

# Modified by user:
session optional pam_exec.so /opt/custom/bin/info-session.sh

No hay necesidad de reiniciar ningún servicio. Tenga en cuenta que este script también se ejecutará cuando un usuario inicie sesión desde la terminal en lugar de SSH.

Nota 1: puede canalizar espeako cualquier otro proceso que se ajuste a sus necesidades (correo electrónico, notificación automática, etc.). Si usa writey el usuario ha iniciado sesión, verá mensajes de salida directamente en su terminal.

Referencias:
https://blog.stalkr.net/2010/11/login-notifications-pamexec-scripting.html
https://blog.redbranch.net/2014/06/04/pam_exec-so-execute-commands-on -inicio de sesión de usuario/

Relacionado:
¿Cómo configuro una alerta de correo electrónico cuando un inicio de sesión ssh es exitoso?
/server/400613/how-can-i-configure-my-server-to-notify-me-whenever-it-is-remotely-accessed-via
/server//questions / 395393 / email-notify-about-each-ssh-connection-to-linux-server

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.