ログイン数を制限するBashスクリプト


12

私の会社には、1つのサーバーアプリケーションを実行するという要件があり、すべてのユーザーがパテ端末を介してそれにアクセスしています。20個のパテ端末のみを開くシェルスクリプトを記述したいと思います。21番目の端末が開いている場合、その端末をすぐに閉じたいと思います。

どうすればこれを達成できますか?

私を助けてください。


3
MaxSessionsフィールドのサーバーでsshのアクセスを許可する最大接続数を20に設定します
ジョージウドセン

2
会社のポリシーが最大セッション数20で、デフォルトが10である場合(投票数の多い回答が示すように)、なぜあなたの会社/etc/sshd_configは20を超える許容セッション数を増やしたのですか?これはUbuntuのバグですか?
WinEunuuchs2Unix

21番目の端末が開いている場合、その端末をすぐに閉じたいので、最初の20個の接続は無期限にサーバーを独占することができますか?
キセノイド

回答:


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
私はしばらくの間、私の古いラップトップの1つでSSSHをセットアップするつもりでした。デフォルトでは、10人のユーザーのみがサーバーにサインインできるとマニュアルページには記載されていますか 80年代になっても、100 MBのユーザーが2 MBのRAMを搭載したIBM S / 36ミニコンピューターにサインインできました。
WinEunuuchs2Unix

2
オープン端末(OPを参照)のように、SSH接続内のセッションとセッションを混同しています。言及する設定は、1つのssh接続で許可される「サブ接続」の数に関するものです。したがって、30個の「ssh」コマンドを実行しても問題はありませんMaxSessions 20。そこに記載されているセッションは、システム上のログイン数ではなく、同じ接続を使用するポート転送(および複数のシェルを開くことなど)に関するものです。
アロ

@alloこの情報はOPから取得しましたか?
ジョージウドセン

1
ここで@alloは正しいです。MaxSessionsは、単一のTCP接続でのセッションの多重化を指します。OPのすべてのユーザーがサーバーへの単一のTCP接続を共有するために奇妙なことをしていない限り、この制限はユーザーに影響しません。サーバーでMaxSessionsの制限を低く設定し、それ以上の接続を開いて、これを自分で確認しました。
ジョー

5

Georgeのソリューションは正常に機能しますが、bashスクリプトを要求しました...

以下のようなオプションはありませんときに、他の状況のために、このいずれかを考えるMaxSessionsのはsshd、あなたがこのようなものを使用することができます:

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

どちらpkill -nの最新のインスタンスを殺すでしょうprocessName

この特別な状況に対する正しい解決策は、ジョージの答えです。


これはサブプロセスも防止しませんか?
ロンジョン

ええ、サブプロセスも強制終了されます。
ラヴェクシーナ

2
次に、bashが多数のサブプロセスをフォークし、プロセスではなくユーザーを制限することを考えると、これは有用な答えではないようです。
ロンジョン

1
@RonJohn質問を編集するまで、ユーザーの要件(プロセスをすぐに終了するスクリプト)と検索エンジンから来る他のユーザー(タイトルに対する一般的な回答)に対応する便利な回答でした。
ラヴェクシーナ

ここに入りましょう。また、この場所は、質問に基づいてユーザーを正しい道に導くことも知っています。OPが質問をし、正しい答え(OPの質問に基づく)が必ずしもベストプラクティスまたは正しいアプローチであるとは限らない場合、誰もがこれを述べたり、その観察結果に沿って答えを出す権利を持っていると思います。OPが決定するのに最適な答えを決定するオプションを選択する必要があるとは本当に思わないので、情報に詳しいサイトメンバーから多くのオプションを見るのが大好きです。他の人がいなければ私を助けてくれる建設的な議論を常にしてください!
ジョージウドセン

4

私は詳細にテストすることにしました Ravexinaアイデアを練り上げて。確立されたssh接続の数をまったく制限したい場合に有効です。

最初に、接続なしでsshデーモンが実行されているときに、1つのsshdプロセスがあることがわかりました。新しい接続ごとに、2つの新しい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

問題は明確ではありません。最初に私がそれをどのように理解し、どのようにIMOに質問するべきか教えてください:

1つのサーバーが特定のアプリケーションを提供するローカルネットワークがあります。私たちのチームは、PuTTYを使用して、コンピューターからサーバーへのssh接続経由でこのアプリケーションにアクセスします。各チームメンバーには、ssh接続を確立するために使用される独自のユーザーアカウントがあります(または、すべてのチームメンバーが共通のユーザーアカウントを使用します)。

チームメンバーは他の目的でサーバーを使用しないため、特定のユーザーがまだどのくらいの接続を確立していても(または、ユーザーあたり20接続)、ssh接続の数を20に制限します。

その解釈が正しい場合、おそらく要件を満たすための正しい方法は、ユーザーグループを作成し、そのグループにすべてのユーザーアカウントを追加し、を介してmaxloginの数を制限することです/etc/security/limits.conf

  1. たとえばthe-app-maxlogins、というグループIDのグループを作成します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. 次の行を追加して、グループ全体のmaxlogins /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の質問の下にあるです。

私の他の答えは、何らかの方法で回避策を提供することができますが、それは本当の解決策ではなく、一種の楽しみです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.