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'

引用符はユーザー固有の(対話型)シェルから解析され、引用符付き文字列は単一の単語として渡されます。sh2つのパラメータが-c表示され、date >/tmp/dateコマンドには引用符は表示されません。繰り返しますが、ここにある引用はsudo誰も見ることができません。

sudo sh -c 'date >/tmp/date'

、およびsudo3つのパラメータが表示されます。sh-cdate >/tmp/date

だから私の提案は、必要なタスクを実行する短いシェルスクリプトを作成して追加することです。それあなたのファイルにsudoers。 (rootとして次のコマンドブロックを実行してsudo -srootシェルを取得します。)

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

関連情報