/etc/sudoersにwww-dataを追加しても、PHP shell_exec()でコマンドを実行することはできません。

/etc/sudoersにwww-dataを追加しても、PHP shell_exec()でコマンドを実行することはできません。

私は Raspberry Pi 上の Raspbian (Debian ベース) でウェブサーバー lighttpd を実行しています。サーバーはユーザー www-data として実行されます ( で確認済みps aux)。 に次の行を追加しました/etc/sudoers:

www-data ALL=NOPASSWD:/opt/vc/bin/vcgencmd

vcgencmdPHPファイル内からステータス情報を提供するツールをRaspberry Piから実行できるようにするには

<? echo shell_exec('vcgencmd version'); ?>

出力されるのは、「VCHI の初期化に失敗しました」という内容だけです ( がなくても自分のユーザーで実行したときに表示されるバージョン情報ではなくsudo)。これは、vcgencmd が間違った権限で実行されたときに表示されます。

例えばランニング

<? echo shell_exec('cat /sys/class/thermal/thermal_zone*/temp'); ?>

変更しなくても正常に動作する/etc/sudoersので、PHP に問題はありません (禁止されているshell_execなど)。

コマンドを実行するために他に何を設定する必要がありますか?

答え1

に追加したものを使用する場合は/etc/sudoers、 を呼び出す必要がありますsudo

sudoは、setuid ビットが設定された単なるプログラムです。これ以外に特別なことは何もありません。つまり、プログラムが起動されるたびに介入するわけではありません。

呼び出すことができるのcat /sys/class/thermal/thermal_zone*/tempは、それらのファイルへの読み取りアクセス権を持っているからです。ファイルシステムの権限の設定によっては、読み取りアクセス権があっても、必ずしも書き込みアクセス権があるとは限りません。

理由は、vcgencmd version自分のユーザーには 2 つの説明が考えられるため、起動時に機能する可能性があります。

  1. alias vcgencmd='sudo vcgencmdあなたのプロフィールにはがあるため、自動的に が実行されますsudo
  2. 操作する必要があるファイルに対する十分な権限がありますvcgencmd。書き込みアクセスが必要で、そのファイルが自分が所属するグループによって所有されており、そのグループに対して書き込みアクセス権限を持っている場合は、sudo は必要ありません。

要約すると、コマンドを に変更するかsudo vcgencmd version、変更する必要があるファイル権限を見つけて変更します。

関連情報