Giriş sayısını sınırlamak için Bash betiği


12

Şirketim, tüm kullanıcıların macun terminali üzerinden eriştiği bir sunucu uygulamasının çalışmasını gerektiriyor. Ben sadece 20 macun terminal açık olması gereken bir kabuk komut dosyası yazmak istiyorum. 21. terminal açıksa, o terminali hemen kapatmak istiyorum.

Bunu nasıl başarabilirim?

Lütfen bana yardım et.


3
Maksimum sayı bağlantıları içinde sunucuda 20 ssh izin erişimi Set MaxSessionsalanında
George Udosen

2
Şirketinizin maksimum 20 oturum politikası varsa ve varsayılanı 10'dur (en yüksek oy verilen cevabın söylediği gibi), şirketiniz neden izin verilen oturum sayısını> 20'den fazla artırdı /etc/sshd_configveya bu bir Ubuntu hatası mı?
WinEunuuchs2Unix

Eğer 21'inci terminal açıksa, o terminali hemen kapatmak istiyorum. Yani ilk 20 bağlantı sunucuyu süresiz olarak kullanabilir mi?
xenoid

Yanıtlar:


24

Düzenlemenizle /etc/sshd_configsunucu tarafında ve satırı değiştirin:

#MaxSessions 10

için

MaxSessions 20

Bakınız 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.

evet onun işleri, cevap olarak eklemek için biraz geç.
rɑːdʒɑ

2
Bir süredir eski dizüstü bilgisayarlarımdan birinde SSSH şeyleri kurmayı kastediyorum. Man sayfası varsayılan olarak sunucuda yalnızca 10 kullanıcının oturum açabileceğini mi söylüyor? 80'lerde bile yüz kullanıcının 2 MB RAM ile IBM S / 36 mini bilgisayarda oturum açmasını sağlayabilirdik.
WinEunuuchs2Unix

2
Oturumları açık terminallerde olduğu gibi (bkz. OP) bir SSH bağlantısı içindeki oturumlarla karıştırıyorsunuz. Bahsettiğiniz ayar, tek bir ssh bağlantısı tarafından kaç "alt bağlantıya" izin verildiğidir. Yani 30 "ssh" komutu çalıştırmak bile sorun değil MaxSessions 20. Bahsedilen oturumlar, aynı bağlantıyı kullanarak port yönlendirmeleri (ve hatta birden fazla kabuğun açık olması) hakkında, sistemdeki oturum açma sayısı hakkında değil.
allo

@allo bu bilgiyi OP'den aldınız mı?
George Udosen

1
@allo burada doğrudur, MaxSessions tek bir TCP bağlantısı üzerinden oturum çoğullamasını ifade eder. Tüm OP kullanıcıları sunucuya tek bir TCP bağlantısını paylaşmak için garip şeyler yapmadığı sürece bu sınır onları etkilemez. Bir sunucuda düşük bir MaxSessions sınırı belirleyerek ve ona bu kadar çok bağlantı açarak bunu kendim doğruladım.
Joe Lee-Moyet

5

George'un çözümü iyi çalışıyor ancak bash senaryosu istediniz ...

Gibi bir seçenek varken Yani diğer durumlar için bu bir düşünün MaxSessionsait sshd, o zaman böyle bir şey kullanabilirsiniz:

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

Hangi pkill -nen yeni örneğini öldürecek processName.

Bu özel durum için doğru çözüm George'un cevabıdır.


Bu aynı zamanda alt işlemleri de engellemez mi?
RonJohn

Evet, alt sürecin de öldürülmesine neden oluyor.
Ravexina

2
Daha sonra - bash çok sayıda alt süreci çatallar ve süreçleri değil, kullanıcıları sınırlamak istedikleri için - bu yararlı bir cevap gibi görünmüyor.
RonJohn

1
@RonJohn Siz soruyu düzenleyene kadar, kullanıcı gereksinimlerine (hemen bir işlemi kapatan bir komut dosyası) ve arama motorlarından gelen diğer kullanıcılar (başlığa genel bir cevap) için yararlı bir cevaptı.
Ravexina

