当サイトではアフィリエイト広告を利用しています。

グローバルIPアドレスを毎分調べGmailで通知させるシェルスクリプトを作ってみた【(第2弾 第2章)家から実家のファイルサーバを使いたいんじゃ!シリーズ】

2022年4月26日

今回は「家から実家のファイルサーバを使いたいんじゃ!シリーズ」の第2弾の第2章です。

前回設定した環境を使用して、グローバルIPアドレスが変更されたら新しいグローバルIPアドレスをgmail通知するためのシェルスクリプトを作成していきます。

 

シリーズの概要は以下のリンクをご覧ください。

前回のあらすじ

前回はVPN接続先(実家側)のUbuntuサーバで以下の設定や動作確認を行いました。

  1. グローバルIPアドレスの取得
    Curlコマンドを使い"inet-ip.info"に現在のグローバルIPアドレスの問い合わせ、取得します。
  2. sSMTPのインストールと設定
    サーバからメール送信が行えるようにsSMTPのインストールと送信に使用するGmailの登録し、登録したGmailの疎通確認を行います。
  3. GmailでのグローバルIPアドレス通知試験
    curlコマンドで取得した現在のグローバルIPアドレスをそのままGmailで送信できるかの確認を行います。

前回の詳細は以下のリンクカードをご覧ください。

 

今回作成するシステムの大まかな流れ

まず、前回作成した環境以下の内容を実施するシステムをシェルスクリプトで作成します。

  1. curlコマンドでグローバルIPアドレスを取得する。
  2. もし更新されていたら新しいグローバルIPアドレスをGmailで通知する

 

この2つの内容を実施するシェルスクリプトをcronに登録し、毎分IPアドレスの更新チェックが行えるシステムを作成します。

 

準備するもの

以下はUbuntuサーバ上にデフォルトで導入されていないもの等です。

前回の設定を行っていれば改めて準備する必要はありません

・Gmailアドレス

・Curlコマンド

mailutils(Linuxパッケージ)

・sSMTP(Linuxパッケージ)

 

ファイル構成

gipmail(ディレクトリ)
|
|ーgipmail.sh(シェルスクリプトファイル)
|ーnowgip.txt(最新のグローバルIPアドレスが格納されているファイル)
|ーgip.log(今までのグローバルIPアドレスが格納されているファイル)
|ーmailtext.txt(送信するメール本文(グローバルアドレス部以外))

テキストファイルの内容

nowgip.txt

gipmail.shを実行すると自動で作成されるファイルです。
更新前までに取得したグローバルIPアドレスのみが格納されています。シェルスクリプト内ではこのファイルに格納されているIPアドレスとcurlコマンドで取得したグローバルIPアドレスを比較します。
変更されていた場合は通知と同時にこのファイルの内容も更新します。

xxx.xxx.xxx.xxx

gip.log

gipmail.shを実行すると自動で作成されるファイルです。
グローバルIPアドレスが更新されるたびに更新日時とグローバルIPアドレスを格納します。
このファイルは単純に更新履歴を残すだけで参照等はしないので無くても大丈夫です。

2022/03/04 20:40:04:aaa.aaa.aaa.aaa
2022/03/21 00:01:45:xxx.xxx.xxx.xxx

mailtext.txt

gipmail.shを実行する前に作成しておくファイルです。
グローバルIPアドレスが変更された際にgmailで送信するメール本文です。
実際に送信する場合はこのファイルの3行目にcurlコマンドで取得したグローバルIPアドレスを挿入してメールを作成します。

The global ip address has been changed,
so we will notify you of the new ip address.


From hayana

私は英語が出来ないので以下のメッセージをDeepLで英語翻訳した内容を使っています。

“グローバルIPアドレスが変更されましたので新しいIPアドレスを通知します。"

 

実際のシェルスクリプト全文

まずスクリプト全文です。解説はその下で行います。

gipmail.sh

#!/bin/bash

newgip=`curl -s inet-ip.info`
frommail=通知するためのメールアドレス(sstp.confで設定したメールアドレス)
tomail=通知先のメールアドレス

