利用 PHP 執行系統指令(`shutdown`),配合簡單的 Web 介面,即可在局域網內透過手機瀏覽器遠端控制電腦關機、重開機或登出。本文提供完整實作碼、安全性強化建議、跨平台指令對照表與部署注意事項。
PHP 在伺服器端執行 `system()` / `exec()` / `shell_exec()` 呼叫作業系統原生關機指令。需求:
<?php
// shutdown.php
// 部署於本機 Web 根目錄,僅允許區域網 IP 存取
// --- 安全性設定 ---
$allowedNetworks = ['192.168.1.', '10.0.0.', '172.16.']; // 允許的網段前綴
$requireAuth = true; // 是否啟用簡易密碼
$authPassword = 'your_strong_password_here'; // 請務必修改
// --- IP 白名單檢查 ---
$clientIp = $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0';
$allowed = false;
foreach ($allowedNetworks as $prefix) {
if (str_starts_with($clientIp, $prefix)) { $allowed = true; break; }
}
if (!$allowed) {
http_response_code(403);
exit('存取被拒絕:IP 不在允許名單中');
}
// --- 簡易密碼驗證 ---
if ($requireAuth) {
$inputPass = $_POST['password'] ?? ($_GET['password'] ?? '');
if (!hash_equals(hash('sha256', $authPassword), hash('sha256', $inputPass))) {
// 顯示密碼輸入表單
showForm('請輸入密碼');
exit;
}
}
// --- 指令對照表(跨平台) ---
$commands = [
'shutdown' => PHP_OS_FAMILY === 'Windows' ? 'shutdown /s /t 0' : 'shutdown -h now',
'reboot' => PHP_OS_FAMILY === 'Windows' ? 'shutdown /r /t 0' : 'shutdown -r now',
'logout' => PHP_OS_FAMILY === 'Windows' ? 'shutdown /l' : 'pkill -u ' . get_current_user(),
];
// --- 執行邏輯 ---
$message = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$action = $_POST['action'] ?? '';
if (isset($commands[$action])) {
$cmd = $commands[$action];
// 記錄稽核日誌
error_log(sprintf('[SHUTDOWN] IP=%s Action=%s CMD=%s', $clientIp, $action, $cmd));
// 執行(背景執行避免 PHP 逾時)
if (PHP_OS_FAMILY === 'Windows') {
pclose(popen('start /B ' . $cmd, 'r'));
} else {
exec($cmd . ' > /dev/null 2>&1 &');
}
$message = "指令已送出:$action(系統將在瞬間執行)";
} else {
$message = '無效操作';
}
}
// --- 介面渲染 ---
function showForm(string $msg = ''): void
{
global $message, $requireAuth;
$msgHtml = $msg ? '<div class="alert">' . htmlspecialchars($msg) . '</div>' : '';
$passField = $requireAuth ? '<input type="password" name="password" placeholder="密碼" required>' : '';
echo <<<HTML
<!DOCTYPE html>
<html lang="zh-TW">
<head>
<meta charset="UTF-8">
<title>遠端電源控制</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
body{font-family:sans-serif;max-width:400px;margin:2rem auto;padding:1rem;}
select,button{width:100%;padding:.8rem;font-size:1rem;margin:.5rem 0;}
.alert{background:#fff3cd;border:1px solid #ffc107;padding:1rem;margin-bottom:1rem;border-radius:4px;}
</style>
</head>
<body>
<h2>🖥️ 遠端電源控制</h2>
$msgHtml
<form method="post">
$passField
<select name="action">
<option value="shutdown">🛑 關機</option>
<option value="reboot">🔄 重開機</option>
<option value="logout">🚪 登出</option>
</select>
<button type="submit">執行</button>
</form>
</body>
</html>
HTML;
}
showForm($message);
# 編輯 sudoers
visudo
# 加入(假設 PHP-FPM 執行用戶為 www-data)
www-data ALL=(ALL) NOPASSWD: /sbin/shutdown, /sbin/reboot, /usr/bin/pkill
# 修改指令前加 sudo
$commands = [
'shutdown' => 'sudo shutdown -h now',
'reboot' => 'sudo shutdown -r now',
'logout' => 'sudo pkill -u www-data',
];
| 措施 | 說明 |
|---|---|
| IP 白名單 | 僅允許區域網段存取,拒絕公網 IP |
| HTTPS + 基本認證 | Nginx/Apache 層面加上 `auth_basic`,雙重保護 |
| CSRF Token | 表單加入隱藏 token,防止誤觸/跨站請求 |
| 稽核日誌 | 記錄 IP、時間、動作、指令,便事後追蹤 |
| 確認對話框 | 前端 JS `confirm('確定要關機嗎?')` 防手滑 |
| 限制執行頻率 | 同一 IP 分鐘內最多 1 次,防濫用 |
這個小工具在「躺在床上發現電腦還開著」、「遠端完成任務後想關機」等情境極為實用,但務必嚴守「僅限信任區域網 + 多層驗證」原則,避免變成駭客的關機按鈕。