我正在使用笔记本电脑。我考虑在我的 Ubuntu 机器上安装一个支持。当输入错误的密码时,稍后会拍摄一张照片,显示谁试图获得访问权限。
我搜索了一番,发现的唯一东西是在 Mac 上执行此操作的东西。是否可以为 Ubuntu 编写一个脚本来执行相同操作?
如果可能的话,那么什么是脚本或软件可以实现这一点。
答案1
基于这个帖子在 Ubuntuforums 上BkkBonanza。
这是一种使用 PAM 的方法,适用于所有失败的登录尝试。使用 SSH、虚拟终端或通过常规登录屏幕,这无关紧要,因为最终一切都由 PAM 处理。
安装ffmpeg,我们将使用它作为抓取网络摄像头图像的命令行方式。更新:升级到 Ubuntu 14.04 后,ffmpeg 将被删除。我们可以在以下脚本中使用 avconv 代替 ffmpeg。无需单独安装任何东西。
在某处创建一个小脚本,例如
/usr/local/bin/grabpicture
包含以下内容:#!/bin/bash ts=`date +%s` ffmpeg -f video4linux2 -s vga -i /dev/video0 -vframes 3 /tmp/vid-$ts.%01d.jpg exit 0 #important - has to exit with status 0
将 更改
/dev/video0
为您的网络摄像头的实际视频设备,并选择保存图片的路径 - 我只是选择/tmp
。在较新版本的 Ubuntu 中,请使用avconv
而不是ffmpeg
(sudo apt-get install libav-tools
)。使其可执行,例如
chmod +x /usr/local/bin/grabpicture
。测试它,只需调用它:
/usr/local/bin/grabpicture
。检查是否看到文件出现在/tmp/vid....jpg
。配置 PAM 在每次尝试失败时调用此方法。
注意:请小心执行此操作 - 如果失败,您将无法再次以常规方式访问您的系统。
打开一个具有 root 访问权限的终端窗口 (
sudo -i
) 并将其保持打开状态 - 以防您在接下来的步骤中搞砸了。在您最喜欢的编辑器中打开
/etc/pam.d/common-auth
,例如通过执行gksudo gedit /etc/pam.d/common-auth
。请记住,对于以下步骤,此文件中的行顺序很重要。找到下面的行。默认情况下有一行前带有 的那个
pam_deny.so
。在我的 12.04 系统上它看起来像这样:auth [success=1 default=ignore] pam_unix.so nullok_secure
在这一行中将其更改为,
success=1
以便success=2
在成功时跳过我们的脚本。这是一个重要的步骤如果您未能完成此步骤,请参阅下文如何恢复(***)。在下面,添加一个新的来调用实际脚本:
auth [default=ignore] pam_exec.so seteuid /usr/local/bin/grabpicture
保存并关闭文件。无需重新启动任何东西。
测试一下。
- 在新的终端窗口中,以普通用户身份尝试
su -l username
以另一个用户身份登录username
(当然要更改为实际用户名)。故意输入错误的密码。检查这是否会导致出现新图片。 - 与上面相同,但现在输入正确的密码。检查您是否登录并且不会导致拍照。
- 在新的终端窗口中,以普通用户身份尝试
如果测试成功,您可以从 DE(Unity/KDE/...)注销,并且在登录屏幕输入错误密码时您应该会看到相同的内容。
(***) 如果您弄乱了 /etc/pam.d/common-auth 文件,如何恢复系统:
- 重新启动计算机
- 在 grub 启动时按“e”进行编辑
- 添加
初始化=/bin/sh
到以“linux”开头的行
以写权限挂载系统
安装-o重新安装,rw /
编辑文件并修复
/etc/pam.d/common-auth 目录
答案2
解释
当输入错误密码时,您可以运行命令的一种方法是使用授权日志。
授权日志
授权日志跟踪授权系统的使用情况,授权系统是提示输入用户密码的用户授权机制,例如可插入身份验证模块 (PAM) 系统、sudo 命令、远程登录 sshd 等。授权日志文件可在 访问
/var/log/auth.log
。此日志对于了解用户登录和 sudo 命令的使用情况很有用。
如果登录尝试失败,则会将记录附加到文件/var/log/auth.log
,最后一行将包含以下内容:
pam_unix(gdm-password:auth): authentication failure;
如果你不断监视文件是否修改,并检查最后一行是否包含关键字失败例如grep failure
,您知道刚刚发生了一次登录尝试失败,并且您可以根据此操作运行您想要的任何命令。
解决方案
echo "failed login"
将下面的脚本更改为您希望在登录失败时运行的命令。
/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))
如果妊娠期糖尿病是您的登录管理器。这样,只有当实际发生物理登录失败时,才会触发脚本。