BONSAI 道 - 千里の道も一歩から

決してITに強いわけではないけれどITしてみたいので投稿します。

Blender備忘録1

視点操作

  • 回転
    「中ボタンドラッグ」
  • パン
    「Shift」+「中ボタンドラッグ」
  • ズームイン・ズームアウト
    「Ctrl」+「中ボタンドラッグ」

オブジェクトモード・編集モード共通操作

3Dビューポートにオブジェクトを追加

「Shift」+「A」

移動

「G」

スケーリング

「S」

回転

「R」

コピー

「Shift」+「D」

軸のロック

移動・回転・拡大縮小・押し出し・コピー後、「X, Y, Z」

平面のロック

移動・スケーリングを押した後、「Shift」+「X, Y, Z」

削除

「X」

選択

選択モードの切り替え

「W」

ボックス選択

「B」

全選択

「A」

サークル選択

「C」

投げ縄選択

「Ctrl」+「右ボタンドラッグ」

選択解除

「Alt」+「A」

直前の操作をする

「Shift」+「R」

オブジェクトモード・編集モードへの切り替え

「Tab」

現在のモードで行える操作一覧表示

「Shift」+「Space」

3Dカーソルをデフォルトの位置(XYZ=0)に戻す

「Shift」+「C」

選択オブジェクトのみ表示(ローカル表示)

「/」

オブジェクトモード操作

オブジェクト統合

「Ctrl」+「J」

オブジェクトのトランスフォームを適用

  • 「Ctrl」+「A」
  • ベベルが上手くかからない時などに使う

    リンク複製

    「Alt」+「D」

    スムーズシェード

    「右クリック」メニューから

編集モード操作

スライド移動

「G」→「G」

押し出し

「E」

法線に沿って面を押し出し

「Alt」+「E」

インセット

  • 「I」
  • インセット後、「Ctrl」で差し込みの深さ調整
  • インセットの個別・統合の切り替え
    インセット後、さらに「I」
    インセット 個別
    個別
    インセット 統合
    統合

    フィル

    「F」

    辺ループの挿入

  • 「Ctrl」+「R」
  • ESCで真ん中

    溶解

    「X」

    ナイフ

    「K」

    頂点マージ

    「M」

    プロポーショナル編集のオン・オフ切り替え

    「O」

    分離

    「P」

    細分化

    「右クリック」メニューから

    扇状に分離

    面を選択後、「右クリック」メニューから

    辺ループのブリッジ

    「右クリック」メニューから

    Loop Tools

  • 標準アドオンから有効化
  • 「右クリック」メニューから

    ベベル(面取り)

  • 辺の場合は「Ctrl」+「B」
  • 頂点の場合は「Ctrl」+「B」→V
  • カーブの場合はカーブのデータプロパティ→ジオメトリで深度を設定後、コントロールポイントを選択し、「Alt」+「S」で厚み・太さを調整できる

    選択

    ループ選択

    「Alt」+「左クリック」

    選択範囲の拡大・縮小

    「Ctrl」+「+, -」

    独立・分断されたメッシュの選択・リンク選択

  • 選択したい独立したメッシュにカーソルを合わせて、「L」
  • 選択した要素に接続されているジオメトリを「Ctrl」+「L」で選択可能

    モディファイア関連

    平均クリース・辺クリース

  • サブディビジョンサーフェイスで辺の丸さを調整する機能、エッジの鋭さを定義
  • 「Shift」+「E」を押した後、「ドラッグ」

    スキンモディファイア スキンの厚みの変化

    「Ctrl」+「A」を押した後、「ドラッグ」

メニュー操作

パイメニュー表示

モードのパイメニュー表示

「Ctrl」+「Tab」

ピボットポイントのパイメニュー表示

「.」

トランスフォーム座標系のパイメニュー表示

「,」

ツールバーの表示・非表示

「T」

プロパティシェルフの表示・非表示

「N」

オペレータパネルの再表示

トップバーの「編集」→「最後の操作を調整」

用語解説

トポロジー

ポリゴンの流れのこと、1つの頂点に4つの辺が集まるのが理想

原点

オブジェクトの中心のこと

ピボットポイント

制御の中心のこと

Tips

  • オブジェクトモードではオブジェクトと原点は共に移動
  • 編集モードではジオメトリ(頂点、辺、面)を編集した際に原点は動かない

ハードリンクとシンボリックリンクの違い

