如何在Linux特定重启场景下免除密码验证
如何在Linux特定重启场景下免除密码验证
兄弟,你之前的思路偏了哦!你在visudo里加的那行是让你用sudo执行重启、关机命令时不用输密码,但这和你要的「重启后系统启动时免密码登录」完全是两码事——这俩根本不是一个层面的问题,难怪没效果😅
我们的核心思路是:给crontab触发的重启加个临时「标记」,系统重启后检查这个标记,存在就自动登录,然后删掉标记;不存在就正常要求输密码。下面是具体步骤:
第一步:给crontab的重启命令加上标记
先修改你的crontab任务,在重启前创建一个临时标记文件。比如原来的crontab行是0 2 * * * /sbin/reboot,改成:
0 2 * * * sudo touch /var/run/autologin_flag && sudo /sbin/reboot
为什么要用sudo?因为/var/run是root权限的临时目录,普通用户没权限直接创建文件。这时候你需要确保你的用户能免密码执行这两个命令,所以用sudo visudo编辑sudo配置文件(别直接改原文件!),加一行:
user_name ALL=(ALL) NOPASSWD: /usr/bin/touch /var/run/autologin_flag, /sbin/reboot
这样crontab就能顺利创建标记然后重启了。
第二步:配置显示管理器根据标记自动登录
这里分两种常见的显示管理器来说,你根据自己的发行版选:
情况1:用GDM3(Ubuntu、Debian等GNOME桌面默认)
- 先写一个检查标记的脚本,比如
/usr/local/bin/check_autologin.sh:
#!/bin/bash # 检查标记文件是否存在 if [ -f /var/run/autologin_flag ]; then # 存在就删掉标记,返回0表示允许免密登录 rm -f /var/run/autologin_flag exit 0 else # 不存在就返回1,继续要求输密码 exit 1 fi
给脚本加执行权限:
chmod +x /usr/local/bin/check_autologin.sh
- 修改PAM的GDM配置,让它先执行这个脚本。编辑
/etc/pam.d/gdm-password,在auth required pam_unix.so这一行之前加:
auth sufficient pam_exec.so quiet expose_authtok /usr/local/bin/check_autologin.sh
解释一下:pam_exec.so会调用我们的脚本,脚本返回0的话,PAM就认为验证通过,直接跳过密码环节;返回1的话,就继续走正常的密码验证流程。
情况2:用LightDM(Xubuntu、Lubuntu等默认)
- 先写一个切换自动登录配置的脚本
/usr/local/bin/lightdm_autologin_check.sh:
#!/bin/bash FLAG_FILE="/var/run/autologin_flag" LIGHTDM_CONF="/etc/lightdm/lightdm.conf" USER_NAME="user_name" # 改成你的用户名 if [ -f "$FLAG_FILE" ]; then # 存在标记,开启自动登录 sed -i "s/^#autologin-user=/autologin-user=$USER_NAME/" "$LIGHTDM_CONF" rm -f "$FLAG_FILE" else # 不存在标记,关闭自动登录 sed -i "s/^autologin-user=/\#autologin-user=/" "$LIGHTDM_CONF" fi
加执行权限:
chmod +x /usr/local/bin/lightdm_autologin_check.sh
- 创建一个systemd服务,让系统启动时先执行这个脚本(要在LightDM启动前运行):
编辑/etc/systemd/system/check_autologin.service:
[Unit] Description=Check autologin flag and configure LightDM Before=lightdm.service [Service] Type=oneshot ExecStart=/usr/local/bin/lightdm_autologin_check.sh [Install] WantedBy=multi-user.target
然后启用并启动服务:
sudo systemctl enable check_autologin.service sudo systemctl start check_autologin.service
补充测试说明
你可以手动执行一次crontab里的命令:sudo touch /var/run/autologin_flag && sudo reboot,看看重启后是不是自动登录了;然后手动重启一次,应该就会要求输密码了。另外/var/run是内存挂载的临时目录,就算标记文件没被脚本删掉,系统重启后也会自动清空,不会留后遗症。
备注:内容来源于stack exchange,提问作者Polin




