シェルスクリプトマガジン

最終回 不正アクセスを通知する

  それでは、シェルスクリプトを1行ずつ見ていきましょう。1行目は、第1回で説明した「シェバン」です。今回のシェルスクリプトでは、機能ごとに関数に分けるため、高機能なシェルの「Bash」を利用しています。

 3行目は、ログを保存しているファイル名を変数「LOGFILE_NAME」に代入しています。

 4行目は、LINE Notifyのアクセストークンを変数「ACCESS_TOKEN」に代入しています。このアクセストークンは、20行目と26行目にあるLINE Notifyにメッセージを送信する部分で使用しています。

 7~15行目は、発生日を「年月日時分」の形式に変換する関数「date_time()」です。発生日は「2019-12-05T12:49:52.006435+09:00」のような形式でログに記録されています。「cut」コマンドを使って、発生日から「年」「月」「日」「時」「分」を切り出して、それぞれ「YEAR」「NONTH」「DATE」「HOUR」「SECOND」の変数に代入し、14行目で「年月日時分」形式に整形して、変数「TIME」に代入しています。

 18~21行目は、誰かがログインしたときに、LINEに対してメッセージを送信する関数「login_message()」です。19行目で、メッセージを生成して変数「MESSAGE」に代入しています。そのメッセージを20行目の「curl」コマンドで送信しています。LINE Nofityを使ったメッセージ送信については、第9回を参照してください。

 24~27行目は、不正と思われるアクセスがあった場合に、LINEに対してメッセージを送信する関数「nologin_message()」です。送信するメッセージが異なるだけでlogin_message()関数と同じです。

30~64行目がメインの処理です。30行目で、ログファイルが存在することを調べて、存在する場合に「if」文の中の処理を実行しています。if文に関しては、第1回を参照してください。

 処理中にログファイルが書き換わらないように、33行目でログファイルを別名(/tmp/tmp_auth.log)に変更します。ログファイルがなくなると、ログの取得がうまく動作しないので、34行目でrsyslogdデーモンを再起動し、ログを記録するようにしています。

 37行目で、ログからログインされたかどうかを調べています。ログインされた場合、「Accepted」という文字列を含む行がログに記録されているので、それを「tmp/tmp_login.log」ファイルに保存しています。

 38行目では、取り出したログで「while」文のループを実行してLINEにメッセージを送信しています。「while read line」は、標準入力からのデータを1行ずつ取り出して変数「line」に代入し、while文内の処理を繰り返し実行するコマンドです。これにより、2回のログインがあれば、処理が2回実行されます。