本文目录导读:

我来为您介绍几种编写端口触发唤醒脚本的方法,包括常见的网络唤醒(WOL)和端口监测唤醒方案。
基于WOL(Wake-on-LAN)的唤醒脚本
Bash脚本版本
#!/bin/bash
# WOL唤醒脚本
# 需要: wakeonlan 工具 (sudo apt-get install wakeonlan)
# 配置参数
MAC_ADDRESS="00:11:22:33:44:55" # 目标MAC地址
BROADCAST_IP="192.168.1.255" # 广播地址
WAKE_PORT=9 # WOL默认端口
# 唤醒函数
wake_up() {
echo "发送WOL魔术包唤醒设备..."
wakeonlan -i $BROADCAST_IP -p $WAKE_PORT $MAC_ADDRESS
# 或者使用原始方式
# python3 -c "
# import socket
# s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
# data = bytes([0xFF]*6) + bytes.fromhex('$MAC_ADDRESS'.replace(':',''))*16
# s.sendto(data, ('$BROADCAST_IP', $WAKE_PORT))
# "
}
# 主程序
wake_up
echo "唤醒请求已发送"
端口监测触发唤醒脚本
Python版本 - 端口监听唤醒
#!/usr/bin/env python3
import socket
import subprocess
import time
import logging
import os
class PortTriggerWakeUp:
def __init__(self, wake_mac, listen_port=5000):
self.wake_mac = wake_mac
self.listen_port = listen_port
self.setup_logging()
def setup_logging(self):
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
self.logger = logging.getLogger(__name__)
def wake_on_lan(self):
"""发送WOL魔术包"""
try:
mac_bytes = bytes.fromhex(self.wake_mac.replace(':', ''))
packet = b'\xff' * 6 + mac_bytes * 16
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock:
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
sock.sendto(packet, ('255.255.255.255', 9))
self.logger.info(f"WOL包已发送到 {self.wake_mac}")
return True
except Exception as e:
self.logger.error(f"发送WOL包失败: {e}")
return False
def listen_for_trigger(self):
"""监听指定端口,收到连接即触发唤醒"""
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server:
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind(('0.0.0.0', self.listen_port))
server.listen(5)
self.logger.info(f"在端口 {self.listen_port} 上监听触发信号...")
while True:
try:
client, addr = server.accept()
self.logger.info(f"收到来自 {addr[0]}:{addr[1]} 的连接")
# 收到连接即触发唤醒
if self.wake_on_lan():
self.logger.info("唤醒请求已发送")
# 发送响应
client.send(b"Wake-up signal received\n")
client.close()
except KeyboardInterrupt:
self.logger.info("服务停止")
break
except Exception as e:
self.logger.error(f"处理连接时出错: {e}")
time.sleep(1)
if __name__ == "__main__":
# 配置
TARGET_MAC = "00:11:22:33:44:55"
TRIGGER_PORT = 5000
wakeup = PortTriggerWakeUp(TARGET_MAC, TRIGGER_PORT)
wakeup.listen_for_trigger()
定时检测并唤醒脚本
Bash版本 - 定期检测端口状态
#!/bin/bash
# 配置
TARGET_IP="192.168.1.100"
TARGET_PORT=80
MAC_ADDRESS="00:11:22:33:44:55"
CHECK_INTERVAL=60
check_and_wake() {
# 使用nc检查端口是否开放
nc -zv -w3 $TARGET_IP $TARGET_PORT > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "[$(date)] 目标 $TARGET_IP:$TARGET_PORT 不可达,发送唤醒包..."
wakeonlan $MAC_ADDRESS
else
echo "[$(date)] 目标在线"
fi
}
# 主循环
while true; do
check_and_wake
sleep $CHECK_INTERVAL
done
Web API触发唤醒
Flask应用版本
#!/usr/bin/env python3
from flask import Flask, request, jsonify
import subprocess
import socket
app = Flask(__name__)
# 配置
WOL_CONFIGS = {
'server1': {
'mac': '00:11:22:33:44:55',
'ip': '192.168.1.100',
'description': '主服务器'
},
'server2': {
'mac': 'AA:BB:CC:DD:EE:FF',
'ip': '192.168.1.101',
'description': '备份服务器'
}
}
def send_wol(mac_address):
"""发送WOL魔术包"""
try:
mac_bytes = bytes.fromhex(mac_address.replace(':', ''))
packet = b'\xff' * 6 + mac_bytes * 16
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock:
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
sock.sendto(packet, ('255.255.255.255', 9))
return True, "WOL包已发送"
except Exception as e:
return False, str(e)
@app.route('/wake/<server_name>', methods=['GET', 'POST'])
def wake_server(server_name):
"""唤醒指定服务器"""
if server_name not in WOL_CONFIGS:
return jsonify({
'success': False,
'message': f'未知服务器: {server_name}'
}), 404
config = WOL_CONFIGS[server_name]
success, message = send_wol(config['mac'])
return jsonify({
'success': success,
'message': message,
'server': server_name,
'description': config['description'],
'mac': config['mac']
})
@app.route('/status', methods=['GET'])
def get_status():
"""获取所有服务器状态"""
status_list = []
for name, config in WOL_CONFIGS.items():
status_list.append({
'name': name,
'description': config['description'],
'mac': config['mac'],
'ip': config['ip']
})
return jsonify(status_list)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080, debug=True)
系统服务配置
systemd服务文件
[Unit] Description=Port Trigger Wake-Up Service After=network.target [Service] Type=simple User=root ExecStart=/usr/local/bin/port_wakeup.py Restart=always RestartSec=10 [Install] WantedBy=multi-user.target
安装服务
# 复制服务文件 sudo cp port-wakeup.service /etc/systemd/system/ # 重新加载服务配置 sudo systemctl daemon-reload # 启用并启动服务 sudo systemctl enable port-wakeup sudo systemctl start port-wakeup # 查看状态 sudo systemctl status port-wakeup
使用说明
安装依赖
# Debian/Ubuntu sudo apt-get install wakeonlan python3-pip pip3 install flask # CentOS/RHEL sudo yum install epel-release sudo yum install wakeonlan python3-pip pip3 install flask
运行脚本
# 运行Python端口监听版本 python3 port_wakeup.py # 运行定时检测脚本 bash check_and_wake.sh # 运行Flask Web API python3 flask_wakeup.py
触发唤醒
# 直接使用wakeonlan命令 wakeonlan 00:11:22:33:44:55 # 通过TCP连接触发(端口监听版) telnet localhost 5000 # 通过HTTP请求触发(Flask版) curl http://localhost:8080/wake/server1
注意事项
- 网络配置:确保目标设备的BIOS和网卡支持WOL并已启用
- 防火墙:放开必要的端口(WOL使用UDP 9端口)
- 权限:可能需要root权限来发送原始网络包
- 安全性:建议添加认证机制,防止未授权使用
- 可靠性:WOL依赖于广播域,确保在同一子网内
根据您的具体需求选择合适的方案,并调整配置参数。