Python ソケット プログラミング
Python で Wake on LAN のマジックパケットを送信する
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import argparse import socket import struct from traceback import print_exc DEFAULT_PORT = 7 # 7 or 9 or 30000 ? #BROADCAST_IPADDR = '<broadcast>' BROADCAST_IPADDR = '255.255.255.255' def send_magic_packet(mac_addr, port=DEFAULT_PORT): # create socket with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock: sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # parse address wol_mac = mac_addr.upper().replace('-', '').replace(':', '') if len(wol_mac) != 12: raise Exception('invalid MAC address format: {}'.format(mac_addr)) buf = b'f' * 2 * 6 + (wol_mac * 16).encode() # encode to magic packet payload magic_packet = b'' for i in range(0, len(buf), 2): magic_packet += struct.pack('B', int(buf[i:i + 2], 16)) # send magic packet print('Sending magic packet for: {}, broadcast port is {} ...'.format(mac_addr, port)) sock.sendto(magic_packet, (BROADCAST_IPADDR, port)) def parse_args(): parser = argparse.ArgumentParser() parser.add_argument('mac_address', help='Target MAC address.', type=str) parser.add_argument('-p', '--port', help='Default broadcast port is {}.'.format(DEFAULT_PORT), default=DEFAULT_PORT, type=int) return parser.parse_args() def main(): args = parse_args() mac_addr = args.mac_address port = args.port try: #mac_addr = "AA:BB:CC:DD:EE:FF" send_magic_packet(mac_addr, port) except BaseException: print_exc() if __name__ == '__main__': main()
実行例:
$ python wol.py
usage: wol.py [-h] [-p port] mac_address wol.py: error: the following arguments are required: mac_address
$ python wol.py -h
usage: wol.py [-h] [-p port] mac_address positional arguments: mac_address Target MAC address. optional arguments: -h, --help show this help message and exit -p port, --port port Default broadcast port is 7.
ターゲットの MAC address にマジックパケットを送信する。
$ python wol.py 68:96:7b:07:21:55
ターゲットの PC が起動する。
Sending magic packet for: 68:96:7B:07:21:55, broadcast port is 7 ...