2020年7月30日木曜日

MyDNSへのIPアドレス通知をWindowsのバッチファイルでする方法

MyDNSへのIPアドレス通知をWindowsのバッチファイルでする方法

WindowsのバッチファイルでMyDNSへのIPアドレスを通知するには。
FTPコマンドとHTTT-BASICを使って簡単なバッチファイルで通知する方法を紹介しています。

前提とする環境

mydns.jp ダイナミックDNSサイト

Windows10 (Windows7以降かな)

IPv4/IPv6 デュアルスタック IPv4シングルスタック


以下の記事で説明されているバッチファイルを置く場所は、自身のアクセス権のある場所に配置してください。
オススメは、ご自分のアカウントフォルダーの直下です。トラブルなく動作するのでちょっと幸せになれます。
例えば、
C:\USERS\<user name>\scripts

のような場所になります。以下の説明では 

 C:\USERS\Owner\scripts

であるとして説明しています。適宜読み替えてご利用ください。scriptsフォルダは最初は有りませんので自分で作ります。説明のためのスクリーンショット上では、当方の環境のためC:\USERS\Owner\scripts\mydns-ftpとなっていたりします。スクリプトの配置場所に読み替えてください。

 

■気がつけばMyDNSへのIP通知が止まっていた

Diceは設定ファイルが消えるらしい

いたって面倒くさがりなので、いままでMyDNSへのIPアドレスの通知はDiceというソフトを使っていた。しかし、あるときから通知されなくなっていたようで、MyDNSから『IPアドレスの通知がありません』とメールが来ていた。では、とDiceを見ると通知設定が消えているではありませんか。ネットで調べてみたところ、Diceには設定が消えてしまう不具合があるということでした。いや、たしかに実家PCに入れていたDiceの設定も消えていて、通知が滞るようになっていた。そのたびに再設定していたので、さもありなん。。。と振り返って。いやいや。。。そいつは困るでねーか。と他のアプリに依存しない方法を考えた。
 MyDNSにはPOPやFTP、HTTPでも通知が可能なので、今回バッチファイルで実現できそうなFTPとHTTPS-BASICを使ってMyDNSへのIP通知を実現することにした。

Dice設定が消えた。。。
Dice 設定が消えてるよ!もー

■MyDNSとは(一応)

国内有数のダイナミック・ドメイン・サーバーを提供する無料サイトです。
本来、自宅のサーバーを建てたり自宅へのVPN接続をするために固定IPアドレスを取得したほうが簡単に構築接続できるのですが、固定IPアドレスは別料金であったり、高額化してきています。
そこで、MyDNSを使い固定IPを取得せずにルーターに割り当てられたIPアドレスをMyDNSへ通知することでドメイン名で安価(無料)に接続できるようになります。IPアドレス変動に注意しなくてもWebサーバーを公開したりVPNにドメイン名で接続できるのでより簡単、楽に接続できるのでとても便利です。
とくにMyDNSが優秀なのは、いろいろな方法でIPアドレスを通知することができ、環境に合わせて通知方法を選択できることです。

■MyDNSへIPアドレスを通知する方法

・ソフトを使って通知する DiCEを使う

通知方法で便利で有名なのがDiCEというソフトです。ずっとこれを使っていたのですがコレに設定が消えてしまうという不具合があったのでした。他のPCに設定を移すのも意外と面倒なんです。それなら、バッチファイルを作りそれを他のPCにコピーすれば通知設定が完了するので、バッチファイルの方が融通が効くような気がしてきた。

・POPアクセスを使う メールソフトを使う

他にもメールでIPアドレスを通知する方法があるのですが、いやこれ、Windows10になってから付属の『メール』も設定時にちゃんと暗号化での接続ができないと設定が完了しなくなっています。Office2019等のOffice製品のOutlookでも同様で、暗号化設定ができないと設定が完了しません。
(回避方法はあるので気が向いたら記事書きます)

・FTPを使う

Windows標準のFTPクライアントはコマンドラインから操作できるので、今回はこれを使用しています。 
 
 

・HTTP-BASICを使う <オススメ>

