如何编写端口触发唤醒脚本

wen 实用脚本 2

本文目录导读:

如何编写端口触发唤醒脚本

  1. 基于WOL(Wake-on-LAN)的唤醒脚本
  2. 端口监测触发唤醒脚本
  3. 定时检测并唤醒脚本
  4. Web API触发唤醒
  5. 系统服务配置
  6. 使用说明
  7. 注意事项

我来为您介绍几种编写端口触发唤醒脚本的方法,包括常见的网络唤醒(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

注意事项

  1. 网络配置:确保目标设备的BIOS和网卡支持WOL并已启用
  2. 防火墙:放开必要的端口(WOL使用UDP 9端口)
  3. 权限:可能需要root权限来发送原始网络包
  4. 安全性:建议添加认证机制,防止未授权使用
  5. 可靠性:WOL依赖于广播域,确保在同一子网内

根据您的具体需求选择合适的方案,并调整配置参数。

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