나는 다음 줄을 얻었다 sudoers
:
Cmnd_Alias NVIDIA = /sbin/sh -c 'echo ON > /proc/acpi/bbswitch; modprobe nvidia; modprobe nvidia_drm modeset=1'
user ALL=(ALL) ALL, NOPASSWD: /sbin/systemctl suspend,NVIDIA
내 것은 sudo -l
나에게 다음을 보여줍니다 :
sudo -l
User user may run the following commands on devbox:
(ALL) ALL, NOPASSWD: /sbin/systemctl suspend, /sbin/sh -c 'echo ON > /proc/acpi/bbswitch; modprobe nvidia; modprobe nvidia_drm modeset\=1'
그래도 실행하려고 하면 /sbin/sh -c 'echo ON > /proc/acpi/bbswitch; modprobe nvidia; modprobe nvidia_drm modeset=1'
여전히 비밀번호를 입력하라는 메시지가 표시됩니다.
NVIDIA 로드에 대한 내 주장 =
에 기호에 문제가 있는 것 같습니다.modeset
답변1
먼저, 다음 사항을 확인하세요.언제나visudo
편집을 위해 /etc/sudoers
문법 검사를 수행하므로 스스로 글을 쓸 가능성이 줄어듭니다.
이제 다음 명령을 사용하여 부적절한 첫 번째 쉼표( ALL
및 사이 NOPASSWD
)를 제거합니다.
(ALL) ALL NOPASSWD: /sbin/systemctl suspend
다음으로, modeset
명령이 너무 복잡해서 sudoers
파일에 직접 안정적으로 정의할 수 없다는 점을 알아두세요. 다음 명령을 고려하십시오( 포함 여부에 관계 없음 sudo
).
sh -c 'date >/tmp/date'
따옴표는 사용자 고유의(대화형) 셸에서 구문 분석되며 인용된 문자열은 단일 단어로 전달됩니다. sh
두 개의 매개변수가 -c
표시 되며 date >/tmp/date
명령에는 따옴표가 표시되지 않습니다. 다시 말하지만, 여기에 있는 인용문은 sudo
누구도 볼 수 없습니다.
sudo sh -c 'date >/tmp/date'
, 및 sudo
3개의 매개변수가 표시 됩니다 .sh
-c
date >/tmp/date
그래서 내 제안은 필요한 작업을 수행하는 짧은 쉘 스크립트를 만들고 추가하는 것입니다.저것귀하의 파일에 sudoers
. (루트로 다음 명령 블록을 실행하여 sudo -s
루트 쉘을 얻으십시오.)
cat >/usr/local/bin/modeset1 <<EOF
#!/bin/sh
echo ON > /proc/acpi/bbswitch
modprobe nvidia
modprobe nvidia_drm modeset=1
EOF
chown root /usr/local/bin/modeset1
chmod a=rx,u+w /usr/local/bin/modeset1
이제 sudoers
다음 명령을 사용하여 visudo
이 줄을 추가합니다 .
(ALL) ALL NOPASSWD: /usr/local/bin/modeset1
/usr/local/bin
계정에 추가 되면 $PATH
일반적인 사용자 계정을 표준 명령으로 사용하여 간단히 호출할 수 있습니다.
sudo modeset1