はじめに

今回はリンクを張るlnコマンドのハードリンクとシンボリックリンクの違いについて解説します。

ハードリンクとは

  • 1つのファイルの実体に複数の名前を付ける機能(どれも本物の名前)
  • いくつかの制限がある(ディレクトリに対して作成不可、異なるディスク間をまたぐことができないなど)

ハードリンクの例

$ cat test.txt 
a
b
c
$ ln test.txt link   # ハードリンクを張る
$ cat link
a
b
c

以下、ファイルtest.txtの内容を変更した実行結果

$ cat test.txt 
a
b
c
d
$ cat link 
a
b
c
d

ここからさらにtest.txtを削除してやり、linkの内容を表示してみる

$ rm test.txt
$ cat link
a
b
c
d

つまりハードリンクはハードリンクが張られた全てのファイルが削除されるまでファイルの実体も残るというわけです。 次からはシンボリックリンクについて解説します。

シンボリックリンクとは

  • リンク先のパス名が書かれた小さな特殊ファイル
  • リンク先がファイルの実体

シンボリックリンクの例

$ cat test.txt
a
b
c
$ ln -s test.txt link   # シンボリックリンクを張る
$ cat link
a
b
c

以下、ハードリンクと同様にファイルtest.txtの内容を変更した実行結果

$ cat test.txt 
a
b
c
d
$ cat link 
a
b
c
d

しかし、ファイルtest.txtを削除して、linkの内容を表示してみると実行結果が異なる

$ rm test.txt
$ cat link
cat: link: No such file or directory

つまりリンク先がなくなり、リンクが壊れた状態となる。

Linuxコマンドチートシート

はじめに

この記事はLinux(当環境はDebianを使用)で自分がよく使うコマンドの備忘録です。

自分用の備忘録として書いているため、自分があまり使わないものについては書いていません。 その点ご了承願います。

内容については随時更新していく予定です。

目次

Linuxコマンドチートシート

ファイル・ディレクトリ操作

ls - ファイル一覧の表示

カレントディレクトリのファイル一覧の表示

$ ls

オプション

-a ドットファイル(隠しファイル)も表示

-l 詳細情報も表示

-F ファイル種別も表示

cd - カレントディレクトリの変更

Change Directoryの略

カレントディレクトリをホームディレクトリに変更

$ cd ~

1つ前の作業ディレクトリに戻る

$ cd -

pwd - カレントディレクトリのパスを表示

Print Working Directoryの略

$ pwd

mv - ファイルの移動、ファイル名の変更

ファイルの移動

$ mv 移動元のファイルパス 移動先のディレクトリパス

オプション

-i 上書き時に確認する

cp - ファイルをコピーする

$ cp コピー元のファイルパス コピー先のファイルパス

オプション

-r ディレクトリをコピーする

-i 上書き時に確認する

mkdir - ディレクトリを作成

$ mkdir ディレクトリパス

オプション

-p 深いディレクトリを一気に作成する

touch - ファイルのタイムスタンプを更新する、ファイルの作成

$ touch ファイルパス

rm - ファイル・ディレクトリの削除

$ rm ファイルパス

オプション

-r ディレクトリの削除

-i 削除時に確認する

rmdir - 空のディレクトリの削除

$ rmdir 空のディレクトリのパス

ln - リンクを張る

ハードリンクを張る

$ ln ファイルパス リンク名

オプション

-s シンボリックリンクを張る

cat - ファイルの内容を表示、ファイルの内容を連結して表示

$ cat ファイルパス

オプション

-n 行番号を付加する

less - ファイルの内容をスクロールして表示

$ less ファイルパス

which - コマンドパスの表示

$ which コマンド名

権限操作

su - ユーザーを変更する

スーパーユーザーの環境に初期化してスーパーユーザーに変更

$ su -

sudo - コマンドを別のユーザとして実行する

スーパーユーザー権限でコマンドを実行

$ sudo コマンド名

visudo - /etc/sudoersの編集

$ sudo visudo

chmod - パーミッションを変更する

ファイルの所有者に実行権限を付与

$ chmod u+x ファイルパス

chown - ファイルの所有者を変更する

$ chown ユーザー名 ファイルパス

useradd - 新規ユーザーの作成

$ useradd ユーザー名

オプション

--create-home or -m ユーザーのホームディレクトリが存在しなければホームディレクトリを作成する

