लॉगिन की संख्या को सीमित करने के लिए स्क्रिप्ट को बैश करें


12

मेरी कंपनी की आवश्यकता है कि मेरे पास एक सर्वर एप्लिकेशन चल रहा है, जिसे सभी उपयोगकर्ता पोटीन टर्मिनल के माध्यम से एक्सेस कर रहे हैं। मैं एक शेल स्क्रिप्ट लिखना चाहता हूं कि केवल 20 पोटीन टर्मिनल खुला होना चाहिए। अगर 21 वां टर्मिनल खुला तो मैं तुरंत उस टर्मिनल को बंद करना चाहता हूं।

इसे कैसे प्राप्त किया जा सकता है?

क्रिप्या मेरि सहायता करे।


3
MaxSessionsक्षेत्र में सर्वर पर 20 से ssh में अधिकतम संख्या कनेक्शन की अनुमति दें
जॉर्ज उडोसन

2
यदि आपके निगम में 20 अधिकतम सत्रों की नीति है और डिफ़ॉल्ट 10 है (जैसा कि उच्चतम मतदान जवाब कहता है), तो आपकी कंपनी ने स्वीकार्य सत्रों की संख्या> 20 इंच क्यों बढ़ाई /etc/sshd_config, या यह एक उबंटू बग है?
विनयुनुच्स 2 यूनिक्स

अगर 21 वां टर्मिनल खुला है तो मैं तुरंत उस टर्मिनल को बंद करना चाहता हूं ताकि 20 पहले कनेक्शन अनिश्चित काल के लिए सर्वर को हॉग कर सकें?
xenoid

जवाबों:


24

/etc/sshd_configसर्वर साइड पर अपना संपादन करें और लाइन बदलें:

#MaxSessions 10

सेवा

MaxSessions 20

देखें 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.

हाँ इसके काम करता है, उत्तर के रूप में इसे जोड़ने के लिए थोड़ा देर हो चुकी है।
r --dʒɑ

2
मैं अब पुराने समय के लिए अपने पुराने लैपटॉप में से एक पर SSSH चीज़ को सेटअप करने के लिए अर्थ रखता हूं। क्या मैन पेज यह कह रहा है कि डिफ़ॉल्ट रूप से केवल 10 उपयोगकर्ता ही सर्वर में प्रवेश कर सकते हैं? यहां तक ​​कि 80 के दशक में भी हम 2 एमबी रैम के साथ आईबीएम एस / 36 मिनी-कंप्यूटर में सौ उपयोगकर्ता साइन कर सकते थे।
WinEunuuchs2Unix

2
आप SSH कनेक्शन के अंदर सत्रों के साथ सत्रों को खुले टर्मिनलों (ओपी देखें) के रूप में भ्रमित कर रहे हैं। आपके द्वारा उल्लेखित सेटिंग एक एकल ssh-कनेक्शन द्वारा कितने "उप-कनेक्शन" की अनुमति है। इसलिए 30 "ssh" कमांड चलाने से भी कोई समस्या नहीं है MaxSessions 20। वर्णित सत्र पोर्ट-फ़ॉरवर्डिंग (और यहां तक ​​कि एक से अधिक शेल के खुले होने) जैसी चीज़ों के बारे में हैं, एक ही कनेक्शन का उपयोग करके, सिस्टम पर लॉगिन की संख्या के बारे में नहीं।
allo

@ यह जानकारी आपको ओपी से मिली?
जॉर्ज उडेन

1
@allo यहाँ सही है, MaxSession एक एकल टीसीपी कनेक्शन पर सत्र मल्टीप्लेक्सिंग को संदर्भित करता है। जब तक ओपी के सभी उपयोगकर्ता सर्वर से एकल टीसीपी कनेक्शन साझा करने के लिए अजीब चीजें कर रहे हैं, यह सीमा उन्हें प्रभावित नहीं करेगी। मैंने अभी एक सर्वर पर कम MaxSession सीमा निर्धारित करके और उससे कई कनेक्शनों से अधिक खोलने के द्वारा इसे स्वयं सत्यापित किया है।
जो ली-मोयेट

5

जॉर्ज का समाधान ठीक काम करता है लेकिन आपने बैश स्क्रिप्ट के लिए कहा ...

