
---

### 2. `pc_power_script.py`（执行脚本）
```python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
PC 定时开关机辅助脚本
依赖：pip install wakeonlan paramiko
"""

import sys
import argparse
import logging
from wakeonlan import send_magic_packet
import paramiko

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

def power_on(mac, broadcast_ip='255.255.255.255'):
    """发送 WOL 魔术包"""
    try:
        send_magic_packet(mac, ip_address=broadcast_ip)
        logger.info(f"WOL 包已发送至 {mac} (广播 {broadcast_ip})")
        return True
    except Exception as e:
        logger.error(f"开机失败: {e}")
        return False

def power_off(host, username, password, port=22):
    """通过 SSH 执行关机命令"""
    try:
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh.connect(hostname=host, port=port, username=username, password=password, timeout=10)
        # 判断操作系统类型
        stdin, stdout, stderr = ssh.exec_command('uname -s')
        os_type = stdout.read().decode().strip()
        if os_type.startswith('Linux'):
            cmd = 'sudo shutdown -h now'   # 若需 sudo 请配置无密码
        else:
            cmd = 'shutdown /s /t 0'       # Windows
        stdin, stdout, stderr = ssh.exec_command(cmd)
        error = stderr.read().decode().strip()
        if error:
            logger.warning(f"关机命令可能有误: {error}")
        else:
            logger.info(f"关机命令已执行: {cmd}")
        ssh.close()
        return True
    except Exception as e:
        logger.error(f"关机失败: {e}")
        return False

def main():
    parser = argparse.ArgumentParser(description='PC 电源管理')
    parser.add_argument('--action', required=True, choices=['power_on', 'power_off'],
                        help='执行动作')
    parser.add_argument('--mac', help='MAC 地址')
    parser.add_argument('--broadcast', default='255.255.255.255', help='广播 IP')
    parser.add_argument('--host', help='目标 IP')
    parser.add_argument('--username', help='SSH 用户名')
    parser.add_argument('--password', help='SSH 密码')
    parser.add_argument('--port', type=int, default=22, help='SSH 端口')
    args = parser.parse_args()

    if args.action == 'power_on':
        if not args.mac:
            logger.error("缺少 --mac 参数")
            sys.exit(1)
        success = power_on(args.mac, args.broadcast)
    elif args.action == 'power_off':
        if not all([args.host, args.username, args.password]):
            logger.error("缺少 --host/--username/--password 参数")
            sys.exit(1)
        success = power_off(args.host, args.username, args.password, args.port)
    else:
        logger.error("未知动作")
        sys.exit(1)

    sys.exit(0 if success else 1)

if __name__ == '__main__':
    main()