Wake on LAN

Wake on LANをWindowsでPHPを使ってやろうと思っていろいろ探していたら
yuecさんのページ、下記アドレスにて
http://www.yuec.net/blog/article.php?id=42
に詳しく紹介してあった。
それを元に早速やってみる。

まずは簡単な呼び出し用のHTML(index.html)を作る。


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset= EUC-JP">
<title>WOL-Switch</title></head>
<BODY BGCOLOR="#ffe0c0">
<H3 align="center">WOL-Switch-Windows版</H3>
<HR>
<p align="center">パソコンの電源をWake on LANします。</p>
<form action="./wake_on_lan.php" method="post">
<HR>
<div align="center">
<input type="radio" name="SelectName" value="compA" id="comp_a">
<label for="パソコンA">パソコンA</label>
<input type="radio" name="SelectName" value="compB" id="comp_b">
<label for="パソコンB">パソコンB</label>
<input type="submit" value="リモートON 実行">
</div>
</form>
<HR>
</body>
</html>

実際のWOL呼び出し部分を作る(wake_on_lan.php)

<?php

//起動するパソコンのMAC Addressをここに
$A_mac = '************';
$B_mac= '************';

////初期化
$mac = '';
$mac2= '';

////正しくパソコン名がpostされているなら$SelNameに代入
if (isset($_POST["SelectName"])) {
 $SelName = $_POST["SelectName"];
}
else {
 $SelName = "";
  print("コンピュータを正しく選択してません。<br>");
 print('<A HREF="./">ここをクリック</A>');
 exit;
}

if ($SelName == 'compA') { $mac = $A_mac; }
if ($SelName == 'compB') { $mac = $B_mac; }

////紹介されているものをそのまま使わせて頂いて
$mac2 = $mac;
$body = h2s('FFFFFFFFFFFF');
for($i=0;$i<16;$i++) {
 $body .= h2s($mac);
}
$soc = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_connect($soc, '192.168.0.255', 2304);
socket_write($soc, $body, 126);
socket_close($soc);

function h2s($h) {
 $s = '';
 $p = 0;
 while($p<strlen($h)) {
 $s .= chr(intval(substr($h, $p, 2), 16));
 $p += 2;
 }
 return $s;
}
//////Wake ON LANした後の画面表示 
echo
<<<HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
 <META http-equiv="Content-Type" content="text/html; charset=EUC-JP">
 <TITLE>WOL起動</TITLE>
 <LINK rel="stylesheet" href="./css_.css" type="text/css">
<BODY>
 <H1>起動コンピュータ情報</H1>
HTML;

print( 'コンピュータ名: ' . $SelName . '<br>');
print( 'MACADRESS: ' . $mac . '<br>');

echo
<<<HTML_
 <H2>▼WOLで起動しました</H2><HR>
 <a href="../">>>【TopPageへ】</a><br>
</body>
</html>
HTML_;
?>

これでともかくWake On LAN は動作するようだ。
ただし、予めphpのほうでsocket関数が使えるように変更しておかなければならない。
実際にphpでソケット関数を使えるようにするには

Windows版のphpの場合簡単で
php.iniの以下の行を

;extension=php_sockets.dll

のコメント(;)をはずして以下のように

extension=php_sockets.dll

しておく必要がある。

Linux版のphpの場合は、コンパイルの際のconfigureオプションに
‘–enable-sockets’ を指定する必要がある。
しかし実際、Debian Linux等を使用して方はパッケージでphpを入れている方も多い。
使いたいが為とはいえ、変更にコンパイル作業は非常にかったるい。
そこで、Linuxには便利にもWOL用コマンドがあるのでそれを利用する。
実際使うコマンドもいろいろあるようだが今回はwakeonlanコマンドを使うことにした。

インストールは普通にapt-get等で普通に入れる。
入ったら使い方は簡単、wakeonlanコマンドの後にONするパソコンのマックアドレスを
入れるだけ。それではやってみることにする。

最初と同じように、簡単な呼び出し用のHTML(index.html)を作る。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC_JP">
<title>WOL-Switch</title>
</head>
<BODY BGCOLOR="#ffe0c0">

