定时发送网络唤醒包的脚本

wen 实用脚本 2

本文目录导读:

定时发送网络唤醒包的脚本

  1. 📦 脚本:wol_scheduler.sh
  2. ⚙️ 使用方法
  3. 🔍 依赖检查
  4. 🧪 调试技巧
  5. 📌 注意事项

📦 脚本: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 的备选方案(使用 pythonperl)可替换发送部分,常见场景中 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 配置示例,请告知,我可以补充提供。

抱歉,评论功能暂时关闭!