外部から社内のパソコンへWake on lanを実装したときのまとめ(サーバー側)
外部からリモートデスクトップするためのwake on lanを実装したときのサーバー側のまとめ
前提資料
http://www.atmarkit.co.jp/ait/articles/0602/25/news014_2.html
必要事項
・外部から見れるサイトを社内にサーバーを立てれること
※Web UIとかログイン認証、sslは別途でやってね
概要
前提として下記の設定が必要になります。(マシンによって異なる)
今回はphpでWake on lanを実施する部分のみ
wakeonlanにはMAC Addressが必要だが、Ip Addressしかわからない人がいるのでコマンドを使って探す処理を実装
//ip address → mac address if(isset($ip_address && $ip_address != ""){ $mac = ""; $pcs = shell_exec("nmap -sP {$ip_address} "); $pcs = shell_exec("arp -a"); $pcss = explode("\n",$pcs); foreach($pcss as $value){ if(strripos($value,$ip_address !== false){ if(preg_match("/([0-9A-Fa-f]{2}[:-]){5}[0-9A-Fa-f]{2}/",$value,$match) === 1){ $mac = $match[0]; break; } } } if($mac != ""){ $ping = " {$ip_address} → MAC address {$mac}"; }else{ $ping = "get faild"; } }
その逆
//mac address → ip address if(isset($mac_address) && $mac_address != ""){ $ip = ""; #Need to change *.*.*. (192.168 or 172.16 or ....) $pcs = shell_exec("nmap -sP 192.168.6.* "); $pcs = shell_exec("arp -a"); $pcss = explode("\n",$pcs); foreach($pcss as $value){ if(strripos($value,$mac_address) !== false){ if(preg_match("/\(([a-zA-Z0-9.]+)\)/",$value,$match) === 1){ $ip = substr(substr($match[0],1),0,-1); break; } } } if($ip != ""){ $ping = "MAC address {$mac_address} → IP address {$ip}"; }else{ $ping = "get failed"; } }
また上記で参照できないことがあるので下記をcronで走らせる *.*.*.は192.168.1や192.168.2、172.16.3等に環境に応じて変える
for a in `seq 1 254`; do ping -c 1 -w 0.5 *.*.*.$a > /dev/null && arp -a *.*.*.$a | grep ether; done
MAC Addressがわかったら下記でバッチに引き数を渡す
※batchの実行ユーザーに気を付ける事、この場合はapacheのユーザーを使用して実行
#run user apache shell_exec("wakeonlan.sh ".$mac_address);
#!/bin/sh echo 'apache' | sudo -S ether-wake $1 echo "$1 start"
その後の起動確認は下記で実装
$res = shell_exec("ping -c 4 -W 5 ".$ip_address); $array = explode("\n",$res); if(strripos($res,'0 received') === false){ $ping = "boot success"; }else{ $ping = "boot failed"; }