Linux ユーザーの最初のセッションを除くすべてのセッションを終了し、ユーザーを 1 つのログイン セッションに制限する方法

Linux ユーザーの最初のセッションを除くすべてのセッションを終了し、ユーザーを 1 つのログイン セッションに制限する方法

Linux Redhat 6 で、ログインしているユーザーの最初のプロセスを除くすべてのプロセスを強制終了する方法を知る必要があります。

たとえば、AZainユーザーが異なるマシンから複数回ログインしている場合は、最初のプロセスのみを許可し、このユーザーに対して他のすべてのプロセスを停止する必要があります。

who -u
AZain    pts/2        2016-06-23 08:34   .         27191 (localhost)
AZain    pts/4        2016-06-23 09:01   .         28885 (localhost)
root     pts/0        2016-06-23 08:14   .         25962 (10.11.155.23)
AZain    pts/1        2016-06-23 08:34 00:27       27169 (10.11.155.23)
AZain    pts/3        2016-06-23 09:01   .         28867 (10.11.155.14)

編集: ユーザーのライセンスを消費するアプリケーションがあるため、これを実行しようとしています。そのため、同じユーザーの新しいセッションごとに、より多くのライセンスが消費されます。同じユーザーの新しいログインを防止できれば、非常に便利です。

答え1

これは古典だXY問題- ユーザーごとに実行されるライセンス ソフトウェアのインスタンス数を制限しようとしていますが、シェル ログインの制限に重点を置いています。これは解決すべき問題ではありません。

より良い解決策は次のとおりです。

  • プログラム名を変更します。例: から/usr/local/bin/foo/usr/local/bin/foo.real

  • 元のプログラムと同じ名前とパス (例 ) を持つラッパー スクリプトを作成し、/usr/local/bin/fooユーザーがすでに実行しているかどうかを確認します。

    はいの場合は、適切なエラーメッセージを出して終了します。そうでない場合は、元のプログラムを実行します(/usr/local/bin/foo.real

非常に簡単な例:

#! /bin/sh

if pgrep -u "$USER" foo.real >/dev/null 2>&1 ; then
  echo "You are already running foo" >&2
  exit 1
else
  foo.real
fi

注: これは、ライセンスの問題を理解し、ルールに従うことを気にしない行儀の良いユーザーに対して有効です。 不正なユーザーが自分自身で実行するのを阻止することはできません。またはをfoo.real追加することで、不正だがあまり賢くないユーザーを阻止できます。alias foo.real=foo/etc/profile/etc/bash.bashrc

foo.real親プロセスとして呼び出されるシェル スクリプトを持たないインスタンスの実行を検出するルート cron ジョブを実行できますfoo。cron ジョブは、そのようなインスタンスを強制終了したり、警告を電子メールで送信したりできます (スパムメールを避けるには、foo.real のプロセス ID を追跡し、同じ PID に関する警告を複数回自分にメールで送信しないでください)。


ちなみに、ライセンスされたソフトウェアに何らかのライセンス マネージャーが付属している場合は、そのドキュメントをチェックして、ユーザーあたりのインスタンス数を制限できるかどうかを確認してください。

関連情報