if test -f nowgip.txt
then
        oldgip=`cat nowgip.txt`
        if test `echo $oldgip` != `echo $newgip`
        then
                echo $newgip > nowgip.txt

                sed -e "3a New IP address : $newgip" mailtext.txt | mail -s "The ip address has been changed." -r $frommail $tomail

                giplogmake=`date '+%Y/%m/%d %T'`:$newgip
                echo $giplogmake >> gip.log
        else
                :
        fi

else
        echo $newgip > nowgip.txt
 
        sed -e "3a New IP address : $newgip" mailtext.txt | mail -s "The ip address has been changed." -r $frommail $tomail

        giplogmake=`date '+%Y/%m/%d %T'`\:$newgip
        echo $giplogmake >> gip.log
fi

シェルスクリプト解説

スクリプト内の処理を1つずつ解説します。

else,fiについてはif分の分岐であるので"if 〇〇 XX"の部分にまとめます。

#!bin/bash

Shebang(シバン)といって「このファイルはBashシェルスクリプトですよ~」と言っているものです。

 

newgip=`curl -s inet-ip.info`

curlコマンドで"https://inet-ip.info"にグローバルIPアドレスを取得して、"newgip"変数に格納しています。

 

frommail=通知するためのメールアドレス

送信元となるgmailアドレスを"frommail"変数に格納します。

そのため"通知するためのメールアドレス"にはssmtp.confに設定したgmailアドレスを書き込みます。

 

tomail=通知先のメールアドレス

グローバルIPアドレスが変更されていた際に変更内容を通知するメールアドレスを"tomail"変数に格納します。

複数のメールアドレスに送信したい場合は、以下のように変更してください。

例:2つのメールアドレスに送信する場合

tomail1=1つ目の通知先メールアドレス
tomail2=2つ目の通知先メールアドレス

 

if test -f nowgip.txt

gipmailディレクトリの中にnowgip.txtファイルが作成されているかを確認します。

if分を使っている為、thenとelseの間に作成済である場合の処理が書いてありelseとfiの間に未作成である場合の処理が書いてあります。

