首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 遠端關機/重開機/登出實作:手機瀏覽器控制電腦的局域網方案

     編輯:PHP 綜合知識

利用 PHP 執行系統指令(`shutdown`),配合簡單的 Web 介面,即可在局域網內透過手機瀏覽器遠端控制電腦關機、重開機或登出。本文提供完整實作碼、安全性強化建議、跨平台指令對照表與部署注意事項。

核心原理

PHP 在伺服器端執行 `system()` / `exec()` / `shell_exec()` 呼叫作業系統原生關機指令。需求:

  • PHP 執行身分(Apache/Nginx 用戶、PHP-FPM pool user)擁有關機權限。
  • Windows:需 `SeShutdownPrivilege`;Linux:需 `sudo` 免密或 `setuid`。
  • 僅限信任的局域網環境,**切勿暴露於公網**。

完整實作碼(單檔版)

<?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);

Windows 權限設定關鍵步驟

  1. 開啟「本機安全性原則」→「本機原則」→「使用者權利指派」→「關閉系統」,加入 Apache/PHP-FPM 執行用戶(如 `NETWORK SERVICE`、 `IIS_IUSRS` 或自訂用戶)。
  2. 或使用 `nssm` 將 PHP 註冊為服務,以 `SYSTEM` 身分執行(最高權限,需謹慎)。
  3. 防火牆開放 Apache/PHP 監聽埠(預設 80/443)的區域網輸入。

Linux 權限設定(sudo 免密)

# 編輯 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 次,防濫用

擴充應用:整合 Home Assistant / MQTT / Telegram Bot

  • 將此端點封裝為 REST API,供 Home Assistant `shell_command` 或 `rest_command` 呼叫。
  • MQTT 訂閱 `home/pc/shutdown` 主題,收到訊息觸發指令。
  • Telegram Bot 接收 `/shutdown` 指令,驗證使用者 ID 後呼叫 API。

這個小工具在「躺在床上發現電腦還開著」、「遠端完成任務後想關機」等情境極為實用,但務必嚴守「僅限信任區域網 + 多層驗證」原則,避免變成駭客的關機按鈕。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved