Exécuter un script (système) lors de la connexion et / ou de la déconnexion SSH


12

J'aimerais que mon serveur OpenSSH démarre un script chaque fois qu'un utilisateur se connecte en utilisant SSH, en passant idéalement le nom d'hôte ou l'IP, ainsi que le nom d'utilisateur. De plus, j'aimerais qu'il exécute un script, chaque fois qu'une session se termine (en passant le nom d'utilisateur). Ces scripts ne doivent pas s'exécuter dans la session de l'utilisateur, mais à l'échelle du système.

L'idée est de donner un avertissement sonore lors de la connexion et de la déconnexion, par exemple en utilisant espeak, et d'afficher les informations sur un écran externe.

J'ai vu qu'il y a un pam-scriptspaquet mais je ne sais pas si cela fait ce que je veux, ni comment l'utiliser.

Réponses:


10

Vous pouvez forcer une commande sur vos utilisateurs SSH au lieu de celle qu'ils demandent (ou sur leur shell s'ils ne donnent pas de commande spécifique). Cela peut être fait en spécifiant cette commande avec quelque chose comme ForceCommand /root/ssh-wrapperdans /etc/ssh/sshd_config(peu importe où se trouve le script ou comment il est nommé, assurez-vous simplement qu'elle est exécutable par tous les utilisateurs et que le fichier de configuration sshd pointe dessus). Vous devez également redémarrer / recharger sshd. La commande d'origine est accessible à la commande forcée en tant que $SSH_ORIGINAL_COMMAND.

Je viens de pirater ce script ensemble:

#! /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

Maintenant, chaque fois que je me connecte ou me déconnecte, une voix m'en parle et une entrée de journal est écrite dans syslog. Il enregistre également la commande. Vous pouvez utiliser quelque chose comme ce qui suit pour "suivre" votre utilisation de sshd:

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

Veuillez noter que ce script n'est pour la plupart pas testé, alors utilisez-le à vos risques et périls! ;-)

PS: n'oubliez pas que ce script est exécuté en tant qu'utilisateur connecté, vous ne pouvez donc pas faire tout ce que vous voulez si vous le changez pour ajouter plus de fonctionnalités ...


Salut, Existe-t-il un moyen de détecter la situation lorsque l'utilisateur vient de fermer la fenêtre avec le client ssh. Votre script n'accroche pas cette situation .. Merci.
Dmitry Eskin

Devrait shelldans $ {SSH_ORIGINAL_COMMENT: -shell} être remplacé par le chemin réel vers le shell, par exemple. / bin / bash? Quand j'essaye juste de lancer ça, il se plaint qu'il n'y a pas de commande comme shell. En fait, je suppose que vous vouliez peut-être dire $ SHELL? Cela devrait exécuter le shell spécifié par l'utilisateur.
Ibrahim


0

(Réponse croisée de la même question sur ServerFault )

Il suffit d'écrire un script pour faire ce que vous voulez, puis de le coller /etc/profileou éventuellement en /etc/bash.bashrcfonction de vos besoins. Les modifications apportées à ces fichiers s'appliqueront à tous les utilisateurs. Cependant, je ne sais pas comment vous vous y prendrez pour notifier votre déconnexion avec cette approche.

Alternativement, une autre façon de faire serait d'avoir un simple contrôle de démon /var/log/authpour les nouvelles sessions (et fermant) ssh. De cette façon, il pourrait envoyer des notifications sur la connexion et la déconnexion.


0

Vous pouvez utiliser le sshrc (man sshd, rechercher sshrc)

ssh exécutera le fichier / etc / ssh / sshrc s'il existe et vous pouvez exécuter un script (ou appeler plusieurs scripts) à partir de là

vous pouvez appeler n'importe quelle variable bash, comme $USERou obtenir l'IP via

read -d " " ip <<< $SSH_CONNECTION

vous pouvez écrire un script pour tester ou enregistrer ce que vous voulez.

Script de déconnexion ... eh bien, c'est ce que je recherche! :RÉ


0

Je pense que PAM est la meilleure option. Il est à l'échelle du système et ne peut pas être remplacé par les fichiers de configuration de l'utilisateur.

Vous pouvez suivre ces étapes. Ils ont travaillé pour moi sur Ubuntu 14.04.4 LTS.

Courir:

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

Modifiez ce fichier vide et ajoutez ces lignes:

#!/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

Après cela, accordez l'autorisation d'exécution au script:

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

Maintenant, exécutez:

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

Ajoutez ces lignes à la fin du fichier:

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

Il n'est pas nécessaire de redémarrer un service. Notez que ce script sera également exécuté lorsqu'un utilisateur se connecte à partir du terminal au lieu de SSH.

Remarque 1: vous pouvez diriger vers espeakou tout autre processus qui correspond à vos besoins (e-mail, notification push, etc.). Si vous utilisez writeet que l' utilisateur est connecté, il verra les messages de sortie directement sur son terminal.

Références:
https://blog.stalkr.net/2010/11/login-notifications-pamexec-scripting.html
https://blog.redbranch.net/2014/06/04/pam_exec-so-execute-commands-on -Utilisateur en ligne/

Connexe:
Comment configurer une alerte e-mail lorsqu'une connexion ssh réussit?
/server/400613/how-can-i-configure-my-server-to-notify-me-whenever-it-is-remotely-accessed-via
/server//questions / 395393 / email-notification-about-each-ssh-connection-to-linux-server

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.