web-dev-qa-db-ja.com

LightDM:誰かがログインに失敗するたびにbashコマンドをトリガーするにはどうすればよいですか?

誰かがシステムにログインしようとして失敗するたびに、ウェブカメラから写真を撮って保存したいと思います。私はそれが次のことでできることを知っています:

mplayer -vo png -frames 1 tv://

問題は、誰かがLightDMを使用してログインに失敗したときに、このコマンドをトリガーするにはどうすればよいですか?

1
Adrian Lopez

説明

1つの方法は、承認ログを使用することです。

承認ログ

承認ログは、承認システム、Pluggable Authentication Module(PAM)システム、Sudoコマンド、sshdへのリモートログインなどのユーザーパスワードを要求するユーザーを承認するメカニズムの使用状況を追跡します。認証ログファイルには、/var/log/auth.logでアクセスできます。このログは、ユーザーのログインとSudoコマンドの使用法について学習するのに役立ちます。

LinuxLogFilesの詳細はこちら

ログインに失敗すると、レコードが/var/log/auth.logファイルに追加され、最後の行に次のようなものが含まれます。

pam_unix(gdm-password:auth): authentication failure;

ファイルの変更を常に監視し、最後の行にキーワードfailuregrep failureなどで含まれているかどうかを確認すると、失敗したログイン試行が発生したことがわかりますこのアクションに基づいて、必要なコマンドを実行できます。


解決

次のようなスクリプトを使用して、/var/log/auth.logファイルの最終行を監視できます。

#!/bin/bash

while true
do
       sleep 1


        if (( $(tail -1 /var/log/auth.log | grep failure | wc -l) == 1))

        then

                echo "failed login"

                # Your command here

        fi

done

あるいは、inotify-toolsをインストールし、sleep 1の代わりにinotifywaitを使用してファイルを監視すると、スクリプトは次のようになります。

#!/bin/bash

while inotifywait -q -e modify /var/log/auth.log >/dev/null

do

        if (( $(tail -1 /var/log/auth.log | grep failure | wc -l) == 1))

        then

                echo "failed login"

                # Your command here

        fi


done

inotify-toolsは、次のコマンドでインストールできます。

Sudo apt install inotify-tools

実装

このソリューションをシステムサービスとして実行するには、次の手順に従ってください。

  • 上記のスクリプトコードをコピーして(echo "failed login"なしでデバッグ目的でこの行を追加したため)ホームディレクトリのファイルに貼り付け、TakePicture.shという名前を付けてファイルを保存します。

  • ターミナルで次のコマンドを実行して、シェルスクリプトファイルを実行可能にします。

chmod +x ~/TakePicture.sh
  • ターミナルで次のコマンドを実行して、ブート時にシェルスクリプトを実行するカスタムsystemdサービスを作成および編集します。
Sudo nano /etc/systemd/system/TakePicture.service 
  • 次のコードをコピーしてエディターに貼り付け、USERNAMEyour usernameに置き換えて、を押して保存します CtrlX 次に押します Y 次に押します Enter
[Unit]
Description=Take Picture

[Service]
Type=oneshot
ExecStart=/home/USERNAME/TakePicture.sh

[Install]
WantedBy=multi-user.target
  • ターミナルで次のコマンドを実行して、サービスを開始します。
Sudo systemctl start TakePicture
  • ターミナルで次のコマンドを実行して、サービスを有効にします。
Sudo systemctl enable TakePicture

お知らせ

承認ログには、あらゆる種類の失敗したログインまたは認証(つまり、GDM、SSH、端末ユーザー認証、Sudoなど)が含まれます。

実際の物理的なログインが発生したときにスクリプトをアクティブにすることだけが目的の場合(つまり、誰かがコンピューターの前に座って、キーボードを使用して画面を見ている場合)、上記のifステートメントを次のように変更する必要があります。

if (( $(tail -1 /var/log/auth.log | grep gdm | grep failure | wc -l) == 1))

if[〜#〜] gdm [〜#〜]がログインマネージャーです。この方法では、実際に物理的なログインに失敗した場合にのみスクリプトがトリガーされます。

幸運を祈ります

1
Raffa