URLに含める形でユーザー名とパスワードを指定できるのでこちらも簡単に通知できます。動作結果がわかるのでこちらのほうがいいかもしれません。

・HTTP-DIRECTを使う

スクリプト言語をつかえばできるのですが、別にインストールする必要があります。他にはPowerShellでできるかな?ただ、PowerShellは実行時にサクッと実行できなくてタスクスケジューラーに登録とかスタートアップに登録でよくハマるであまり好きではありませんw。
 
WindowsにはFTPコマンドがあり、コマンドからサーバーへ接続、ファイルの送信、ファイルの取得ができます。ただ、コマンドラインからの操作では、ユーザー名パスワードで手動で入力する必要があるのですが、今回ユーザー名、パスワードは別ファイルに記載したものをリダイレクトし入力する方式にしました。

バッチファイル ソースコード

FTP接続するバッチファイルとユーザーIDとパスワードを記載したファイル2つのファイルで構成されます。

[mydnsftp2.bat] 

REM mydnsftp2.bat for IPv4 & IPv6 
echo %~dp0
cd /d %~dp0
ftp ipv4.mydns.jp < mydnsftpuser.txt

ftp ipv6.mydns.jp < mydnsftpuser.txt

exit 0

 

[mydnsftpuser.txt] 

mydns1234567
aNatanOPaSSword4

  
1行目 ユーザID
2行目 パスワード
mydnsftpuser.txtは各自のアカウントに合わせて変更してください。

このバッチファイルを適当なフォルダ(C:\USERS\<user name>\scriptsがオススメ)に置いて、スタートアップフォルダにバッチファイルのショートカットを置いたり。タスクスケジューラーで1時間おきに通知とかすれば完成です。

実行結果 

上記のファイルを実行すると次のようになります。 
C:\Users\Owner\Scripts\mydns-ftp>mydnsftp2.bat

C:\Users\Owner\Scripts\mydns-ftp>REM mydnsftp2.bat for IPv4 & IPv6

C:\Users\Owner\Scripts\mydns-ftp>echo C:\Users\Owner\Scripts\mydns-ftp\
C:\Users\Owner\Scripts\mydns-ftp\

C:\Users\Owner\Scripts\mydns-ftp>cd /d C:\Users\Owner\Scripts\mydns-ftp\

C:\Users\Owner\Scripts\mydns-ftp>ftp ipv4.mydns.jp  0<mydnsftpuser.txt
ユーザー (ipv4.mydns.jp:(none)): パスワード:
OOPS: cannot locate user entry:mydns1234567
接続がリモート ホストによって閉じられました。

C:\Users\Owner\Scripts\mydns-ftp>ftp ipv6.mydns.jp  0<mydnsftpuser.txt
ユーザー (ipv6.mydns.jp:(none)): パスワード:
OOPS: cannot locate user entry:mydns1234567
OOPS: priv_sock_get_cmd
接続がリモート ホストによって閉じられました。
C:\Users\Owner\Scripts\mydns-ftp>
  
FTPサーバーは実際に動作していないのでエラーが出て停止していますが、これで正常にIPアドレスが通知されています。
たまに、そのFTPサーバーが動作していないときに通知ができないことがあります。

https://<MyDNS ID>:<MyDNS PassWord>@ipv4.mydns.jp/login.html
https://<MyDNS ID>:<MyDNS PassWord>@ipv6.mydns.jp/login.html
で通知ができるので。簡単なバッチファイルで通知が出来ます。


[mydnshttpbasic.bat]  
REM mydnshttpbasic.bat 
echo %~dp0
cd /d %~dp0
curl https://mydns1234567:aNatanOPaSSword4@ipv4.mydns.jp/login.html
curl https://mydns1234567:aNatanOPaSSword4@ipv6.mydns.jp/login.html

exit 0
 

のようなバッチファイルで通知が出来ます。

実行結果 

上記のバッチファイルを実行すると次のようになります。
C:\Users\Owner\Scripts\mydns-ftp>mydnshttpbasic.bat

C:\Users\Owner\Scripts\mydns-ftp>REM mydnshttpbasic.bat

