Bash-Skript zur Begrenzung der Anzahl der Anmeldungen

12

In meinem Unternehmen muss eine Serveranwendung ausgeführt werden, auf die alle Benutzer über ein Putty-Terminal zugreifen. Ich möchte ein Shell-Skript schreiben, bei dem nur 20 Putty-Terminals geöffnet sein sollen. Wenn das 21. Terminal geöffnet ist, möchte ich das Terminal sofort schließen.

Wie kann ich das erreichen?

Bitte hilf mir.

vijay12289
quelle
3
Stellen Sie die maximale Anzahl der Verbindungen, die in SSH auf dem Server im MaxSessionsFeld zugreifen dürfen, auf 20 ein
George Udosen
2
Wenn Ihr Unternehmen eine Richtlinie mit maximal 20 Sitzungen hat und die Standardeinstellung 10 ist (wie in der Antwort mit der höchsten Bewertung angegeben), warum hat Ihr Unternehmen die Anzahl der zulässigen Sitzungen auf mehr als 20 erhöht /etc/sshd_config, oder handelt es sich hierbei um einen Ubuntu-Fehler?
WinEunuuchs2Unix
Wenn das 21. Terminal geöffnet ist, möchte ich das Terminal sofort schließen. Können die ersten 20 Verbindungen den Server unbegrenzt belasten?
Xenoid

Antworten:

24

Bearbeiten Sie Ihre /etc/sshd_configauf dem Server und ändern Sie die Zeile:

#MaxSessions 10

zu

MaxSessions 20

Siehe 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.
George Udosen
quelle
Ja, es funktioniert, etwas spät, um es als Antwort hinzuzufügen.
Donnerstag,
2
Ich wollte SSSH schon seit einiger Zeit auf einem meiner alten Laptops installieren. Sagt die Manpage, dass sich standardmäßig nur 10 Benutzer beim Server anmelden können? Bereits in den 80er Jahren konnten sich hundert Benutzer an einem IBM S / 36-Minicomputer mit 2 MB RAM anmelden.
WinEunuuchs2Unix
2
Sie verwechseln Sitzungen wie in offenen Terminals (siehe OP) mit Sitzungen innerhalb einer SSH-Verbindung. Bei der Einstellung, die Sie erwähnen, handelt es sich um die Anzahl der "Unterverbindungen", die eine einzelne SSH-Verbindung zulässt. Das Ausführen von 30 "ssh" -Befehlen ist also auch mit kein Problem MaxSessions 20. In den Sitzungen, die dort erwähnt werden, geht es um Dinge wie Portweiterleitungen (und sogar um das Öffnen von mehr als einer Shell), die dieselbe Verbindung verwenden, und nicht um die Anzahl der Anmeldungen auf dem System.
Allo
@allo diese Informationen, die Sie von OP haben?
George Udosen
1
@allo ist hier richtig, MaxSessions bezieht sich auf Session-Multiplexing über eine einzelne TCP-Verbindung. Wenn nicht alle Benutzer von OP seltsame Dinge tun, um eine einzelne TCP-Verbindung zum Server freizugeben, wirkt sich diese Beschränkung nicht auf sie aus. Ich habe das gerade selbst überprüft, indem ich ein niedriges MaxSessions-Limit für einen Server festgelegt und mehr als so viele Verbindungen dazu hergestellt habe.
Joe Lee-Moyet
5

Georges Lösung funktioniert einwandfrei, aber Sie haben nach einem Bash-Skript gefragt ...

So halten diese für andere Situationen , in denen es keine Option ist wie MaxSessionsder sshd, dann kann man so etwas wie folgt verwenden:

if [ "$(pgrep -cx processName)" -gt 20 ]; then pkill -xn processName; fi; 

Welches pkill -nwird die neueste Instanz von töten processName.

Die richtige Lösung für diese spezielle Situation ist die Antwort von George.

Ravexina
quelle
Würde dies nicht auch Unterprozesse verhindern?
RonJohn
Ja, es führt auch dazu, dass der Unterprozess beendet wird.
Ravexina
2
Angesichts der Tatsache, dass Bash viele Unterprozesse forkt und Benutzer und nicht Prozesse einschränken möchte, scheint dies keine sinnvolle Antwort zu sein.
RonJohn
1
@RonJohn Dies war eine nützliche Antwort, die den Benutzeranforderungen (Ein Skript, mit dem ein Prozess sofort geschlossen wird) und anderen Benutzern aus Suchmaschinen (eine allgemeine Antwort auf den Titel) entsprach, bis Sie die Frage bearbeitet haben.
Ravexina
Lass mich hier rein kommen. Ich weiß auch, dass dieser Ort Benutzer auf der Grundlage der gestellten Fragen auf den richtigen Weg leitet. Wenn OP eine Frage stellt und die richtige Antwort (basierend auf der Frage von OP) nicht unbedingt die beste Vorgehensweise oder der richtige Ansatz ist, hat meiner Meinung nach jeder das Recht, dies zu erklären oder Antworten im Einklang mit dieser Beobachtung zu geben. Ich denke nicht wirklich, dass wir die Option ergreifen sollten, zu entscheiden, welche Antwort die beste ist. Lassen Sie OP entscheiden, und ich freue mich über viele Optionen von gut informierten Site-Mitgliedern. Bitte lassen Sie uns immer eine konstruktive Debatte führen, es hilft mir, wenn nicht irgendeine andere Person!
George Udosen
4

