Почему не работает скрипт python в Linux?

При посылке magic пакета в Windows происходит выполнение команды, которая прописана в скрипте, но в Linux при соотвествующем условии - нет. Нужная команда прописана в конце скрипта. Что должно происходить - запускаю скрипт, он начинает слушать порт 9999, посылаю с другого устройства magic пакет на этот порт, соответственно должна выполняться команда reboot, но этого не происходит. Почему и как это исправить?

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)

Пробовал дебаг в PyCharm, показывает (это полный traceback, больше ничего нет)

/usr/bin/python3.12 /home/blagoyar/Scripts/WoL 9999 [Reboot to Arch].py 
INFO: 2024-11-01 10:57:53,126 Listening on 192.168.0.2:9999
Traceback (most recent call last):
  File "/home/blagoyar/Scripts/WoL 9999 [Reboot to Arch].py", line 68, in <module>
    run_udp_port_listener(WOL_PORT, INTERFACE_NAME_ARCH)
  File "/home/blagoyar/Scripts/WoL 9999 [Reboot to Arch].py", line 54, in run_udp_port_listener
    data, _ = server_socket.recvfrom(1024)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
KeyboardInterrupt

Process finished with exit code 130 (interrupted by signal 2:SIGINT)

это полный код Trace, за исключением KeyboardInterrupt


Ответы (1 шт):

Автор решения: Простой Человек

Всё оказалось как всегда намного проще. Просто с телефона (в моём случае; или с устройства, с которого посылается пакет) нужно указывать не только mac адрес (как в случае с Windows), но и IP (подозреваю, что это для всех Linux так), то есть, например скриптом termux-а на андроид прописываю такую команду:

wol -p [порт] -h [ip] [mac-address]

Для Windows достаточно так

wol -p [порт] [mac-address]

ПС. Всем спасибо за помощь!

→ Ссылка