在 Web 開發中,有時需要讓使用者透過瀏覽器自行修改 Linux 或 Unix 系統帳號密碼。本文詳細說明如何結合 PHP、Shell 腳本與 sudo 機制,安全地實現此功能。
此腳本利用 expect 自動化 passwd 指令互動,已在 Linux 與 FreeBSD 測試通過。請建立 chpasswd 檔案,內容如下:
#!/bin/sh
#
exec expect -f "$0" ${1+"$@"}
set password [lindex $argv 1]
spawn passwd [lindex $argv 0]
sleep 1
expect "assword:"
send "$password\r"
expect "assword:"
send "$password\r"
expect eof
賦予執行權限並複製至 Web 目錄(Apache 為 /var/www/,Lighttpd 為 /home/lighttpd/):
chmod +x chpasswd
cp chpasswd /var/www/ # Apache
# 或
cp chpasswd /home/lighttpd/ # Lighttpd
測試執行:
$ chpasswd username password
Web 伺服器通常以非 root 使用者運行(Apache 為 www-data,Lighttpd 為 lighttpd 或 httpd)。編輯 sudoers:
# visudo
加入以下行(視 Web 伺服器而定):
# Apache
www-data ALL=NOPASSWD: /var/www/chpasswd
# Lighttpd
httpd ALL=NOPASSWD: /home/lighttpd/chpasswd
儲存離開後,Web 使用者即可免密碼執行該腳本修改系統帳號密碼。
<?php
$username = escapeshellarg($_POST['username']);
$password = escapeshellarg($_POST['password']);
$cmd = "sudo /var/www/chpasswd $username $password";
$output = shell_exec($cmd);
echo $output ? "密碼修改成功" : "修改失敗:$output";
?>