You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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桌面默认)

  1. 先写一个检查标记的脚本,比如/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
  1. 修改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等默认)

  1. 先写一个切换自动登录配置的脚本/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
  1. 创建一个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

火山引擎 最新活动