if test -f nowgip.txt
then
        nowgip.txtがある場合の処理(取得したグローバルIPアドレスと現在までに持っているIPアドレスを比較するための
else
        nowgip.txtが無い場合の処理(初めて本スクリプトを実行した場合やnowgip.txtを削除してしまった場合)
fi

 

oldgip=`cat nowgip.txt`

ここからはnowgip.txtファイルがある場合の処理内容です。

nowgip.txtに格納されているグローバルIPアドレスをoldgip変数に格納します。

 

if test `echo $oldgip` != `echo $newgip`

nowgip.txtに格納されていたグローバルIPアドレスとcurlコマンドで取得したグローバルIPアドレスを比較します。

比較して異なっていたらthenとelseの処理を行います。同じである場合はelseとfiの処理を行います。

if test `echo $oldgip` != `echo $newgip`
        then
                比較して異なっていた場合の処理(グローバルIPアドレスが変更されていた場合)
        else
                比較して同じであった場合の処理(グローバルIPアドレスが変更されていなかった場合)
        fi

 

echo $newgip > nowgip.txt

ここからはoldgip変数とnowgip変数の内容が異なっていた場合の処理です。

グローバルIPアドレスが変更されていた場合の処理になるので、nowgip.txtの内容を今回取得したグローバルIPアドレスに書き換えます。

 

sed -e “3a New IP addredd : $newgip" mailtext.txt | mail -s “The ip address has been changed." -r $frommail $tomail

実際に更新メールを通知します。少し長いのでこのコードを分解して解説します。

sed -e “3a New IP address : $newgip" mailtext.txt
ここではメール本文の内容を作成しています。

sedコマンドで"mailtext.txt"の3行目の下に"New IP address:"という文字列と"curlコマンドで取得した最新のグローバルIPアドレス"をつなげて潜り込ませることで本文を作成しています。

sedコマンドの詳細は以下をご覧ください。

 

このコマンドで作成した本文例が以下となります。(最新のグローバルIPアドレスをxxx.xxx.xxx.xxxとする)

The global ip address has been changed,
so we will notify you of the new ip address.
New IP address:xxx.xxx.xxx.xxx

From hayana

|

|(パイプ)でsedコマンドで作成したメール本文をmailコマンドに渡しています。

小文字の"L"や大文字の"i"ではありません。

 

mail -s “The ip address has been changed." -r $frommail $tomail

mailコマンドで実際にメールを送信しています。

-sオプションはメールの件名です。今回は""内のThe ip address has been changed.が件名です。

-rオプションは送信元に当たる部分です。frommail変数に格納したメールアドレスを使います。

mailコマンドの最後はオプション無しで送信先メールアドレスを書きます。今回はtomail変数に格納されたメールアドレスを使っています。

また、本スクリプトの送信先メールアドレスの変数を複数設定した場合は以下のようにmailコマンドの最後にオプション無しで2つ書きます。

mail -s "The ip address has been changed." -r $frommail $tomail1 $tomail2

giplogmake=`date '+%Y/%m/%d %T’`:$newgip

dateコマンド使用して"年/月/日 時刻"といったフォーマットで表した現在の日時と":"という文字列とnewgip変数内のグローバルIPアドレスをgiplogmakeという変数に格納しています。

 

echo $giplogmake >> gip.log

giplogmake変数の内容をgip.logファイルに追記してグローバルIPアドレスの変更履歴を更新しています。

 

:

ここからはoldgip変数とnowgip変数の内容が同様であった場合の処理です。

nowgip.txtのIPアドレスとcurlコマンドで取得した最新のIPアドレスが一致していた。すなわちIPアドレスが変更されていなかった場合の処理ですので、何もする必要はありません。

“:"で何もせずにif文を抜けます。

 

echo $newgip > nowgip.txt

ここからはnowgip.txtファイルが無かった場合の処理内容ですが処理内容は「nowgip.txtがある場合」>「oldgip変数とnowgip変数の内容が異なっていた場合」の内容と同様です。

グローバルIPアドレスが変更されていた場合の処理になるので、nowgip.txtの内容を今回取得したグローバルIPアドレスに書き換えます。

 

sed -e “3a New IP address : $newgip" mailtext.txt | mail -s “The ip address has been changed." -r $frommail $tomail

「nowgip.txtがある場合」>「oldgip変数とnowgip変数の内容が異なっていた場合」の内容と同様です。

 

giplogmake=`date '+%Y/%m/%d %T’`:$newgip

dateコマンド使用して"年/月/日 時刻"といったフォーマットで表した現在の日時と":"という文字列とnewgip変数内のグローバルIPアドレスをgiplogmakeという変数に格納しています。

echo $giplogmake >> gip.log

giplogmake変数の内容をgip.logファイルに追記してグローバルIPアドレスの変更履歴を更新しています。

 

以上がグローバルIPアドレスが変更されているかをチェックし、変更されている場合はgmailで新しいIPアドレスを通知するシェルスクリプトの解説です。

 

作成したシェルスクリプトの権限を変更する

chmodコマンドでgipmail.shに実行権を付与します。

例1:chmod u+x gipmail.sh

例2:chmod 755 gipmail.sh

など

次はこのスクリプトを毎分実行する設定を行います。

crontabに作成した"gipmail.sh"を登録

作成したスクリプトを毎分実行できるようにcronに登録します。

/etc/crontabに以下の一文を追記します。

*/1 * * * * 実行するユーザ名 gipmailディレクトリまでのパス/gipmail/gipmail.sh

一番左の「*/1」で1分ごとの設定となっています。「*/5」にすると5分ごとの実行に変更できます。

 

以上で毎分グローバルIPアドレスの変更をチェックし変更されていたら、gmailで通知するシステムの完成です。

 

動作確認

nowgip.txtを削除するか中身を適当に書き換えて1分待ちます。

cronとgipmail.shが正しく動作していると送信先に設定したメールアドレスに以下のようなメールが届くと思います。