--no-create-home or -M ユーザーのホームディレクトリを作成しない

システム関連

apt - パッケージ操作

パッケージのアップデートをチェック

$ sudo apt update

パッケージのアップデートを実行

$ sudo apt upgrade

パッケージのインストール・リポジトリの情報の登録

$ sudo apt install パッケージ名

パッケージのアンインストール

$ sudo apt remove パッケージ名

パッケージのインストール状況を調べる

$ sudo apt list --installed

更新に伴い、必要のなくなったパッケージを削除する

sudo apt autoremove

セキュリティ関連

ufw - ファイアウォールの設定

内容の確認

$ sudo ufw status

全てのポートへの接続を禁止

$ sudo ufw default deny

ポートの解放

$ sudo ufw allow ポート番号

ファイアウォールの有効化

$ sudo ufw enable

ファイアウォールの設定の再読み込み

$ sudo ufw reload

ssh - リモートマシンにSSHでログインし、リモートマシン上でコマンドを実行する

$ ssh ログインユーザー名@IPアドレス

オプション

-p ポート番号 ポート指定

-i 秘密鍵ファイル 秘密鍵を指定

scp - リモートマシンとローカルマシン、あるいはリモートマシン同士でファイルをコピーする

$ scp コピー元ファイルパス ログインユーザー名@IPアドレス:コピー先ファイルパス
$ scp ログインユーザー名@IPアドレス:コピー元ファイルパス コピー先ファイルパス

オプション

-P ポート番号 ポート指定

-i 秘密鍵ファイル 秘密鍵を指定

ポート番号指定するときはssh-p ポート番号で小文字、scp-P ポート番号で大文字のオプションを指定すること

ssh-keygen - 鍵ペア(公開鍵と秘密鍵)の作成

$ ssh-keygen

pwgen - パスワード(ランダムな文字列)を生成する

12文字のパスワードを1つ生成

$ pwgen 12 1

文字列検索・操作

grep - ファイルの中から指定した内容を含む行を探す

global regular expression printの略

$ grep "検索文字列" ファイルパス

オプション

-r サブフォルダまで検索

-E 正規表現を指定

-i 大文字小文字の違いを無視(ignore case)

-v 指定した文字列を含まない行だけに絞り込む

cut - 入力された内容の各行から必要な部分だけを切り出す

行頭から3列目までを切り出す

$ cut -f 1-3 ファイルパス

オプション

--delimiter 区切り文字 or -d 区切り文字 区切り文字には任意の一文字を指定、区切り文字がタブ文字の場合は省略する

--fields 取り出す列位置 or -f 取り出す列位置 取り出す列位置は最初が1で複数の数字や範囲も指定可能、例えば 1,31-3など

sort - 入力された内容を昇順に並べ替える

$ sort ファイルパス

オプション

--reverse or -r 降順にソート

--field-separator or -t 区切り文字を指定

--key or -k 列番号を指定して列の内容での並べ替え

--number or -n 単純ソートから数値ソートに変更

--ignore-leading-blanks or -b 先頭の空白を無視する

uniq - 入力された内容の連続した重複を取り除く

$ sort ファイルパス | uniq

オプション

--count or -c 同じ内容が何回登場したかカウント

wc - 入力された内容の文字数や行数を数えてその結果を返す

Word Countの略

$ wc ファイルパス

オプション

--lines or -l 行数

--words or -w 単語数

--chars or -m バイト数

sed - 文字列の編集

Stream EDitorの略

ファイルの全行に渡って置換(一括置換)

$ sed -e "s/置換前文字列/置換後文字列/g" ファイルパス > 新しいファイルのファイルパス

1つのコマンド列の中でファイルを上書きするとファイルが消失してしまうので注意

オプション

--expression or -e 置換文字の指定をする、複数指定可能

head - 入力の先頭から10行だけを取り出す

$ head ファイルパス

オプション

-n 行数 出力する行数を変更

tail - 入力の末尾から10行だけを取り出す

$ tail ファイルパス

オプション

-n 行数 出力する行数を変更

-F ファイルに追加された内容をその都度出力

echo - 引数で指定した文字列の表示

ログインシェルの確認

$ echo $SHELL

シェル関連

chsh - ログインシェル自体の変更

ログインシェルをzshに変更

$ chsh -s /bin/zsh

clear - 端末の表示内容を消す

$ clear

printenv - 環境変数の一覧表示