तो अन्य स्थितियों के लिए इस पर विचार करें जब कोई विकल्प नहीं MaxSessionsहै sshd, तो आप इस तरह से कुछ का उपयोग कर सकते हैं:

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

जो pkill -nनवीनतम उदाहरण को मार देगा processName

इस विशेष स्थिति के लिए सही समाधान जॉर्ज का जवाब है।


क्या यह सबप्रोसेस को भी नहीं रोक पाएगा?
रॉनजॉन

हाँ, यह उप-प्रक्रिया को भी मारे जाने का कारण बनता है।
रवेक्सिना

2
तब - उस बैश को बहुत सारे उपप्रकार दिए गए हैं, और वे उपयोगकर्ताओं को सीमित करना चाहते हैं, प्रक्रियाओं को नहीं - यह एक उपयोगी उत्तर प्रतीत नहीं होता है।
रॉनजॉन

1
@RonJohn यह उपयोगकर्ता की आवश्यकताओं (तुरंत एक प्रक्रिया को बंद करने वाली एक स्क्रिप्ट) और खोज इंजन (शीर्षक का एक सामान्य उत्तर) से आने वाले अन्य उपयोगकर्ताओं के लिए एक उपयोगी उत्तर था, जब तक कि आपने प्रश्न को संपादित नहीं किया।
रवेक्सिना

मुझे अंदर आने दो। मुझे यह भी पता है कि यह जगह उपयोगकर्ताओं को पूछे गए सवालों के आधार पर सही रास्ते पर ले जाती है। यदि ओपी एक प्रश्न पूछता है और सही उत्तर (ओपी के प्रश्न के आधार पर) जरूरी नहीं कि सबसे अच्छा अभ्यास या सही दृष्टिकोण है, तो मुझे लगता है कि किसी को भी यह बताने का अधिकार है या उस अवलोकन के साथ उत्तर दें। मुझे नहीं लगता कि हमें यह निर्णय लेने का विकल्प लेना चाहिए कि ओपी क्या निर्णय लेता है और मुझे अच्छी तरह से सूचित साइट के सदस्यों के कई विकल्पों को देखना अच्छा लगता है। कृपया कोई रचनात्मक बहस करें, इससे मुझे मदद मिलती है अगर किसी अन्य व्यक्ति को नहीं!
जॉर्ज उडेन

4

मैंने रवेक्सिना के विचार को विस्तृत और परखने का फैसला किया है । यह काम करता है और यह प्रभावी है यदि आप सभी स्थापित ssh कनेक्शन की संख्या को प्रतिबंधित करना चाहते हैं।

पहले मैंने पाया कि जब ssh डेमन बिना किसी कनेक्शन के चल रहा है तो एक sshdप्रक्रिया है। प्रत्येक नए कनेक्शन के लिए दो नई sshdप्रक्रियाएं बनाई जाती हैं। इसलिए यदि आप 20 कनेक्शन की सीमा चाहते हैं, तो सीमा 20 की बजाय 41 (1 + 2x20) होनी चाहिए ।

फिर मैंने एक निष्पादन योग्य फ़ाइल बनाई है, जिसका नाम है , जो इस प्रकार है:/usr/local/bin/limit-sshd

#!/bin/sh
if [ "$(pgrep -cx sshd)" -gt 7 ]
then
    echo '\nThe limit was reached!\n'
    pkill -xn sshd
fi
  • यहां दहलीज 7 है, क्रमशः 3 कनेक्शन स्थापित किए जा सकते हैं और बाकी को गिरा दिया जाएगा।

अंत में मैंने निम्नलिखित निर्देश जोड़ा है /etc/ssh/sshd_config:

ForceCommand /usr/local/bin/limit-sshd; $SHELL
  • चर $SHELLडिफ़ॉल्ट उपयोगकर्ता के शेल को निष्पादित करेगा।
  • एक अवांछित प्रभाव यह है कि अभिवादन संदेश अब उपलब्ध नहीं है।
  • Ssh डेमॉन को फिर से शुरू करने के लिए मत भूलना: sudo systemctl restart sshd.service

यहाँ बताया गया है कि यह कैसे काम करता है ( एक एनिमेटेड डेमो देखने के लिए चित्र पर क्लिक करें ):