Ich habe beschlossen , die erarbeiten und testen Ravexina ‚s Idee . Es funktioniert und ist effektiv, wenn Sie die Anzahl der eingerichteten SSH-Verbindungen einschränken möchten.

Zuerst habe ich festgestellt, dass es einen sshdProzess gibt, wenn der ssh-Daemon ohne Verbindung ausgeführt wird . Für jede neue Verbindung werden zwei neue sshdProzesse erstellt. Wenn Sie also ein Limit von 20 Verbindungen wünschen, sollte der Schwellenwert 41 (1 + 2x20) anstelle von 20 sein.

Dann habe ich eine ausführbare Datei mit dem Namen erstellt , die wie folgt aussieht:/usr/local/bin/limit-sshd

#!/bin/sh
if [ "$(pgrep -cx sshd)" -gt 7 ]
then
    echo '\nThe limit was reached!\n'
    pkill -xn sshd
fi
  • Die Schwelle liegt hier bei 7, bzw. es konnten nur 3 Verbindungen hergestellt werden und der Rest wird fallengelassen.

Schließlich habe ich die folgende Direktive hinzugefügt /etc/ssh/sshd_config:

ForceCommand /usr/local/bin/limit-sshd; $SHELL
  • Die Variable $SHELLführt die Shell des Standardbenutzers aus.
  • Ein unerwünschter Effekt ist, dass die Begrüßungsnachricht nicht mehr verfügbar ist.
  • Vergessen Sie nicht, den ssh-Daemon neu zu starten: sudo systemctl restart sshd.service

So funktioniert das ( klicken Sie auf das Bild, um eine animierte Demo zu sehen ):

Bildbeschreibung hier eingeben

Außerdem wurde mir klar, dass wir nichts töten müssen, wenn wir das Skript auf diese Weise ändern:

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

Und jeweils /etc/ssh/sshd_configauf diese Weise:

ForceCommand /usr/local/bin/limit-sshd
pa4080
quelle
2

Die Frage ist nicht klar. Lassen Sie mich zuerst sagen, wie ich es verstehe und auf welche Weise, IMO, gefragt werden sollte:

Wir haben ein lokales Netzwerk, in dem ein Server eine bestimmte Anwendung bereitstellt. Unser Team greift mithilfe von PuTTY über eine SSH-Verbindung von seinen Computern auf den Server zu. Jedes Teammitglied verfügt über ein eigenes Benutzerkonto, mit dem die SSH-Verbindungen hergestellt werden ( oder: Alle Teammitglieder verwenden ein gemeinsames Benutzerkonto).

Die Teammitglieder nutzen den Server nicht für andere Zwecke und wir möchten die Anzahl ihrer SSH-Verbindungen auf 20 begrenzen, unabhängig davon, wie viele Verbindungen ein bestimmter Benutzer noch herstellt ( oder vielleicht: 20 Verbindungen pro Benutzer).

Wenn diese Interpretation korrekt ist, ist es wahrscheinlich eine richtige Möglichkeit, die Anforderungen zu erfüllen, eine Benutzergruppe zu erstellen , dann alle Benutzerkonten zu dieser Gruppe hinzuzufügen und die Anzahl der maxlogins über zu begrenzen/etc/security/limits.conf .

  1. Erstellen Sie eine Gruppe, die beispielsweise the-app-maxloginsmit der folgenden Gruppen-ID aufgerufen wird 10 000:

    sudo groupadd -g 10000 the-app-maxlogins
  2. Fügen Sie die Benutzer dieser Gruppe hinzu - sudo adduser <user> <group>:

    for user in "user1" "user2" "user3"; do sudo adduser "$user" the-app-maxlogins; done
  3. Fügen Sie die nächste Zeile hinzu, um die maximalen Anmeldungen der gesamten Gruppe/etc/security/limits.conf zu begrenzen :

    %the-app-maxlogins      -       maxlogins       20

    Oder fügen Sie die folgende Zeile hinzu, um die maximale Anzahl der Anmeldungen pro Benutzer der Gruppe zu begrenzen :

    @the-app-maxlogins      -       maxlogins       20
  4. Bearbeiten /etc/ssh/sshd_configSie die folgenden Zeilen und fügen Sie sie am Ende (!) Der Datei hinzu, um das Sitzungsmultiplexing für diese Gruppe zu deaktivieren (dies ist in diesem Fall möglicherweise nicht erforderlich):

    Match Group the-app-maxlogins
        MaxSessions 1

Diese Lösung begrenzt die Anzahl der Anmeldungen der betroffenen Benutzer, unabhängig von ssh oder tty. Wenn Sie es für einen bestimmten Benutzer und nicht für eine Gruppe anwenden möchten, fügen Sie einfach eine Zeile wie folgt hinzu limits.confoder platzieren Sie sie in einer separaten .confDatei im Verzeichnis /etc/security/limits.d/:

username      -       maxlogins       20

MaxSessionsIn dieser Antwort finden Sie eine einfache Erklärung der tatsächlichen Bedeutung der Richtlinie . Die Hauptquelle für die aktuelle Antwort ist eine andere Antwort unter derselben Frage von L & U.

Die andere Antwort von mir könnte auf irgendeine Weise Abhilfe schaffen, aber es ist eher eine Art Spaß als eine echte Lösung.

pa4080
quelle