php+apache 執行 sudo 命令出現 sudo: no tty present and no askpass program specified

php 用 exec (或 shell_exec 等)在 command line 下以 sudo 執行命令的時候,會出現sudo: no tty present and no askpass program specified的錯誤。主要原因是因為在 php + apache 的環境下,預設執行程式的身分是 www-data,但是這個身分沒有 sudo 的權限。

懶惰的方式就是把 www-data 加入 sudo 權限內,但是這樣的方式太不安全,一旦被 hack 進來就等於可以透過網頁做任何事情了。比較好的方式是將 www-data 身分設定可以對需要的命令以 sudo 去執行。

$ sudo visudo
www-data        ALL=(ALL) NOPASSWD: /PATH/TO/THE/EXECUTE/BINARY/FILE