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がないことを検出するルートクローンジョブを実行できます。fooクローン操作はそのようなインスタンスを終了したり、電子メールで警告を送信したりできます(スパムを避けるために、foo.realのプロセスIDを追跡し、同じPIDに対して複数の警告を電子メールで送信しないでください)。


ただし、ライセンスされたソフトウェアがある種のライセンスマネージャに同梱されている場合は、ドキュメントを確認して、ユーザーあたりのインスタンス数を制限できることを確認してください。

関連情報