यहाँ छवि विवरण दर्ज करें

इसके अलावा, मुझे एहसास हुआ कि हमें कुछ भी मारने की ज़रूरत नहीं है, अगर हम स्क्रिप्ट को इस तरह से संशोधित करते हैं:

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

और क्रमशः /etc/ssh/sshd_configइस तरह से:

ForceCommand /usr/local/bin/limit-sshd

2

प्रश्न स्पष्ट नहीं है। मुझे पहले बताएं कि मैं इसे कैसे समझता हूं और किस तरह से, आईएमओ, यह पूछा जाना चाहिए:

हमारे पास स्थानीय नेटवर्क है जहां एक सर्वर एक विशिष्ट एप्लिकेशन की आपूर्ति करता है। हमारी टीम PuTTY का उपयोग करके अपने कंप्यूटर से सर्वर पर ssh कनेक्शन के माध्यम से इस एप्लिकेशन को एक्सेस करती है। प्रत्येक टीम के सदस्य का अपना उपयोगकर्ता खाता है जो ssh कनेक्शन स्थापित करने के लिए उपयोग किया जाता है ( या हो सकता है: सभी टीम के सदस्य एक सामान्य उपयोगकर्ता खाते का उपयोग करें)।

टीम के सदस्य किसी भी अन्य उद्देश्यों के लिए सर्वर का उपयोग नहीं करते हैं और हम उनके ssh कनेक्शनों की संख्या को 20 तक सीमित करना चाहते हैं, फिर भी किसी विशेष उपयोगकर्ता द्वारा अभी तक कितने कनेक्शन स्थापित किए गए हैं ( या हो सकता है: प्रति उपयोगकर्ता 20 कनेक्शन)।

यदि वह व्याख्या सही है, तो आवश्यकताओं को पूरा करने का एक सही तरीका उपयोगकर्ता समूह बनाना है , फिर सभी उपयोगकर्ता खातों को उस समूह में जोड़ें और अधिकतम के माध्यम से अधिकतम संख्या को सीमित करें /etc/security/limits.conf

  1. समूह बनाएं, उदाहरण के लिए the-app-maxlogins, समूह आईडी के साथ 10 000:

    sudo groupadd -g 10000 the-app-maxlogins
  2. उपयोगकर्ताओं को उस समूह में जोड़ें - sudo adduser <user> <group>:

    for user in "user1" "user2" "user3"; do sudo adduser "$user" the-app-maxlogins; done
  3. संपूर्ण समूह के मैकलॉग /etc/security/limits.confको सीमित करने के लिए अगली पंक्ति जोड़ें :

    %the-app-maxlogins      -       maxlogins       20

    या समूह के प्रति उपयोगकर्ता अधिकतम लॉगिन संख्या को सीमित करने के लिए निम्नलिखित पंक्ति जोड़ें :

    @the-app-maxlogins      -       maxlogins       20
  4. /etc/ssh/sshd_configउस समूह के लिए सत्र मल्टीप्लेक्सिंग को अक्षम करने के लिए फ़ाइल के नीचे (!) को निम्न पंक्तियों को संपादित करें और जोड़ें (शायद यह उस मामले में अनिवार्य नहीं है):

    Match Group the-app-maxlogins
        MaxSessions 1

यह समाधान प्रभावित उपयोगकर्ताओं की संख्या को ssh या tty के माध्यम से सीमित करेगा। यदि आप इसे एक निश्चित उपयोगकर्ता के लिए लागू करना चाहते हैं, तो समूह के लिए नहीं, बस इसके अनुसरण के रूप में एक पंक्ति जोड़ें limits.confया इसे अलग .confफ़ाइल में निर्देशिका में रखें /etc/security/limits.d/:

username      -       maxlogins       20

निर्देश के वास्तविक अर्थ की सरल व्याख्या इस उत्तरMaxSessions में प्रदान की गई है । वर्तमान उत्तर का मुख्य स्रोत उसी L & U के प्रश्न के तहत एक और उत्तर है

अन्य जवाब मेरा, किसी तरह से वैकल्पिक हल प्रदान कर सकता है, लेकिन यह करने के बजाय सही समाधान मज़ा की तरह है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.