プログラムでユーザーログインを検出する方法は? [コピー]

プログラムでユーザーログインを検出する方法は? [コピー]

私は、ユーザーがシステムにログインするとき(すべての種類のログインを含む)、いくつかのコマンドを実行する必要がある小さなデーモンを開発しています。これを行うには、このログインイベントが発生するたびにプログラムを起動したいと思います。しかし、新しいユーザーが到着したことを定期的に確認したくありません。つまり、次のことはできません。

  • /var/log/auth.logログファイルなどを定期的に読み込みます。実際にファイルを解析する必要があるという事実に加えて、これはかなり頻繁に実行されます(システムにログインしている人がほとんどいないため)。
  • pswho他のコマンド(または)の出力を確認し、w内部的にユーザーを追跡します。このアプローチを使用すると、プログラムは逃す私のプログラムが出力確認を実行する前に誰かがログインしてログアウトする場合に備えて、いくつかのログインです。

プログラムは時間を無駄にしたくないので、I / Oイベントを使用しようとしましたが...どこに行くべきかわかりません。フック。監視/var/run/utmp(を使用して)を試しましたが、inotify正しく反応しないようです。端末が開いたり閉じたりすると、私のプログラムは多くのイベントを受け取りますが、誰かが実際にログインしているときは非常に少ないイベントを受け取ります。また、これらのイベントは、1回のログイン試行から別のログイン試行として識別して変更することは困難です。ちなみに私ができることのいくつかは次のとおりです。捕まえるランタイムsu user:

  • 端末が開いているとき:(IN_OPENファイルが開いている)、IN_CLOSE_NOWRITE(書き込み不可能なファイルが閉じている)、時にはIN_ACCESS(ファイルにアクセスされ、使用されますsu -l)。
  • 開始時期su(パスワードプロンプト):識別子を持たないいくつかのイベント(event.mask = 0)。
  • ログインに成功した後(シェルが別のユーザーとして起動しました):何もありません。
  • 端末を閉じるとき:名前が付けられていない別のイベントのセットです。

プログラムを」ユーザーログインinotify「(プロセスの作成を検出するためにウォッチを使用できるように)、ウォッチを使用できるユーザーログインを反映するファイルはありますか/proc/proc

サイドノート: プログラミングに関する内容なので、Stack Overflowに載せてみようかと思いましたが、実装ではなくユーザーがログインする際のLinuxシステムの「可視的」反応にもっと興味があります。 )時間を無駄にせずにプログラムで観察/検出/通知します。

ベストアンサー1

システムでプラグ可能な認証モジュール(PAM)を使用していますか?最も現代的なLinuxまたはBSDPAMを使用してください。

PAMを使用すると、接続されたログインが可能です。あなたの要件を満たすことができるいくつかのPAMモジュールがあります。あるいは、Cで直接書くこともできます。pam-python* Pythonコードに接続できるバインディングです。

デーモンが継続的に実行されることを考慮して、ファイルに書き込んでデーモンにシグナルを送信する単純なPAMモジュールを選択します。

*libpam-pythonこのパッケージはDebianとUbuntuの名前にちなんで命名されました。

おすすめ記事