解释

解释

我正在使用笔记本电脑。我考虑在我的 Ubuntu 机器上安装一个支持。当输入错误的密码时,稍后会拍摄一张照片,显示谁试图获得访问权限。

我搜索了一番,发现的唯一东西是在 Mac 上执行此操作的东西。是否可以为 Ubuntu 编写一个脚本来执行相同操作?

如果可能的话,那么什么是脚本或软件可以实现这一点。

答案1

基于这个帖子在 Ubuntuforums 上BkkBonanza

这是一种使用 PAM 的方法,适用于所有失败的登录尝试。使用 SSH、虚拟终端或通过常规登录屏幕,这无关紧要,因为最终一切都由 PAM 处理。

  1. 安装ffmpeg安装 ffmpeg,我们将使用它作为抓取网络摄像头图像的命令行方式。更新:升级到 Ubuntu 14.04 后,ffmpeg 将被删除。我们可以在以下脚本中使用 avconv 代替 ffmpeg。无需单独安装任何东西。

  2. 在某处创建一个小脚本,例如/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)。

  3. 使其可执行,例如chmod +x /usr/local/bin/grabpicture

  4. 测试它,只需调用它:/usr/local/bin/grabpicture。检查是否看到文件出现在/tmp/vid....jpg

  5. 配置 PAM 在每次尝试失败时调用此方法。

    注意:请小心执行此操作 - 如果失败,您将无法再次以常规方式访问您的系统。

    1. 打开一个具有 root 访问权限的终端窗口 ( sudo -i) 并将其保持打开状态 - 以防您在接下来的步骤中搞砸了。

    2. 在您最喜欢的编辑器中打开/etc/pam.d/common-auth,例如通过执行gksudo gedit /etc/pam.d/common-auth。请记住,对于以下步骤,此文件中的行顺序很重要。

    3. 找到下面的行。默认情况下有一行带有 的那个pam_deny.so。在我的 12.04 系统上它看起来像这样:

        auth    [success=1 default=ignore]      pam_unix.so nullok_secure
      
    4. 在这一行中将其更改为,success=1以便success=2在成功时跳过我们的脚本。这是一个重要的步骤如果您未能完成此步骤,请参阅下文如何恢复(***)。

    5. 在下面,添加一个新的来调用实际脚本:

        auth    [default=ignore]                pam_exec.so seteuid /usr/local/bin/grabpicture
      
    6. 保存并关闭文件。无需重新启动任何东西。

  6. 测试一下。

    1. 在新的终端窗口中,以普通用户身份尝试su -l username以另一个用户身份登录username(当然要更改为实际用户名)。故意输入错误的密码。检查这是否会导致出现新图片。
    2. 与上面相同,但现在输入正确的密码。检查您是否登录并且不会导致拍照。
  7. 如果测试成功,您可以从 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 命令的使用情况很有用。

有关 LinuxLogFiles 的更多信息

如果登录尝试失败,则会将记录附加到文件/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))

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

相关内容