$ printenv

source - ファイルからコマンドを読み込んで実行する(.コマンドと同じ)

$ source ファイルパス

type - シェルがどのコマンドを起動しているかを知る

$ type コマンド名

alias - エイリアスの設定確認、エイリアスの定義

エイリアスの設定確認

$ alias

エイリアスの定義

alias 定義名='実行内容'

unalias - エイリアスの削除

$ unalias 定義名

エイリアスかの確認、エイリアスを一時的に無効にする

エイリアスかの確認

$ type ls
ls is an alias for ls -F

エイリアスを一時的に無効にする

$ \ls
$ /bin/ls   # フルパス指定
$ command ls   # 明示的にコマンドを実行

その他

hostname - 実行したサーバーのホスト名を出力

$ hostname

crontab - 定期作業の自動実行

$ crontab -e

cronjobととして設定された作業はcrontabコマンドを実行したときのユーザー権限でのみ動作するのに注意

オプション

-l 設定済みのcronjobの一覧表示

-e 設定の編集

ip address show - IPアドレスを表示

$ ip address show

curl - Webアクセス

HTTPでGETリクエス

$ curl -X GET "URL"

HTTPでPOSTリクエス

$ curl -X POST "URL"

ダウンロード

$ curl -o 保存先ファイルのパス URL

自身のグローバルIPアドレスを表示

$ curl ifconfig.io

iconv - 文字コードの変換

文字コードEUC-JPからUTF-8に変換

$ iconv -f EUC-JP -t UTF-8 ファイルパス

date - 現在日時の表示

$ date

logout / exit - ログアウト(logoutはログインシェルの時のみログアウト可能)

$ exit

Debian系サーバーにSSHログインしたときにLINEに通知するシェルスクリプトを書こう

はじめに

はてなブログ初投稿です。

ボンサイワークスと申します。

フィヨルドブートキャンプというプログラミングスクールで学習を始めてもうすぐ3ヶ月になりますがまだ一度も記事を書いたことがなかったので 記事を書いて投稿してみようと思います。

前置きはさておいて今回の記事の内容は「Debian系サーバーにSSHログインしたときにLINEに通知するシェルスクリプトを書こう」です。 Linuxシェルスクリプト勉強中のため、ところどころ理解が甘く、間違っている箇所などもあるかもしれませんが、どうかご指摘くださる際はお手柔らかにお願いします。

では今回作るシェルスクリプト(以下、ログイン通知シェルスクリプト)の仕様を簡単に示します。

ログイン通知シェルスクリプトの仕様

次に認証ログについて簡単に説明します。

認証ログ

認証ログとは

  • いつ誰が何のために認証をしたのかが記録されるログ
  • Linuxディストリビューションによって保存先が異なる(詳しくは次項参照)
  • ログの書き込みは「rsyslogd」というデーモン(常駐プログラム)が実施している
  • 定期的に古いログは圧縮される(設定により色々と変更できる、今回は直近のものだけ使うので圧縮ファイルは使わない)

認証ログの保存先

Linuxディストリビューションごとの認証ログの保存先は以下の通りです。

/var/log/auth.log
/var/log/secure
/var/log/authlog

となっています。

今回、作成するシェルスクリプトDebianが対象なので認証ログの保存先は/var/log/auth.logになります。

認証ログの解析

認証ログを解析する上で必要となる認証ログの内容を表示してみると f:id:bonsaiworks8:20211123231424p:plain SSHログインした際のメッセージにはAcceptedという文字列が含まれていることがわかります。

ということでログイン通知シェルスクリプトはこの文字列Acceptedが含まれた行を検索するアプローチで作成していきたいと思います。

LINE Notifyのアクセストークンを発行する

まず、LINE Notifyにアクセスします。アクセスしたら右上の「ログイン」から通知を受け取りたいLINEアカウントでログインします。 LINEアカウントを持っていない方はまずLINEアカウントを作ってください。

ログインできたら右上の自身のアカウント名が表示されているところをクリックして、「マイページ」をクリックしてください。 するとマイページが表示されるので以下の画像の箇所を探して「トークンを発行する」をクリックしてください。

次に以下を参考にトークン名の入力、トークルームの選択をして「発行する」をクリックします。

すると以下のようにアクセストークンが表示されるのでコピーしてどこかに控えておいてください。

ここまで来れば準備は完了です。

