私は次の行を得ました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
2つのパラメータが-c
表示され、date >/tmp/date
コマンドには引用符は表示されません。繰り返しますが、ここにある引用はsudo
誰も見ることができません。
sudo sh -c 'date >/tmp/date'
、およびsudo
3つのパラメータが表示されます。sh
-c
date >/tmp/date
だから私の提案は、必要なタスクを実行する短いシェルスクリプトを作成して追加することです。それあなたのファイルにsudoers
。 (rootとして次のコマンドブロックを実行してsudo -s
rootシェルを取得します。)
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