每次登录时我都需要用网络摄像头拍摄一张照片。所以我写了一个 bash 脚本,将其放在 /usr/local/bin/photo.sh 中
但问题是 - 我不知道如何在每次登录尝试时(每次输入错误或正确的密码、每次登录和每次帐户解锁时)运行此脚本。有什么建议吗?
Ubuntu 16.04,Unity,lightdm。
答案1
总结:
它可以工作,但是某些包可能会覆盖你的配置,然后你就完蛋了。
我在这里取得了一些进展。我知道该如何运行*每一个*身份验证尝试。
我的 /etc/pam.d/common-auth:
#
# /etc/pam.d/common-auth - authentication settings common to all services
#
# This file is included from other service-specific PAM config files,
# and should contain a list of the authentication modules that define
# the central authentication scheme for use on the system
# (e.g., /etc/shadow, LDAP, Kerberos, etc.). The default is to use the
# traditional Unix authentication mechanisms.
#
# As of pam 1.0.1-6, this file is managed by pam-auth-update by default.
# To take advantage of this, it is recommended that you configure any
# local modules either before or after the default block, and use
# pam-auth-update to manage selection of other modules. See
# pam-auth-update(8) for details.
# here are the per-package modules (the "Primary" block)
auth [success=2 default=ignore] pam_unix.so nullok_secure
# here's the fallback if no module succeeds
auth optional pam_exec.so quiet /usr/local/bin/onlogin.sh fail
auth requisite pam_deny.so
# prime the stack with a positive return value if there isn't one already;
# this avoids us returning an error just because nothing sets a success code
# since the modules above will each just jump around
auth optional pam_exec.so quiet /usr/local/bin/onlogin.sh ok
auth required pam_permit.so
# and here are more per-package modules (the "Additional" block)
auth optional pam_ecryptfs.so unwrap
# end of pam-auth-update config
那么,让我们从头开始:
auth [success=2 default=ignore] pam_unix.so nullok_secure
默认情况下,success 等于 1。它告诉 PAM 如果用户已成功验证,它应该跳过多少行。我已将其更改为 2,因为我添加了以下行:
auth optional pam_exec.so quiet /usr/local/bin/onlogin.sh fail
因此,auth
当然,告诉 PAM 在每次身份验证时运行命令。然后,optional
我猜即使出现错误也应该传递脚本。 是一个以作为参数运行脚本pam_exec.so
的库,因为当用户输入错误的凭据时会执行此行。我添加了,因为在我的 VM 上每次/身份验证都会出现错误。/usr/local/bin/onlogin.sh
fail
quiet
sudo
su
下一行以 结尾pam_deny.so
,顾名思义,阻止用户访问。此处为默认设置。
然后,与上面相同的行,但以 结尾ok
,以告诉脚本用户验证成功。
auth optional pam_exec.so quiet /usr/local/bin/onlogin.sh ok
一切都运行正常,但是…问题是当我尝试登录 Ubuntu 的内置来宾帐户。因为,嗯,没有身份验证。没有密码 = 无需身份验证。在这种情况下,@NGRhodes 提供的解决方案有效。
在我的 Ubuntu xenial VM 上,一切都运行正常,所以我将其移至物理机,重新启动机器,登录我的帐户,然后重新登录到客户机。很好。再次重新启动 - 效果很好。
因此,像往常一样,我每天晚上都会更新我的机器。重启。登录。密码不正确。再试一次 - 密码不正确... 启动一些 livecd 发行版,cd
进入/etc/pam.d/
以关闭它,我看到了什么?success=2
变成了success=1
,每次尝试 - 成功或失败 - 都执行了pam_deny.so
。
再次启动,成功登录,tailf /var/log/apt/history.log | grep -i pam
然后libpam-cgfs
出现一些错误。所以,这个包(可能)被覆盖了部分的/etc/pam.d/common-auth
。
为后代附加onlogin.sh
:) - 记得先安装 fswebcam。
#!/bin/bash
# $PAM_* variables are described in `man pam_exec`
RESULT="${1}" # login result (ok/fail)
WEBCAM_DEV="/dev/video0" # webcam device
WEBCAM_RES="1280x720" # desired screen resolution (if too large fswebcam fallbacks to device's max)
FRAMES="1" # how many shots to take (also add nanoseconds to date in filename to prevent overwrite and/or fswebcam crash)
PHOTO_DIR="/opt/_webcam" # where to save photos
FILENAME="${RESULT}_${PAM_USER}_$(date +%Y-%m-%d_%H-%M-%S).jpg" # filename
OUTPUT="${PHOTO_DIR}/${FILENAME}" # dir+filename
# create dir
mkdir -p ${PHOTO_DIR}
# append to the log
if [[ ${RESULT} == 'ok' ]]; then
RESULT='succeed'
else
RESULT='failed'
fi
logger -t 'onlogin.sh' "Login ${RESULT} by ${PAM_SERVICE} at ${PAM_TTY} for user ${PAM_USER}"
# say cheeeeese (if authorization is provided by lightdm)
if [[ ${PAM_SERVICE} == "lightdm" ]]; then
fswebcam -d ${WEBCAM_DEV} -r ${WEBCAM_RES} --jpeg 90 -q -F ${FRAMES} ${OUTPUT}
else
# if authorization is provided by something else (e.g. sudo) do nothing
:
fi
一些帖子非常有用:
答案2
在启动程序(使用 Dash)中,您可以在计算机启动时执行命令开始。我不确定是否尝试登录。
答案3
lightdm.conf 文件支持使用 session-setup-script 参数运行脚本(请参阅https://wiki.ubuntu.com/LightDM更多细节)。
如果您编辑 /etc/lightdm/lightdm.conf,请搜索以 session-setup-script 开头的行,确保它没有被注释掉(# 字符),将路径附加到您的文件,使其看起来像:
session-setup-script=/usr/local/bin/photo.sh
安全说明:您的脚本将以 root 身份运行。