루트가 아닌 사용자가 랩톱을 일시 중지하도록 허용하는 가장 쉬운 방법

루트가 아닌 사용자가 랩톱을 일시 중지하도록 허용하는 가장 쉬운 방법

내 노트북에는 suspend다음과 같은 기능이 있습니다.

# cat /sys/power/state
freeze mem

사실 루트로 매달릴 수 있습니다.

echo -n mem > /sys/power/state

이것은 훌륭하게 작동합니다. 그러나 루트가 아닌 사용자가 일시 중지되도록 허용하는 최소한의 방법은 무엇입니까?

저는 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바뀌었고 데비안의 현재 버전이 0.99.10작동하지 않아야 한다는 것을 이해합니다. 하지만 테스트하기 위해 upowerwheezy( 0.9.17)에서 설치했는데 그것도 작동하지 않았습니다. 명령 dbus-send으로 인해 다음 오류가 발생했습니다.

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

그러나 어쨌든 , 및 를 사용하는 것은 pm-utils아마도 upower가장 dbus쉬운 설정은 아닐 것입니다. pm-utils의 실제 목적은 무엇입니까 upower? 이 유틸리티는 루트에서만 작동합니다. 하지만 루트로서 이미 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?

ifdown인터넷 연결이 필요합니까 ifup?

답변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

관련 정보