次にログイン通知シェルスクリプトを実装していきます。

ログイン通知シェルスクリプト

ここからは今回作成するシェルスクリプトについて書いていくわけですが、シェルスクリプトの基本から書いてしまうととてつもなく文章が長くなってしまいますのでここでは完成したプログラムを示して、要点だけを説明することにします。

シェルスクリプトLinuxのコマンドについて全く知らない方はインターネット上の他のサイトなどで学習してから以下に示したシェルスクリプトを作ることをオススメします。

以下、ログイン通知シェルスクリプト全文です(説明のため行番号を付加してあります)。

     1  #!/bin/bash
     2  
     3  LOGFILE_NAME="/var/log/auth.log"
     4  TMP_LOGFILE_NAME="/tmp/tmp_auth.log"
     5  TMP_LOGFILE_BACKUP_NAME="/tmp/tmp_auth.log.bak"
     6  TMP_LOGIN_LOGFILE_NAME="/tmp/tmp_login.log"
     7  ACCESS_TOKEN="LINE Notifyアクセストークン"
     8  
     9  notify_message(){
    10    message="$1($2)から$3ユーザーでログインがありました($4)"
    11    curl -s -X POST -H "Authorization: Bearer $ACCESS_TOKEN" -F "message=$message" https://notify-api.line.me/api/notify > /dev/null
    12  }
    13  
    14  if [ -f $LOGFILE_NAME ]; then
    15    cp $LOGFILE_NAME $TMP_LOGFILE_NAME
    16  
    17    if [ ! -e $TMP_LOGFILE_BACKUP_NAME ]; then
    18      cp $LOGFILE_NAME $TMP_LOGFILE_BACKUP_NAME
    19    fi
    20  
    21    # 新しいファイル(TMP_LOGFILE_NAME)の方にあるログインの行だけを抽出
    22    diff --old-line-format='' --unchanged-line-format='' --new-line-format='%L' $TMP_LOGFILE_BACKUP_NAME $TMP_LOGFILE_NAME | grep "Accepted" > $TMP_LOGIN_LOGFILE_NAME
    23  
    24    cat $TMP_LOGIN_LOGFILE_NAME | while read line
    25    do
    26      ip=$(echo $line | cut -f 11 -d " ")
    27      country=$(whois $ip | grep "country:" | sort | uniq | sed -e 's/  */ /g' | cut -f 2 -d " ")
    28      country=$(echo $country | sed -e 's/ /,/g')
    29      user=$(echo $line | cut -f 9 -d " ")
    30      month=$(echo $line | cut -f 1 -d " ")
    31      day=$(echo $line | cut -f 2 -d " ")
    32      time=$(echo $line | cut -f 3 -d " ")
    33      date=$month-$day,$time
    34      
    35      notify_message $ip $country $user $date
    36    done
    37    cp $TMP_LOGFILE_NAME $TMP_LOGFILE_BACKUP_NAME
    38  fi

ログイン通知シェルスクリプトの解説

1行目:シバンです。今回はbashで実行するのでこのように書きます。

3行目:認証ログのファイル名を絶対パスで変数に代入しています。

4行目:認証ログのファイルを/tmpディレクトリにコピーして保存したかったため、コピー先のファイル名の絶対パスを変数に代入しています。

5行目:通知していないログインメッセージのみ通知するため、一回前に実行されたときの認証ログと最新で実行されたときの認証ログの差分に必要となる一回前の認証ログのコピーが保存されるファイルの絶対パスを変数に代入しています。

6行目:通知の対象となるログインメッセージの行が抽出されるファイルの絶対パスを変数に代入しています。

7行目:「LINE Notifyのアクセストークンを発行する」で発行したアクセストークンを書きます。各人で違うのでここに控えておいたアクセストークンを書いてください。

9〜12行目:LINEにメッセージを通知する関数です。

14行目:認証ログが存在したら以下に続くメインとなる処理を行うように条件分岐をしています。

15〜22行目:15行目で認証ログのコピーを/tmpディレクトリにとっています。

また17〜19行目で実行一回前の認証ログのバックアップが存在しなかったらつまり一度もこのシェルスクリプトが実行されていなかったら最新の認証ログのコピーをバックアップすることで最初にこのシェルスクリプトが実行されたときに過去のものが通知されるのを防いでいます。

