
私はインターネットラジオも再生できるウェブサーバーを持っています。www-dataユーザーとして、いくつかのコマンドを実行したいのですが、例えば、私はこれを次のように作成しました。/etc/sudoersファイル:
www-data ALL=(ALL) NOPASSWD: /usr/bin/amixer
PHP では、次のようにしてパスワードを使用せずにボリュームを操作できます。
exec('sudo -u user amixer set Master 3%-');
そして:
exec('sudo -u user amixer set Master 3%+');
しかし、今度は次のコマンドを実行して自分のサービスを再起動できるようにしたいと思います。
exec('sudo -u user service servicename restart');
そこで私は試してみました:
www-data ALL=(ALL) NOPASSWD: /usr/bin/amixer, NOPASSWD: /bin/service
この:
www-data ALL=(ALL) NOPASSWD: /usr/bin/amixer, /bin/service
そして、これも:
www-data ALL=(ALL) NOPASSWD: /usr/bin/amixer
www-data ALL=(ALL) NOPASSWD: /bin/service
しかし、どれも機能していないようです。助けてください。
すみません、私のミスでした。いくつか変更を加えて、/sbinから/binにリンクしようとしました。
今は次のように変更しました:
www-data ALL=(ALL) NOPASSWD: /usr/bin/amixer, NOPASSWD: /usr/sbin/service
そして、それは動作します! ありがとう! トピックは終了しました。
答え1
ソリューションには注意してください。この方法では、あらゆるサービスを開始、停止、または再起動できます。
次のコマンドを実行するシェル スクリプトを作成することをお勧めします。
echo "#!/bin/sh' > /usr/bin/amixer_restart
echo "sudo -u user service amixer restart' >> /usr/bin/amixer_restart
適切な権限を付与します (550 は、ルートとグループ www-data が読み取りと実行ができますが、誰も書き込みができないことを意味します)
sudo chown root:www-data /usr/bin/amixer_restart
sudo chmod 550 /usr/bin/amixer_restart
そして、このスクリプトで Apache が sudo を実行できるようにします。
www-data ALL=(ALL) NOPASSWD: /usr/bin/amixer_restart
答え2
最終的に私がやったことは次の通りです:
- apache2をインストールするには、
sudo apt-get install apache2
- ApacheがCGIスクリプトを実行できることを確認するには、次のコマンドを実行します。
sudo a2enmod cgi
- Apacheを再起動します
sudo service apache2 restart
以下のスクリプトを作成してbashスクリプトを実行できることを確認します。
/usr/lib/cgi-bin/test.sh
#!/bin/bash # get today's date OUTPUT="$(date)" USR=$(whoami) # headers echo "Content-type: text/plain" echo "" # body echo "Today is $OUTPUT" echo "Current user is $USR"
スクリプトを実行可能にする
chmod +x /usr/lib/cgi-bin/test.sh
スクリプトを実行できることを確認すると
curl localhost/cgi-bin/test.sh
、次の応答が返されます。Today is Wed Sep 6 12:19:34 PDT 2017 Current user is www-data
ユーザーは www-data なので、そのユーザーを sudoer として追加します。次に、ファイルの
/etc/sudoers
最後に次の行を追加してファイルを変更します。www-data ALL=(ALL) NOPASSWD: ALL
これで、そのユーザーは root 権限を持つことになります。次に、test.sh スクリプトを次のように変更します。
#!/bin/bash # get today's date OUTPUT="$(date)" USR=$(sudo whoami)
その後、再度 get リクエストを実行すると、次の応答が表示されます
localhost/cgi-bin/test.sh
。Today is Wed Sep 6 12:28:38 PDT 2017 Current user is root