解释

解释

每次有人尝试登录系统但失败时,我都想从网络摄像头拍摄并保存一张照片。我知道我可以用以下方法做到这一点:

mplayer -vo png -frames 1 tv://

问题是:当有人无法使用 LightDM 登录时,我该如何触发此命令?

答案1

解释

一种方法是利用授权日志。

授权日志

授权日志跟踪授权系统的使用情况,授权系统是提示输入用户密码的用户授权机制,例如可插入身份验证模块 (PAM) 系统、sudo 命令、远程登录 sshd 等。授权日志文件可在 访问/var/log/auth.log。此日志对于了解用户登录和 sudo 命令的使用情况很有用。

有关 LinuxLogFiles 的更多信息

如果登录尝试失败,则会将记录附加到文件/var/log/auth.log,最后一行将包含以下内容:

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

如果你不断监视文件是否修改,并检查最后一行是否包含关键字失败例如grep 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并使用inotifywait来监视文件而不是sleep 1脚本将如下所示:

#!/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并保存该文件。

  • 制作 shell 脚本文件可执行文件通过在终端中运行以下命令:

chmod +x ~/TakePicture.sh
  • 通过在终端中运行以下命令来创建并编辑自定义 systemd 服务以在启动时运行 shell 脚本:
sudo nano /etc/systemd/system/TakePicture.service 
  • 将以下代码复制并粘贴到编辑器中,替换USERNAME您的用户名并按Ctrl+X然后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))

如果妊娠期糖尿病是您的登录管理器。这样,只有当实际发生物理登录失败时,才会触发脚本。

祝你好运

相关内容