Buraya gelmeme izin ver. Ayrıca, buranın, sorulan soruları temel alarak kullanıcıları doğru yola yönlendirdiğini de biliyorum. OP bir soru sorarsa ve doğru cevap (OP'nin sorusuna dayanarak) mutlaka en iyi uygulama veya doğru yaklaşım değilse, bence herhangi birinin bunu ifade etme veya bu gözlemle birlikte cevap verme hakkı vardır. OP'nin karar vermesine izin vermek için hangi cevabın en iyi olduğuna karar verme seçeneğini almamız gerektiğini düşünmüyorum ve iyi bilgilendirilmiş site üyelerinden birçok seçenek görmeyi çok seviyorum. Lütfen başka bir insan olmasa bile bana yardımcı olan yapıcı bir tartışma yapalım!
George Udosen

4

Ben ayrıntılı ve test etmeye karar verdik Ravexina 'ın fikrini . Çalışır ve kurulan ssh bağlantılarının sayısını kısıtlamak istiyorsanız etkilidir.

İlk olarak ssh arka plan programı herhangi bir bağlantı olmadan çalışırken buldum bir sshdişlem var. Her yeni bağlantı için iki yeni sshdişlem oluşturulur. Dolayısıyla 20 bağlantı sınırı istiyorsanız eşik 20 yerine 41 (1 + 2x20) olmalıdır .

Sonra , aşağıdaki gibi görünen, yürütülebilir bir dosya oluşturdum :/usr/local/bin/limit-sshd

#!/bin/sh
if [ "$(pgrep -cx sshd)" -gt 7 ]
then
    echo '\nThe limit was reached!\n'
    pkill -xn sshd
fi
  • Buradaki eşik 7'dir, sırasıyla sadece 3 bağlantı kurulabilir ve geri kalanı kesilecektir.

Sonunda aşağıdaki yönergeyi ekledim /etc/ssh/sshd_config:

ForceCommand /usr/local/bin/limit-sshd; $SHELL
  • Değişken $SHELL, varsayılan kullanıcının kabuğunu yürütür.
  • İstenmeyen bir etki, karşılama iletisinin artık kullanılamamasıdır.
  • Ssh arka plan programını yeniden başlatmayı unutmayın: sudo systemctl restart sshd.service

İşte böyle çalışır ( animasyonlu bir demo görmek için resme tıklayın ):

resim açıklamasını buraya girin

Ayrıca, betiği bu şekilde değiştirirsek, hiçbir şeyi öldürmemize gerek olmadığını fark ettim:

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

Sırasıyla /etc/ssh/sshd_configbu şekilde:

ForceCommand /usr/local/bin/limit-sshd

2

Soru net değil. Önce bunu nasıl anladığımı ve IMO'nun hangi şekilde sorulması gerektiğini söyleyeyim:

Bir sunucunun belirli bir uygulamayı sağladığı yerel ağımız var. Ekibimiz PuTTY kullanarak bilgisayarlarından sunucuya ssh bağlantısı ile bu uygulamaya erişir. Her ekip üyesinin ssh bağlantılarını kurmak için kullanılan kendi kullanıcı hesabı vardır ( veya belki de: tüm ekip üyeleri ortak bir kullanıcı hesabı kullanır).

Ekip üyeleri sunucuyu başka amaçlarla kullanmazlar ve ssh bağlantılarının sayısını, belirli bir kullanıcı tarafından henüz ne kadar bağlantı kurulduğuna bakılmaksızın ( veya belki de kullanıcı başına 20 bağlantı) sınırlamak istiyoruz .

Bu yorumun doğru ise, şartları yerine getirmek için muhtemelen doğru yolu oluşturmaktır kullanıcı grubu daha sonra bu gruba tüm kullanıcı hesaplarını eklemek ve sayısını sınırlamak maxlogins üzeri /etc/security/limits.conf.

  1. Örneğin the-app-maxlogins, grup kimliğiyle çağrılan bir grup oluşturun 10 000:

    sudo groupadd -g 10000 the-app-maxlogins
  2. Kullanıcıları bu gruba ekleyin sudo adduser <user> <group>:

    for user in "user1" "user2" "user3"; do sudo adduser "$user" the-app-maxlogins; done
  3. Yanındaki satırı ekleyin /etc/security/limits.confetmek sınırlamak ait maxlogins grubun tamamı :

    %the-app-maxlogins      -       maxlogins       20

    Veya grubun kullanıcısı başına maksimum giriş sayısını sınırlamak için aşağıdaki satırı ekleyin :

    @the-app-maxlogins      -       maxlogins       20
  4. /etc/ssh/sshd_configSöz konusu grup için oturum çoğullamasını devre dışı bırakmak için aşağıdaki satırları dosyanın altına (!) Düzenleyin ve ekleyin (muhtemelen bu durumda zorunlu değildir):

    Match Group the-app-maxlogins
        MaxSessions 1

Bu çözüm, ssh veya tty aracılığıyla olursa olsun etkilenen kullanıcıların oturum açma sayısını sınırlayacaktır. Bir grup için değil, belirli bir kullanıcı için uygulamak istiyorsanız, aşağıdaki gibi bir satır ekleyin limits.confveya .confdizinde ayrı bir dosyaya yerleştirin /etc/security/limits.d/:

username      -       maxlogins       20

Direktifin gerçek anlamının Basit açıklama MaxSessionssağlanır Bu yanıt . Mevcut cevabın ana kaynağı aynı L & U'nun sorusu altındaki başka bir cevaptır .

Benim diğer cevabım , bir şekilde geçici çözüm sağlayabilirdi, ama gerçek bir çözümden ziyade eğlenceli bir şey.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.