本文目录导读:

📦 脚本:wol_scheduler.sh
#!/bin/bash
# =============================================
# 定时发送网络唤醒包 (Wake-on-LAN) 脚本
# 用法:配合 cron 或 systemd timer 使用
# =============================================
# ---------- 配置区 ----------
# 目标设备的 MAC 地址(必填)
MAC_ADDRESS="00:11:22:33:44:55"
# 目标 IP / 广播地址(可选,默认广播地址 255.255.255.255)
BROADCAST_IP="255.255.255.255"
# UDP 端口(默认 9,也可用 7 或 0)
PORT=9
# 日志文件(可选,留空则不记录)
LOG_FILE="/var/log/wol_scheduler.log"
# ---------- 函数:发送 WoL 包 ----------
send_wol() {
# 生成魔法包:6个0xFF + 16次MAC地址
MAC=$(echo "$MAC_ADDRESS" | tr -d ':-')
if [ ${#MAC} -ne 12 ]; then
echo "[ERROR] 无效的 MAC 地址格式: $MAC_ADDRESS"
exit 1
fi
# 构建原始包(十六进制)
PACKET=$(printf 'ff%.0s' {1..6})
for i in {1..16}; do
PACKET+="$MAC"
done
# 发送 UDP 数据包
echo -n "$PACKET" | xxd -r -p | nc -w1 -u "$BROADCAST_IP" "$PORT"
local ret=$?
# 日志记录
if [ -n "$LOG_FILE" ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') | WoL to $MAC_ADDRESS -> $BROADCAST_IP:$PORT | exit=$ret" >> "$LOG_FILE"
fi
return $ret
}
# ---------- 主程序 ----------
echo "[INFO] 发送 Wake-on-LAN 包..."
if send_wol; then
echo "[OK] WoL 包已发送至 $MAC_ADDRESS"
else
echo "[FAIL] 发送失败 (exit code: $?)"
exit 2
fi
exit 0
⚙️ 使用方法
1️⃣ 配置脚本
- 修改
MAC_ADDRESS为目标设备的 MAC 地址(必填) - 可选修改
BROADCAST_IP(如168.1.255)和PORT(默认 9)
2️⃣ 赋予执行权限
chmod +x wol_scheduler.sh
3️⃣ 测试运行
./wol_scheduler.sh
4️⃣ 设置定时任务(使用 cron)
# 每天 08:30 唤醒设备 30 8 * * * /path/to/wol_scheduler.sh # 每天 22:00 唤醒 0 22 * * * /path/to/wol_scheduler.sh # 工作日 07:00 唤醒 0 7 * * 1-5 /path/to/wol_scheduler.sh
添加到 crontab:
crontab -e # 粘贴上述行,保存退出
🔍 依赖检查
脚本使用 nc(netcat)发送 UDP 包,如未安装:
Ubuntu/Debian:
sudo apt install netcat-openbsd
CentOS/RHEL:
sudo yum install nmap-ncat
无需 nc 的备选方案(使用 python 或 perl)可替换发送部分,常见场景中 nc 已足够。
🧪 调试技巧
- 检查日志文件(如果配置了)查看最近发送记录。
- 测试时先手动执行脚本,观察输出。
- 用
tcpdump或 Wireshark 监听目标网段确认包是否发出:sudo tcpdump -i any udp port 9
📌 注意事项
- 目标设备必须 启用 Wake-on-LAN(BIOS/UEFI + 操作系统配置)。
- 发送者(本机)与目标设备应在 同一广播域(通常同一局域网)。
- 如果跨 VLAN,需要网络设备(如路由器/交换机)允许 UDP 广播包转发。
- 广播地址若为
255.255.255则发送到整个局域网;指定子网广播(如168.1.255)可减少干扰。
如果需要 Windows 版本的 PowerShell 脚本 或 systemd timer 配置示例,请告知,我可以补充提供。