Чому сценарій працює в Windows, але не працює в Linux?
Доброго дня всім. Ось такий сценарій
import socket import os import logging import psutil WOL_PORT = 9999 INTERFACE_NAME = "My Lan" INTERFACE_NAME_ARCH = "enp37s0" logging.basicConfig(format="%(levelname)s: %(asctime)s %(message)s", level=logging.INFO) logger = logging.getLogger(__name__) def get_ip_mac_address(interface_name: str) -> tuple: ip_addr = mac_addr = None for item in psutil.net_if_addrs()[interface_name]: addr = item.address if "." in addr: ip_addr = addr elif ("-" in addr or ":" in addr) and "::" not in addr: mac_addr = addr.replace(":", "-").upper() if not ip_addr or not mac_addr or ip_addr == "127.0.0.1": raise "Не удалось получить IP или MAC-адрес сетевого интерфейса" return ip_addr, mac_addr def assemble_wol_packet(mac_address: str) -> str: return f'{"FF-" * 6}{(mac_address + "-") * 16}' def check_is_wol_packet(raw_bytes: bytes, assembled_wol_packet: str) -> int: decoded_packet_data = "-".join(f"{byte:02x}" for byte in raw_bytes).upper() + "-" if decoded_packet_data == assembled_wol_packet: return 1 return 0 def run_udp_port_listener(port: int, interface_name: str): ip_addr, mac_addr = get_ip_mac_address(interface_name) server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) server_socket.bind((ip_addr, port)) logger.info(f"Listening on {ip_addr}:{port}") assembled_wol_packet = assemble_wol_packet(mac_addr) while True: data, _ = server_socket.recvfrom(1024) is_wol_packet = check_is_wol_packet(data, assembled_wol_packet) if is_wol_packet == 1: if os.name == "posix": os.system("reboot") elif os.name == "nt": os.system( "shutdown -r -t 0 -f" ) if os.name == "posix": run_udp_port_listener(WOL_PORT, INTERFACE_NAME_ARCH) elif os.name == "nt": run_udp_port_listener(WOL_PORT, INTERFACE_NAME)
Це чудово працює в Windows. Тобто, суть така, я починаю сценарій, він слухає порт 9999 (WOL). З телефону я надсилаю пакет до цього порту і, відповідно, залежно від ОС (це в умовах сценарію) виконується команда. Тож у Arch я запускаю, netstat -tulpan показує, що порт слухається, надсилаю пакет з телефону, і нічого не відбувається, хоча має бути перезавантаження. Я перевіряв команду окремо — os.system («reboot») працює. Підкажіть в чому проблема?
ПС. Брандмауер не встановлений, iptables -L все на ACCEPT.
Проблема була вирішена — необхідно було додати IP -адресу до сценарію телефону (sh в termux), який надсилає пакет
було
wol -p 9999 macaddress
стало
wol -p 9999 -h 192.168.0.2 macaddress
И все запрацювало :)
Всім дякую за допомогу!
22 коментарі
Додати коментар Підписатись на коментаріВідписатись від коментарів