C:\Users\Owner\Scripts\mydns-ftp>echo C:\Users\Owner\Scripts\mydns-ftp\
C:\Users\Owner\Scripts\mydns-ftp\

C:\Users\Owner\Scripts\mydns-ftp>cd /d C:\Users\Owner\Scripts\mydns-ftp\

C:\Users\Owner\Scripts\mydns-ftp>curl https://mydns1234567:aNatanOPaSSword4@ipv4.mydns.jp/login.html
<html>
<head>
<title>Free Dynamic DNS (DDNS) for Home Server and VPS etc  | MyDNS.JP</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<LINK href="./site.css" rel=stylesheet type=text/css>

</head>
<BODY BGCOLOR="#FFFFFF"
      TEXT="#304040"
      leftmargin="0" topmargin="0" marginwidth="0" marginheight="0"
>
Login and IP address notify OK.<BR>
login_status = 1.<BR>
<BR>
<DT>MASTERID :</DT><DD>mydns1234567</DD>
<DT>REMOTE ADDRESS:</DT><DD>111.202.123.144</DD>
<DT>ACCESS DAYTIME:</DT><DD>2021/09/29 00:48:03 UTC</DD>
<DT>SERVER ADDRESS:</DT><DD>210.197.74.212</DD>
<BR>

</body>
</html>

C:\Users\Owner\Scripts\mydns-ftp>curl https://mydns1234567:aNatanOPaSSword4@ipv6.mydns.jp/login.html
<html>
<head>
<title>Free Dynamic DNS (DDNS) for Home Server and VPS etc  | MyDNS.JP</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<LINK href="./site.css" rel=stylesheet type=text/css>

</head>
<BODY BGCOLOR="#FFFFFF"
      TEXT="#304040"
      leftmargin="0" topmargin="0" marginwidth="0" marginheight="0"
>
Login and IP address notify OK.<BR>
login_status = 1.<BR>
<BR>
<DT>MASTERID :</DT><DD>mydns1234567</DD>
<DT>REMOTE ADDRESS:</DT><DD>2422:4123:4fc4:3d00:ff1d:3cf2:72a9:ff7a</DD>
<DT>ACCESS DAYTIME:</DT><DD>2021/09/29 00:48:04 UTC</DD>
<DT>SERVER ADDRESS:</DT><DD>2604:180:f4::1e8</DD>
<BR>

</body>
</html>
C:\Users\Owner\Scripts\mydns-ftp>
 


■IPアドレスを更新時だけ通知する - HTTP Basic -

ほとんどのプロバイダーが付与するGlobalIPは、ほどんど変更されることは有りません。なので、上記の方法では無用な通知が多数を占め、MyDNSさんの貴重なサーバーリソースを無駄遣いしてしまうことになります。そこで、懸命なユーザーならIPアドレスが変更されたときだけ通知しようと考えると思います。
Windowsのバッチファイルだけで変更通知のみを行うスクリプトがなかなか見つけられなかったので作成しました。
以下のバッチファイルを置く場所は、自身のアクセス権のある場所に配置してください。
オススメは、ご自分のアカウントフォルダーの直下です。トラブルなく動作するのでちょっと幸せになれます。
例えば、
C:\USERS\<user name>\scripts
のようなところです。

[mydnsupdater.bat]  

REM mydnsupdater.bat
echo %~dp0
cd /d %~dp0

curl https://domains.google.com/checkip -4 > gipv4_curr.txt
fc /a gipv4_prev.txt gipv4_curr.txt


rem echo %ERRORLEVEL%
IF NOT %ERRORLEVEL%==0 (

echo [MyDNSUpdater] Updating IPv4 and IPv6 addresses
curl https://mydns1234567:aNatanOPaSSword4@ipv4.mydns.jp/login.html
curl https://mydns1234567:aNatanOPaSSword4@ipv6.mydns.jp/login.html


copy gipv4_curr.txt gipv4_prev.txt) ELSE (
REM echo NOUPDATE
)

exit 0


 


■自動実行するには スタートアップへ登録する

Windows起動時に一度だけ実行することが出来ます。
スタートアップフォルダーを開くにはファイルエクスプローラーのアドレスバーに