<H3 align="center">WOL-Switch-Linux版</H3>
<HR>
<p align="center">パソコンの電源をWake on LANします。</p>
<form action="./wol_linax.php" method="post">
<HR>
<div align="center">
<input type="radio" name="SelectName" value="compA" id="comp_a">
<label for="パソコンA">パソコンA</label>
<input type="radio" name="SelectName" value="compB" id="comp_b">
<label for="パソコンB">パソコンB</label>
<input type="submit" value="リモートON 実行">
</div>
</form>
<HR>
</body>
</html>

実際のWOL呼び出し部分を作る(wol_linux.php)

<?php
/////////////////////////////////////////////////////////////////////
//起動するパソコンのMAC Addressをここに
  $A_mac = '**:**:**:**:**:**';
  $B_mac = '**:**:**:**:**:**';
////初期化///////////////////////////////////////////////////////////
  $mac = "";
  $SelName = "";
/////////////////////////////////////////////////////////////////////

////正しくパソコン名がpostされているなら$SelNameに代入
  if (isset($_POST["SelectName"])) {
    $SelName = $_POST["SelectName"];
  }
  else {
    $SelName = "";
    print("コンピュータを正しく選択してません。<br>");
    print('<A HREF="./">ここをクリック</A>');
    exit;
  }

  if ($SelName == 'compA') { $mac = $A_mac; }
  if ($SelName == 'compB') { $mac = $B_mac; }

////画面表示/////////////////////////////////////////////////////////
echo
<<<HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
 <META http-equiv="Content-Type" content="text/html; charset=EUC-JP">
 <TITLE>WOL起動</TITLE>
 <LINK rel="stylesheet" href="./css_.css" type="text/css">
<BODY>
 <H1>起動コンピュータ情報</H1>
 <p>sending wol to fluorite</p>
 <p>...</p>
HTML;

//WOL起動

system("wakeonlan " . $mac);

//Wake ON LANした後の画面表示 
echo
<<<HTML_
  <p>...</p>
  <H2>▼WOL起動動作終了しました</H2><HR>
  <a href="../">>>【TopPageへ】</a><br>
  </body>
  </html>
HTML_;
?>

こんなもんで動くでしょ。

これらを自宅サーバーのパスワードでユーザー制限しておける場所にセットして
外部からいたずらされないようにしておけばインターネットからでも自宅のパソコンを
ONが出来る。
ONさえ出来れば後はリモートコントロールソフト等を予め入れておくことで、外出先
から自宅のパソコンを全てコントロール出来る。
便利な世の中になったものです。

桃の花

画像「桃の花」
画像「桃の花」

茨城県古河市の古河総合公園に桃の花を見に行ってきました。
今日は曇りがちで今ひとつのお天気でしたが会場はなかなかの賑わいでした。
ただ、杉花粉症の私。屋外に長くいたためか非常にダメージがありました。
桃の花もよいものです。

DDNSの更新

当サーバーは名前から判るようにDynamic DO!.jpを使用させていただいて動的なIPアドレスで
個人ユーザしている。
サーバーの種類も、最近多くなって来ている国外からスパム等もあり、Windowsサーバーを
使ったり、Linuxサーバー(玄箱)を使ったりいろいろ状況に応じて切り替えてメンテを行っている。
DDNS更新はWindowsサーバーではDiCEを使って更新して、Linuxでは240ネット(http://240net.ddo.jp/)の
crontabで更新する方法を使っている。
そんな中、最近玄箱でDDNS更新が旨く行われない事に気がついた。
原因を調べると、自分のサーバードレスチェックをhttp://info.ddo.jp/remote_addr.phpを使って
調べていたのだが、どうもそのddo.jpからの戻り値は変更となったようだ。
1行目はただ改行となり、今までのアドレス情報は2行目からに変更となったようだ。
そうなると、240ネットで紹介のipchk.plはそのままでは最初の改行だけの空文だけを受け取っ
て正しく動作しない。その行は単純に捨てて2行目を受け取るように変更すべきでしょう。
しかし、ddo.jpのホームページをよく見ていないので判らないが、何故無駄な改行を頭に入れる
事になったのでしょう?んーー判らない・・・

新規つぶやき

困ったことに国外からのスパム等を集中して受け、サーバーに過大な負荷がかかりました。
それにより動作不良となりシステムが壊れ、過去のblogを失うことになりました。
ある程度のコンテンツの復旧は出来ますが、リンク等もあり完全復旧は難しい状況です。
誠に申し訳ない状態となってしまいましたが、過去は振り返らず新規に続けて行く事になりました。どうぞよろしく。
しかし、スパム怖いですねー。

管理者日常のつぶやき