たまに普段使用していないスリープ中のMacを起こす必要が出る。
そのMacは、ディスプレイもキーボード・マウスもつないでいない。
そこでWOLの出番だ。
以下のスクリプトは、もはや何処のサイトを参考にしたか覚えていないが
RubyやPythonのWOLスクリプトを載せているサイトを参考にして1年ほど前に作成したもの。
#!/usr/bin/ruby # Wake on Lan Script require 'socket' sock = UDPSocket.open() sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, 1) # broadcastのIPアドレスを指定 broadcast = '192.168.0.255' # 接続先のmacアドレスを指定 mac = "00:00:00:00:00:00" # magic packet magic = (0xff.chr) * 6 + (mac.split(/:/).pack("H*H*H*H*H*H*")) * 16 print magic + "\n" sock.send(magic, 0, broadcast, "discard")
以下の様な記述でも可能だとされていたが、Socketへの追記でPermissionErrorが発生したので、断念し上記のソースとなった。
sock = Socket.open(Socket::AF_INET, Socket::SOCK_DGRAM, 0) address = Socket.sockaddr_in(80, '192.168.0.255') sock.connect(address) mac = "00:00:00:00:00:00" magic = (0xff.chr) * 6 + (mac.split(/:/).pack("H*H*H*H*H*H*")) * 16 sock.write(magic) print sock.read
改めて勉強しようとしたところ、MagicPacketについては以下のサイトの記述が参考になった。
Wake On LANでコンピュータを起動する - @IT
Socketのオプションは、manで確認しろとRubyのマニュアルにある。
BasicSocket - Rubyリファレンスマニュアル
man 2 socket
ただ英語で出るので解らない。下記の翻訳を参考にする。
Manpage of SOCKET
失敗した方のコードの問題点は、以下の内容を理解する必要がありそうだ。
Manpage of GETSOCKOPT
大して理解もせずとも目的を達成するコードは組めるものだ。
0 件のコメント:
コメントを投稿