Die Spezifikationen von WOL lauten wie folgt (WireShark Wiki).
https://wiki.wireshark.org/WakeOnLAN
Kurz gesagt, im Paket
Es passiert normalerweise. Es spielt keine Rolle, um welchen Port es sich handelt. Sie können ihn durch Abgleichen des Musters erkennen. Ich denke, es ist möglich, ihn mit Hardware zu erkennen und einen Interrupt auszulösen.
Wenn Sie dies senden möchten, ist es meiner Meinung nach einfach, ein UDP-Paket zu erstellen. Es scheint ein solches Tool zu geben, aber soweit ich eine schnelle Suche durchgeführt habe, gab es viele, mit denen ich die IP-Adresse angeben konnte. In diesem Fall ist es schwierig, die IP-Adresse entsprechend zu vergeben. Also habe ich versucht, eine Methode zu implementieren, um den Controller direkt anzugeben und zu senden.
Scapy
Verwenden Sie Scapy, um WOL-Pakete zu generieren und zu senden. Scapy selbst wurde kurz zuvor geschrieben. Weniger als
https://qiita.com/ken_hamada/items/736e1c22f6c40702d1a7
Ich benutze auch Scapy. Ich denke, es wird wahrscheinlich auch unter Linux funktionieren.
Es ist so, als würde man auf den folgenden Code verweisen oder ihn basierend auf diesen ausschneiden und einfügen. Vielen Dank!
Ko Blog
https://thinkami.hatenablog.com/entry/2018/01/13/224841
thinkAmis Blog
https://irukanobox.blogspot.com/2017/08/raspberry-pipython3pc.html
Es ist schneller, sich den Code unten anzusehen, um zu sehen, wie er tatsächlich ausgeführt wird.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from scapy.all import *
import binascii
# ---->Bitte hier entsprechend einstellen.
#Kontrollziel. Bitte geben Sie hierfür die Realität an.
TARGET_MAC_ADDRESS = "11:22:33:44:55:66"
#IP-Adresse, die auf das Paket gesetzt werden soll. Das kann alles sein.
IP_ADDRESS = "66.77.88.99"
#Ein Controller, der Pakete erstellt. Bitte geben Sie auch die Realität an.
PCAP_ifname = "en0"
# <-----Bisher
def issue_WOL():
'''
Erstellen Sie zunächst die Nutzlast. Wie Sie dem Code entnehmen können,
Passwort unten(optional)Ich mache nur etwas, das weggelassen wird.
https://wiki.wireshark.org/WakeOnLAN
'''
synchronization_stream = b"\xff" * 16
mac_bin = binascii.unhexlify("".join(TARGET_MAC_ADDRESS.split(":")))
payload = synchronization_stream + mac_bin * 16
'''
Generieren Sie ein WOL-Paket, das die oben genannten Nutzdaten als UDP sendet.
'''
ether_layer = Ether(dst=TARGET_MAC_ADDRESS)
ip_layer = IP(dst=IP_ADDRESS)
udp_layer = UDP(sport=44444,dport=33333) #geeignet
raw_layer = Raw(load=payload) #Die Nutzdaten können in Bytes angegeben werden.
wol_packet = ether_layer / ip_layer / udp_layer / raw_layer
'''
Sie können Layer2 verwenden, da Sie nur das Rohpaket senden müssen.
Wenn Sie den Controller zu diesem Zeitpunkt angeben, sollte er von dort herauskommen ...
'''
sendp(wol_packet, iface=PCAP_ifname)
print ("sent WOL ", TARGET_MAC_ADDRESS, IP_ADDRESS)
if __name__ == "__main__":
issue_WOL()
Um es zu verwenden, schreiben Sie TARGET_MAC_ADDRESS, IP_ADDRESS und PCAP_ifname entsprechend Ihrer Umgebung und Ihrem Ziel neu und führen Sie diesen Code aus. Es sollte ein WOL-Paket ausgegeben werden (sudo ist erforderlich).
IP_ADDRESS muss nicht an die aktuelle Zieladresse denken. Selbst wenn Sie eine unordentliche Adresse angeben, erhalten Sie Folgendes (wenden Sie sich an den gegenüberliegenden WireShark). Dies liegt daran, dass Sie von Schicht 2 direkt zum Controller wechseln können.
das ist alles. Nun, mit Scapy war es nicht allzu schwierig (Während des Schreibens Raw (obwohl ich ziemlich süchtig nach dem durch load = ... angegebenen Datenmodell war)
Recommended Posts