在前幾篇文章介紹過 PHP 透過 Sudo 執行 root 指令,對於單行的指令沒有問題,但如果要執行 passwd 修改系統密碼的話便不行了。

要解決可以安裝 super 或 expert,而另一個方法是用非互動的方法修改密碼,但如果主機上有其他用戶可以放置他們的網頁,則不建議使用。以下是具體步驟:

1. 用 root 執行 visudo,加入以下一行:

apache ALL=NOPASSWD:/usr/bin/passwd [A-z]*, !/usr/bin/passwd root

以上後面的部份是禁止透過 sudo 修改 root 的密碼,而基於安全理由,最好將其他較重要的用戶也禁止,例如 root 群組的用戶。

2. 以下是 PHP 的部份,會修改 user 的密碼,而密碼設成 pass:

PHP:
  1. <?php
  2. shell_exec("/bin/echo 'pass' | /usr/bin/sudo /usr/bin/passwd --stdin user");
  3. ?>