sudo/비밀번호 없음을 사용하여 쉘 스크립트 실행

sudo/비밀번호 없음을 사용하여 쉘 스크립트 실행

나는 다음 줄을 얻었다 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'

, 및 sudo3개의 매개변수가 표시 됩니다 .sh-cdate >/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

관련 정보