そして22行目で最新のログと一回前のログの差分を求めて最新のログにある行だけを抽出し、その中からさらにAcceptedが含まれる行を抽出して、ファイルに保存しています。

24〜38行目:22行目で保存されたファイルから行単位でログを読み取り、IPアドレス、国などを求めてLINEにログイン通知する関数を呼び出しています。

最後に37行目で最新のログを一回前のログと同じにすることで差分をなくしています。

ここまででログイン通知シェルスクリプトが作れたので一度サーバー上で動作確認してみます。

サーバー上で動作確認

scpコマンドでサーバーにログイン通知シェルスクリプトをコピーして、ファイルを自作シェルスクリプト置き場である/usr/local/binディレクトリに移動します。 SSHログイン後、試しに実行してみると

$ ./ssh_login_notify.sh 
cp: cannot open '/var/log/auth.log' for reading: Permission denied
diff: /tmp/tmp_auth.log.bak: Permission denied
diff: /tmp/tmp_auth.log: Permission denied
cp: cannot open '/tmp/tmp_auth.log' for reading: Permission denied

「権限がないよ」と怒られているようなので権限を確認します。

$ ls -l /tmp/tmp_auth.log /tmp/tmp_auth.log.bak 
-rw-r----- 1 root root 814962 Nov 23 17:15 /tmp/tmp_auth.log
-rw-r----- 1 root root 814962 Nov 23 17:15 /tmp/tmp_auth.log.bak

所有者rootのみ読み書きが可能になっているようです。

コピー元の認証ログも念のため確認すると

$ ls -l /var/log/auth.log
-rw-r----- 1 root adm 816062 Nov 23 17:19 /var/log/auth.log

と同じパーミッションが設定されています。

ということでsuコマンドでroot権限になってからログイン通知シェルスクリプトを実行すると エラーメッセージは出なくなりました。

今回作成したログイン通知シェルスクリプトの初回実行は最新と一つ前の認証ログの差分がない仕様なので別コンソールでもう一度sshログイン後、ログイン通知シェルスクリプトを再度実行するとちゃんとLINEに通知メッセージが届きました。(本来はバグにより通知メッセージが大量に送られるなどのトラブルを避けるため、通知処理をechoコマンドに置き換えるなど十分にテストしてから通知メッセージを送った方が良いかと思います。今回は記事の都合上、割愛しました)

初学者がつまづきやすいポイント

  • シェルスクリプトからファイルにアクセスする際はそのファイルの権限と実行ユーザーを合わせる必要がある(ファイルの読み書きがしたいときに rootにしかその権限が与えられていないならrootユーザーで実行する)
  • curl、diffなどコマンドがインストールされていないとスクリプトが正常に動かないのであらかじめスクリプトで必要となるものはインストールしておく

とりあえず動作確認はできたので最後にそれを定期実行するようにしてみます。

サーバー上での定期実行

Linuxスクリプトの定期実行をするにはcrontabコマンドを使います。

読み方はクローンタブです。

以下、簡単な説明です。

crontab

  • cronjobを管理するコマンド

cronjob

  • crondに実行して欲しいコマンドとその実行日時のセット
  • crontabコマンドを実行したときのユーザー権限で動作する(rootで実行すればroot権限で動作する)

crond

  • 定期実行をするデーモン(常駐プログラム)

使い方

cronjobを動作させたいユーザーに変更します。今回はroot権限で動作させたいのでrootユーザーに変更します。

$ su

rootユーザーになったら以下のコマンドを打って設定を編集します。

# crontab -e

ちなみに設定済みのcronjobの一覧を表示させたい場合は以下のコマンドを打ってください。

# crontab -l

既定のエディタが設定されている場合、そのエディタで開くので以下のように設定を編集します。

* * * * * /usr/local/bin/ssh_login_notify.sh

分 時 日 月 曜日 コマンドの順で指定します。*は任意を表しており、上記設定だと毎分 毎時 毎日 毎月 各曜日つまり1分おきにログイン通知シェルスクリプトが実行されます。

あと今回はroot権限でcronjobを動作させましたが、特権が必要な処理以外は安全のためにroot権限のない一般ユーザーの cronjobにしておくのが定石らしいです。

また今回はログインの通知のみでしたが、抽出対象の文字列を変えれば不正アクセスの通知にも対応可能です。

設定を保存し、SSHログインを行うと見事LINEにログイン通知が来ました。結果はご自身の目でご確認ください。

お疲れ様でした。