Les spécifications de WOL sont les suivantes (WireShark Wiki).
https://wiki.wireshark.org/WakeOnLAN
Bref, dans le paquet
Cela arrive généralement. Peu importe le port, il est bon de le voir en faisant correspondre le modèle, donc je pense qu'il est possible de le détecter avec du matériel et d'émettre une interruption.
Donc, si vous voulez envoyer ceci, je pense qu'il est facile de créer un paquet UDP. Il semble y avoir un tel outil, mais pour autant que j'ai fait une recherche rapide, il y en avait beaucoup qui me permettaient de spécifier par adresse IP. Si tel est le cas, il sera difficile de délivrer l'adresse IP de manière appropriée. J'ai donc essayé d'implémenter une méthode pour spécifier directement le contrôleur et l'envoyer.
Scapy
Utilisez Scapy pour générer et envoyer des paquets WOL. Scapy elle-même a déjà été écrite brièvement. Moins que
https://qiita.com/ken_hamada/items/736e1c22f6c40702d1a7
J'utilise également Scapy. Je pense que cela fonctionnera probablement aussi sous Linux.
C'est comme faire référence au code ci-dessous ou le couper et le coller en fonction de ceux-ci. Merci beaucoup!
blog de ko
https://thinkami.hatenablog.com/entry/2018/01/13/224841
Le blog de thinkAmi
https://irukanobox.blogspot.com/2017/08/raspberry-pipython3pc.html
Il est plus rapide de regarder le code pour voir comment c'est fait, ci-dessous.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from scapy.all import *
import binascii
# ---->Veuillez définir ici de manière appropriée.
#Cible de contrôle. Veuillez spécifier la chose réelle pour cela.
TARGET_MAC_ADDRESS = "11:22:33:44:55:66"
#Adresse IP à mettre sur le paquet. Cela peut être n'importe quoi.
IP_ADDRESS = "66.77.88.99"
#Un contrôleur qui crée des paquets. Veuillez également spécifier la chose réelle.
PCAP_ifname = "en0"
# <-----Jusque là
def issue_WOL():
'''
Tout d'abord, créez la charge utile. Comme vous pouvez le voir dans le code,
Mot de passe ci-dessous(optional)Je fais juste quelque chose qui omet.
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
'''
Générez un paquet WOL qui envoie la charge utile ci-dessus en tant qu'UDP.
'''
ether_layer = Ether(dst=TARGET_MAC_ADDRESS)
ip_layer = IP(dst=IP_ADDRESS)
udp_layer = UDP(sport=44444,dport=33333) #adapté
raw_layer = Raw(load=payload) #La charge utile peut être spécifiée en octets.
wol_packet = ether_layer / ip_layer / udp_layer / raw_layer
'''
Vous pouvez utiliser Layer2 car vous n'avez qu'à envoyer le package brut.
Si vous spécifiez le contrôleur à ce moment, il devrait sortir de là ...
'''
sendp(wol_packet, iface=PCAP_ifname)
print ("sent WOL ", TARGET_MAC_ADDRESS, IP_ADDRESS)
if __name__ == "__main__":
issue_WOL()
Pour l'utiliser, réécrivez TARGET_MAC_ADDRESS, IP_ADDRESS, PCAP_ifname en fonction de votre environnement et de votre cible, et exécutez ce code, vous devriez obtenir un paquet WOL (sudo est requis).
IP_ADDRESS n'a pas à penser à l'adresse cible actuelle. En fait, même si vous spécifiez une adresse en désordre, vous recevrez ce qui suit (vérifiez avec le WireShark opposé). En effet, vous pouvez passer directement de la couche 2 au contrôleur.
c'est tout. Eh bien, avec scapy ce n'était pas trop difficile (Pendant l'écriture, Raw (même si j'étais assez accro au modèle de données spécifié par load = ...)
Recommended Posts