允许用户(非root)暂停笔记本电脑的最简单方法

允许用户(非root)暂停笔记本电脑的最简单方法

我的笔记本电脑具有suspend以下功能:

# cat /sys/power/state
freeze mem

事实上我可以以 root 身份挂起:

echo -n mem > /sys/power/state

这很好用。但是,让用户(非 root)能够挂起的最低限度的方法是什么?

我正在使用 Debian Buster,但我没有systemd安装(我使用的是旧式 sysvinit)。而且我也没有运行 udev 守护进程(我正在使用“内核空间”udev)。

我希望以最少的附加包来实现用户挂起功能。

在早期的 Debian 版本 (Wheezy) 上,我可以安装:

  • pm-utils
  • 优动力

然后通过dbus发出命令。我认为事情是这样的:

dbus-send --system --print-reply --dest="org.freedesktop.UPower" /org/freedesktop/UPower org.freedesktop.UPower.Suspend

这不再有效。现在我了解到情况upower已经改变,Debian 中的当前版本0.99.10不应该工作。但我upower从 wheezy ( 0.9.17) 安装,只是为了测试它,但这也不起作用。该dbus-send命令给了我这个错误:

Error org.freedesktop.DBus.Error.Spawn.ChildExited: Launch helper exited with unknown return code 127

但无论如何,使用pm-utils,upowerdbus可能不是最简单的设置。pm-utils的实际目的是什么upower?这些实用程序仅适用于 root。但作为 root,我已经可以使用 来暂停echo -n mem > /sys/power/state。这些公用事业能带来什么额外的好处?

我看到 pm-utils 安装了很多不同的脚本。除了出具还需要办理什么手续吗echo -n mem > /sys/power/state

作为用户我怎样才能实现这一切?

也许编写一个简单的C程序来写入mem/sys/power/state并设置s与实例相同的位/usr/bin/passwd

这是一个可行且干净的解决方案吗?或者这会被视为“肮脏”的解决方案吗?有更好的解决方案吗?

mem除了写信给我之外,我还需要处理什么/sys/power/state

我需要ifdownifup网络吗?

答案1

您可以在以下位置编写一个简单的程序c

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {

    FILE *f;

        f = fopen("/sys/power/state", "w");

    if(f == NULL) {
        printf("Error opening file: /sys/power/state\n");   
        exit(1);             
    }

    fprintf(f,"%s","mem");

    fclose(f);

}

编译它,并将二进制文件复制到/usr/local/bin/pm-suspend.设置 setuid 位:

chmod u+s pm-suspend

答案2

您可以使用 sudo 允许在没有密码的情况下使用特定的挂起命令集:

创建一个/etc/sudoers.d/suspend包含以下内容的文件:

Cmnd_Alias     SUSPEND = /usr/bin/systemctl suspend, /usr/sbin/rtcwake ^-m mem --date [0-9+][^ ]{0,30}$, /usr/sbin/rtcwake ^-m mem -[st] [0-9]{1,11}$
yourusername   ALL=NOPASSWD: SUSPEND

相关内容