shell:startup

と入力すると開きます。



手動で開く時のスタートアップのフォルダーはこちらです。

C:\Users\<User Name>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

<User Name>はご自分のWindowsへ登録されている名前です。フォルダーが表示になっているとエクスプローラーで表示されないので隠しファイルを表示するよう設定が必要です。

エクスプローラーのメニュー [表示]-[v]隠しファイル


このフォルダーに先程作成したバッチファイルのショートカットをコピーします。


■自動実行するには タスクスケジューラに登録する

タスクスケジューラーなら自分の意図した時間に実行することが出来ます。
スタート横の検索窓からタスクスケジューラと入力して検索すると表示されます。
以下、使用するバッチファイルは適時ご自分が利用するバッチファイルに読み替えてください。

基本タスクを追加します。

以下、
先程のHTTP-BASICを使用した[mydnshttpbasic.bat]をスケジューリングしてみます。  
今後管理しやすいように名前をつけます。
名前には、MyDNS-HTTPBASICのようにします。

とりあえず
(●)コンピューターの起動時
としておきます。これで起動時に通知されるようになります。



[参照]ボタンを押しバッチファイルの場所を指定します。

[mydnshttpbasic.bat]を指定します。

一応ここまででWindows起動時にMyDNSへ通知できるようになりました。
1時間毎に通知等さらに細かい設定を行います。

MyDNS-HTTPBASIC
というスケジュールが追加されたので、これを編集します。
[MyDNS-HTTPBASIC][右クリック]-[プロパティー]

[v]最上位の特権で実行する
もし、パソコンがスリープ時にログアウトしパスワードが必要な設定なら
 ●ユーザーがログオンしているかにどうかに関わらず実行する
に丸をつけてパスワードを入力してください。PINでは認証通りません。

タブ[トリガー]をクリックする

[編集]をクリック
トリガーの編集
[v]繰り返し間隔 チェックを入れる
間隔[1時間] を選ぶ
継続時間[無制限]を選ぶ
[OK]

他の項目はとくにイジる必要はありません。

[OK]を押す
以上です。
1時間ごとに黒いコマンドプロンプト画面が表示されて、通知するようになります。
最初はちょっとびっくりします。

■コマンドプロンプト窓を非表示にする
@タスクケジューラ

タスクスケジューラーで実行させるとほぼ希望したとおりの動作をします。しかし、やっぱり黒いコマンドプロンプトが表示されるとびっくりします。それに、作業中ならフォーカスが外れることで編集ミスや作業に支障をきたすことがあります。

そこで黒い窓を表示しないように、タスクスケジューラで実行するコマンドを工夫します。
すでにタスクを追加されていたら、
そのタスクの上で[右クリック]-[プロパティー]


タブ[操作]
[プログラムの開始]をクリックして[編集...]

[プログラム/スクリプト(P):]に次のコマンドをペーストします。

%comspec% /c start "" /min "C:\Users\Owner\Scripts\mydns-ftp\mydnsupdater.bat"  ^& exit

 


引数が[プログラム]ボックスに含まれているように見えます
と表示されたら、[はい(Y)]を押します。正しい記述に修正してくれます。
[Ok][Ok]で閉じます。
タスクの動作確認は、右クリック[実行]で今すぐ実行出来ます。
C:\USERS\Owner\scriptsフォルダー内に
gipv4_curr.txt
gipv4_prev.txt
が作成されているか。内容が正しいか。MyDNS内マイページでIPアドレスが更新されているかを確認してみてください。


先の項目で説明した"mydnsupdater.bat"バッチファイルを使った例です。
Ownerとなっているところは、それぞれのユーザー名に合わせて適宜修正してください。
startのあとの "" は必須です。削除すると動作しません。
各バッチファイル末に"exit 0"が必要になります。



    各バッチファイルの最後に"exit 0"を追加 2021.10.10
コマンドプロンプト窓を非表示にする@タスクケジューラ追記 2021.10.10
タスクスケジューラ・スタートアップについて追記 2021.10.02
FTP通知スクリプトを簡略化 HTTP-BASIC追加 2021.09.28