"systemctl suspend" 命令需要 root 权限

Root privileges needed for "systemctl suspend" command

在嵌入式 Linux 设备上(带有 iMX7d 处理器的 Colibri 模块)我无法 运行 作为非根用户执行命令 systemctl suspend 以切换到暂停模式。当我以 root 用户登录时,命令被执行并且系统切换到挂起模式。在 Ubuntu PC 系统上作为非 root 用户使用相同的命令 运行s。

我也想在没有 root 权限的嵌入式 Linux 设备上进入挂起模式。任何人都可以帮助我或告诉我如何实现这一目标的方向吗?任何帮助将不胜感激。

这里是嵌入式设备的Linux内核版本:

$ uname -r
5.4.91-5.2.0-devel+git.c59b3c2da1e9

这里是systemctl版本的版本:

$ systemctl --version
systemd 244 (244.5+)
+PAM -AUDIT -SELINUX +IMA -APPARMOR -SMACK +SYSVINIT +UTMP -LIBCRYPTSETUP -GCRYPT -GNUTLS +ACL +XZ -LZ4 -SECCOMP +BLKID -ELFUTILS +KMOD -IDN2 -IDN -PCRE2 default-hierarchy=hybrid

要允许其他(非 root)用户使用 运行仅 root 命令,您可以使用 sudo https://linux.die.net/man/8/sudo

假设您需要能够挂起的非 root 用户称为:user1

/root/suspend.sh 中创建包含 systemctl suspend 的文件,并确保其模式为 0700 且归 root:root 所有,例如运行 这些作为根:

echo 'systemctl suspend' > /root/suspend.sh
chmod 0700 /root/suspend.sh
chown root:root /root/suspend.sh

然后 运行 visudo 作为 root,然后添加这一行:

user1 ALL=(root) NOPASSWD: /root/suspend.sh

然后保存文件

这意味着 user1 可以 运行 脚本 /root/suspend.sh 作为 root 用户,无需询问其(用户 1 的)密码

当您想以 user1 身份暂停时,运行:sudo /root/suspend.sh

使用此解决方案,用户 1 可以 运行 sudo /root/suspend.sh 作为 root,但不能 运行 作为 root 任意命令(除非您将用户添加到 sudo 组)

重要注意事项:

您必须确保 /root/suspend.sh 只能由 root 写入(并且它包含的目录 /root/ 也只能由 root 写入)

如果任何非root用户可以写入/root/suspend.sh,那么当user1 运行文件时,它将在那里执行任意命令。

如果任何非 root 用户可以写入目录 /root/,任何用户也可以 remove/delete /root/suspend.sh 然后使用任意命令创建同名的新文件。