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

特集1 古いラズパイの活用術(Vol.63記載)

著者:麻生 二郎

小型コンピュータボードの最新機種「Raspberry Pi 4 Model B」が国内で発売できる状態になりました。Raspberry 4 Model Bは、高機能かつ高性能なハードウエアです。このラズパイが登場することでラズパイの適用範囲が広がりますが、同時に古いモデルが不要になります。いらなくなったラズパイを有効利用する三つの方法を紹介します。

シェルスクリプトマガジン Vol.63は以下のリンク先でご購入できます。

活用例1

図5 DMを一斉送信するシェルスクリプト(raspi_dm.sh)

#!/bin/sh

SOURCE_ADDRESS="自分のGmailアドレス"
DISTINATION_LIST="sendlist.txt"
USER_ID="Googleアカウントのユーザー名"
PASSWORD="Googleアカウントのパスワード"
MESSAGE_TEMPLATE_FILE="message.txt"

NUMBER_SEND=$(cat ${DISTINATION_LIST} | wc -l)
sed "s/%source_address%/${SOURCE_ADDRESS}/" ${MESSAGE_TEMPLATE_FILE} > /tmp/tmp_message.txt

for i in $(seq ${NUMBER_SEND})
do
  DISTINATION_ADDRESS=$(sed -n ${i}p ${DISTINATION_LIST} | cut -f 1)
  DISTINATION_NAME=$(sed -n ${i}p ${DISTINATION_LIST} | cut -f 2)
  sed "s/%name%/${DISTINATION_NAME}/g" /tmp/tmp_message.txt | sed -e "s/%distination_address%/${DISTINATION_ADDRESS}/" > /tmp/message.txt
  curl -s -k --url 'smtps://smtp.gmail.com:465' --mail-rcpt ${DISTINATION_ADDRESS} --mail-from ${SOURCE_ADDRESS} --user ${USER_ID}:${PASSWORD} --upload-file /tmp/message.txt
done

rm /tmp/tmp_message.txt /tmp/message.txt

図6 送信メッセージのテンプレートファイル(message.txt)

To: %distination_address%
From: %source_address%
Subject: 同窓会のご案内
Content-Type: text/plain; charset="UTF-8"

%name%

お元気ですか?
ご無沙汰しております。
早速ですが、下記の日程で同窓会を開催いたします。お手数をおかけしますが、出欠をメールにてご返信ください。%name%にお会いできるのを楽しみにしています。
                       記

日時:2019年11月30日(土曜日) 16時から
場所:〇〇〇高等学校 体育館
会費:5000円

                                       以上

図7 送信先のメールアドレスと、個別に書き換えたい情報を保存し
たタブ区切りテキストファイル(sendlist.txt)

taro@example.co.jp    シェルマグ太郎先生
hanako@example.com    シェルマグ花子さん
jiro@example.com    マガジン二郎君

活用例2

図11 受信メッセージをLINEに転送するシェルスクリプト (raspi_mail_line.sh)

#!/bin/sh
 
POP_SERVER="pop.gmail.com"
USER_ID="Googleアカウントのユーザー名"
PASSWORD="Googleアカウントのパスワード"
LINE_TOKEN="LINE Notifyのアクセストークン"

SUBJECT_BASE64="44CQ6YeN6KaB44CR"

expect -c "
  set timeout 30
  spawn openssl s_client -connect ${POP_SERVER}:995
  expect \"+OK Gpop ready\"
  send \"user ${USER_ID}\n\"
  expect \"+OK send PASS\"
  send \"pass ${PASSWORD}\n\"
  expect \"+OK Welcome.\"
  send \"stat\n\"
  expect \"+OK\"
  send \"quit\n\"
  expect \"+OK Farewell.\"
  exit 0
" > receive.log
 
RECEIVE_COUNT=$(grep +OK receive.log |tail -n2 |head -n 1 | cut -d " " -f 2)
 
for i in $(seq ${RECEIVE_COUNT})
do
  expect -c "
    set timeout 30
    spawn openssl s_client -connect ${POP_SERVER}:995
    expect \"+OK Gpop ready\"
    send \"user ${USER_ID}\n\"
    expect \"+OK send PASS\"
    send \"pass ${PASSWORD}\n\"
    expect \"+OK Welcome.\"
    send \"retr 1\n\"
    expect \".\"
    send \"quit\n\"
    expect \"+OK Farewell.\"
    exit 0
  " > message.log
 
  SUBJECT=$(cat message.log | grep "Subject: =" | sed "s/Subject: =?UTF-8?B?//g "| cut -c 1-16)
 
  if [ ${SUBJECT} = ${SUBJECT_BASE64} ] ; then
    cat message.log | awk '/Content-Language\: en-US/,/^\./' | head -n -1 | tail -n +2 > message.txt
    curl -s -X POST -H "Authorization: Bearer ${LINE_TOKEN}" -F "message=$(cat message.txt)" https://notify-api.line.me/api/notify
  fi
done

活用例3

図5 エアコン制御のシェルスクリプト(raspi_aircon)

#!/bin/sh

case $1 in

  "on"  ) bto_advanced_USBIR_cmd -d $(cat /var/aircon/start.txt);;
  "off" ) bto_advanced_USBIR_cmd -d $(cat /var/aircon/stop.txt);;

esac