Mon entreprise a l'obligation de disposer d'une application serveur en cours d'exécution, accessible à tous les utilisateurs via le terminal PuTTY. Je veux écrire un script Shell selon lequel seul 20 terminaux PuTTY devraient être ouverts. Si le 21ème terminal est ouvert, je souhaite fermer ce terminal immédiatement.
Comment puis-je atteindre cet objectif?
Aidez-moi, s'il vous plaît.
Editez votre /etc/sshd_config
côté serveur et changez la ligne:
#MaxSessions 10
à
MaxSessions 20
Voir man sshd_config
:
MaxSessions
Specifies the maximum number of open Shell, login or subsystem
(e.g. sftp) sessions permitted per network connection. Multiple
sessions may be established by clients that support connection
multiplexing. Setting MaxSessions to 1 will effectively disable
session multiplexing, whereas setting it to 0 will prevent all
Shell, login and subsystem sessions while still permitting for-
warding. The default is 10.
La solution de George fonctionne bien, mais vous avez demandé un script bash ...
Donc, considérez celui-ci pour d'autres situations où il n'y a pas d'option comme MaxSessions
of sshd
, alors vous pouvez utiliser quelque chose comme ceci:
if [ "$(pgrep -cx processName)" -gt 20 ]; then pkill -xn processName; fi;
Quel pkill -n
va tuer la dernière instance de processName
.
La réponse correcte à cette situation particulière est la réponse de George.
J'ai décidé d'élaborer et de tester les Ravexinaidea . Cela fonctionne et est efficace si vous souhaitez limiter le nombre de connexions ssh établies.
En premier lieu, lorsque le démon ssh est en cours d’exécution sans connexion, il existe un processus sshd
. Pour chaque nouvelle connexion, deux nouveaux processus sshd
sont créés. Donc, si vous voulez une limite de 20 connexions, le seuil doit être 41 (1 + 2x20) au lieu de 20.
Ensuite, j'ai créé un fichier exécutable, nommé /usr/local/bin/limit-sshd
, qui se présente comme suit:
#!/bin/sh
if [ "$(pgrep -cx sshd)" -gt 7 ]
then
echo '\nThe limit was reached!\n'
pkill -xn sshd
fi
Enfin, j'ai ajouté la directive suivante à /etc/ssh/sshd_config
:
ForceCommand /usr/local/bin/limit-sshd; $Shell
$Shell
exécutera le shell de l'utilisateur par défaut.Sudo systemctl restart sshd.service
Voici comment cela fonctionne ( cliquez sur l'image pour voir une démonstration animée ):
De plus, j'ai réalisé que nous n'avons pas besoin de tuer quoi que ce soit, si nous modifions le script de cette manière:
#!/bin/sh
if [ "$(pgrep -cx sshd)" -gt 7 ]
then
echo '\nThe limit was reached!\n'
exit # This line is not mandatory
else
eval "$Shell"
fi
Et respectivement /etc/ssh/sshd_config
de cette manière:
ForceCommand /usr/local/bin/limit-sshd
La question n'est pas claire. Laissez-moi d'abord dire comment je le comprends et de quelle manière, à mon avis, il faudrait demander:
Nous avons un réseau local où un serveur fournit une application spécifique. Notre équipe accède à cette application via une connexion ssh de leurs ordinateurs au serveur en utilisant PuTTY. Chaque membre de l'équipe dispose de son propre compte utilisateur utilisé pour établir les connexions SSH (ou peut-être: tous les membres de l'équipe utilisent un compte d'utilisateur commun).
Les membres de l’équipe n’utilisent pas le serveur à d’autres fins et nous souhaitons limiter le nombre de leurs connexions ssh à 20, quel que soit le nombre de connexions encore établies par un utilisateur particulier (ou peut-être: 20 connexions par utilisateur).
Si cette interprétation est correcte, une manière correcte de répondre aux exigences consiste probablement à créer un groupe d'utilisateurs, puis ajoutez tous les comptes d'utilisateurs à ce groupe et limitez le nombre de maxlogins via /etc/security/limits.conf
.
Créez un groupe, appelé par exemple the-app-maxlogins
, avec l'identifiant de groupe 10 000
:
Sudo groupadd -g 10000 the-app-maxlogins
Ajoutez les utilisateurs à ce groupe - Sudo adduser <user> <group>
:
for user in "user1" "user2" "user3"; do Sudo adduser "$user" the-app-maxlogins; done
Ajoutez la ligne suivante à /etc/security/limits.conf
pour limiter le nombre maximal de connexions de du groupe entier :
%the-app-maxlogins - maxlogins 20
Ou ajoutez la ligne suivante à limiter le nombre maximal de connexions par utilisateur du groupe :
@the-app-maxlogins - maxlogins 20
Éditez /etc/ssh/sshd_config
et ajoutez les lignes suivantes au bas (!) Du fichier pour désactiver le multiplexage de session pour ce groupe (ce n'est probablement pas obligatoire dans ce cas):
Match Group the-app-maxlogins
MaxSessions 1
Cette solution limitera le nombre de connexions des utilisateurs affectés, que ce soit via ssh ou tty. Si vous souhaitez l'appliquer à un certain utilisateur, pas à un groupe, ajoutez simplement une ligne comme suit dans limits.conf
ou placez-la dans un fichier .conf
séparé du répertoire /etc/security/limits.d/
:
username - maxlogins 20
Une explication simple de la signification réelle de la directive MaxSessions
est fournie dans cette réponse . La source principale de la réponse actuelle est autre réponse sous la même question de L & U.
Le autre réponse du mien, pourrait fournir une solution de contournement, mais c'est une sorte de plaisir plutôt que de vraie solution.