每次有人尝试登录系统但失败时,我都想从网络摄像头拍摄并保存一张照片。我知道我可以用以下方法做到这一点:
mplayer -vo png -frames 1 tv://
问题是:当有人无法使用 LightDM 登录时,我该如何触发此命令?
答案1
解释
一种方法是利用授权日志。
授权日志
授权日志跟踪授权系统的使用情况,授权系统是提示输入用户密码的用户授权机制,例如可插入身份验证模块 (PAM) 系统、sudo 命令、远程登录 sshd 等。授权日志文件可在 访问
/var/log/auth.log
。此日志对于了解用户登录和 sudo 命令的使用情况很有用。
如果登录尝试失败,则会将记录附加到文件/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))
如果妊娠期糖尿病是您的登录管理器。这样,只有当实际发生物理登录失败时,才会触发脚本。
祝你好运