2017 年度 OSS リテラシー 3 : 第 5 回 メール & cron

メール

メールサーバの設定

MTA (Mail Transfer Agent) として postfix, sendmail, qmail が有名であるが, 今回は外部からのメール受信を行わないので高機能な MTA は必要ない. Debian のデフォルトの MTA である exim を用いることにする. mailutils パッケージをインストールすると exim 関連も一緒にインストールされる.

$ sudo -s

# apt-get update

  ... (略) ...

# apt-get upgrade

  ... (略) ...

# apt-get install mailutils

  パッケージリストを読み込んでいます... 完了
  依存関係ツリーを作成しています                
  状態情報を読み取っています... 完了
  以下の追加パッケージがインストールされます:
    exim4-base exim4-config exim4-daemon-light guile-2.0-libs libgc1c2 libgsasl7 
    libkyotocabinet16v5 libmailutils5  libntlm0 mailutils-common
  提案パッケージ:
  ...(中略)...
  取得:1 http://moon.epi.it.matsue-ct.jp/raspbian stretch/main armhf exim4-config all 4.89-2+deb9u1 [377 kB]
  ...(後略)...

外部へメールを送るための設定を行う. メールの送信には高専のメールサーバ (red.matsue-ct.jp) をリレーする. 外部からのメールは受信しないことにする.

# dpkg-reconfigure exim4-config

dpkg-reconfigure コマンドを実行すると, ターミナル上にグラフィカルな設定画面が表示される. タブを押すと <了解> <取消> を選択することができる.

  • メール設定のタイプ: スマートホストでメール送信; SMTP または fetchmail で受診する
    • メールは全て高専のメールサーバ (スマートホスト) に送信するので. ラズパイから高専の外部のサーバへ SMTP できない.

  • システムメール名: iot-XX (各ラズパイのホスト名)
    • デフォルトのホスト名のまま変更しなくて良い. 後ほど書き換えを有効にする.

  • 入力側 SMTP 接続をリスンする IP アドレス: 127.0.0.1
    • 外部からのメールを受信しない. 127.0.0.1 はローカルホストを意味する IP.

  • メールを受け取るその他の宛先: (空欄)
    • 外部からのメールを受信しないので, 設定する必要がない.

  • メールをリレーするマシン: (空欄)
    • ほかのホスト向けのスマートホストにする必要がない

  • スマートホスト: red.matsue-ct.jp

  • 送信するメールでローカルメール名を隠しますか? : はい

  • 表示するローカルユーザのドメイン名: epi.it.matsue-ct.jp
    • epi.it.matsue-ct.jp は情報工学科杉山研究室のサブドメイン.
    • これを有効にしないと, スマートホスト (red.matsue-ct.jp) が受信を拒否する.

  • DNS クエリの数を最小限にとどめますか? : いいえ
    • インターネットに常時接続しているので.

  • ローカルメールの配送方法: /var/mail 内の mbox 形式

  • 設定を小さなファイルに分割しますか? : いいえ

  • root と postmaster のメール受信者: sugiyama
    • 教員のアカウントにしておいて下さい.

ローカルメールの送受信確認

ローカルメール配送の確認を行う. まずは mail コマンドを使ってメールを送る.

$ echo "本文" | mail -s "タイトル" hogehoge

mail コマンドで届いたメールを読む.

$ mail

  "/var/mail/hogehoge": 1 message 1 new
  >N   1 HOGEHOGE           土 10月 21 12:  15/466   title
  ? 1                                      (1 を入力) 

  Return-path: <hogehoge@iot-00>
  Envelope-to: hogehoge@iot-00
  Delivery-date: Sat, 21 Oct 2017 12:24:26 +0900
  Received: from hogehoge by iot-00 with local (Exim 4.89)
  (envelope-from <hogehoge@iot-00>)
  id 1e5kOg-0000op-1k
  for hogehoge@iot-00; Sat, 21 Oct 2017 12:24:26 +0900
  Subject: title
  To: <hogehoge@iot-00>
  X-Mailer: mail (GNU Mailutils 3.1.1)
  Message-Id: <E1e5kOg-0000op-1k@iot-00>
  From: HOGEHOGE <hogehoge@iot-00>
  Date: Sat, 21 Oct 2017 12:24:26 +0900

  本文

  ? q                                       (終わるときは q を入力)
  Saved 1 message in /home/hogehoge/mbox
  Held 0 messages in /var/mail/hogehoge

メールの配送ログを確認する. tail コマンドでログファイルの末尾のみを表示する (cat コマンドや less コマンドを利用すればログを全て表示することができる). 以下の例では, hogehoge@iot-00 (iot00 はローカルホスト) にメールを送り, 完了 (completed) していることがわかる.

$ tail /var/log/exim4/mainlog 

  ...(中略)...
  2017-10-21 12:24:26 1e5kOg-0000op-1k <= hogehoge@iot-00 U=hogehoge P=local S=359
  2017-10-21 12:24:26 1e5kOg-0000op-1k => hogehoge <hogehoge@iot-00> R=local_user T=mail_spool
  2017-10-21 12:24:26 1e5kOg-0000op-1k Completed

Raspbian では既読のメールはデフォルトでは表示されないようだ. オプションで mbox を指定すると 全て表示される. 番号を入力すると再びメールを読むことができる. また, mbox 自体をページャー (less など) で表示しても届いたメールを全て確認することができる.

$ mail

  No mail for hogehoge

$ mail -f mbox 

  "/home/hogehoge/mbox": 3 messages 1 unread
       1 HOGEHOGE           金 10月 20 06:  18/527   タイトル
       2 HOGEHOGE           土 10月 21 12:  17/486   title
  >U   3 HOGEHOGE           日 11月  5 17:  17/492   タイトル
  ? 
   ...(略).....
  ? q

$ less mbox

   ...(略).....

自分の学校のメールアドレスにメールを送る

スマートホスト経由でメールが配送されるか確認を行う. mail コマンドを使って自分の学校のメールアドレスにメールを送る. 学校の PC や携帯でメールが届いたか確認すること.

$ echo "本文" | mail -s "タイトル" jxxxx@matsue-ct.jp  (メールアドレスは適宜変更すること)

ログを確認する. 送信がうまくいけば, OK, completed などの文字が確認できる.

$ tail /var/log/exim4/mainlog 

  ...(中略)...
  2017-10-21 12:52:55 1e5kqF-0001IH-2i <= hogehoge@iot-00 U=hogehoge P=local S=371
  2017-10-21 12:52:55 1e5kqF-0001IH-2i => sugiyama@matsue-ct.jp R=smarthost T=remote_smtp_smarthost H=red.matsue-ct.jp [10.0.10.3] C="250 2.0.0 Ok: queued as 7CB4B294108C"
  2017-10-21 12:52:55 1e5kqF-0001IH-2i Completed

もしもメールの配送ログを見て, 以下のようにエラーが生じている場合には, 設定が間違っている. その場合は送信エラーとなっているメールのキューを削除せよ. さらに先に行った dpkg-reconfigure コマンドを実行して再度設定を確認せよ.

$ tail /var/log/exim4/mainlog 

  2017-10-21 12:36:17 1e5ka9-0000qv-Hn <= hogehoge@iot-00 U=hogehoge P=local S=371
  2017-10-21 12:36:17 1e5ka9-0000qv-Hn == sugiyama@matsue-ct.jp R=smarthost T=remote_smtp_smarthost defer (-44) H=red.matsue-ct.jp [10.0.10.3]: SMTP error from remote mail server after RCPT TO:<sugiyama@matsue-ct.jp>: 450 4.1.8 <hogehoge@iot-00>: Sender address rejected: Domain not found

#  exim -bp | exiqgrep -i | xargs exim -Mrm   (キューの削除)

  Message 1e5ka9-0000qv-Hn has been removed

# dpkg-reconfigure exim4-config (設定しなおし)

  ...(略)...

cron を用いた定期的なコマンド実行

定期的にコマンドを実行する仕組みとして cron がある. センサーデバイス (ラズパイ) でファイル出力したデータを サーバに定期的に転送したり, バックアップを定期的に行う 場合など, cron を使う機会は多い.

各ユーザが定期的にコマンドを実行するコマンド群は crontab に登録する. 以下では 5 分毎に時刻をネットワークの設定を出力する. TIPS であるが, cron では /sbin に PATH が通っていないので, PATH=/usr/bin:/bin:/usr/sbin:/sbin を設定しておくと良い. また, cron の出力はメールで送信される. 送信先のメールアドレスを指定する場合は, MAILTO に与えると良い. 以下の例ではメールを確認するために, わざと cat コマンドを実行している.

なお, crontab を始めて実行した時にはエディターの選択画面が 現れる. vim.tiny (vi) を選択することを勧める.

$ mkdir data_now  (データ保管用ディレクトリを作成)

$ crontab -e

  no crontab for hogehoge - using an empty one

  Select an editor.  To change later, run 'select-editor'.
    1. /bin/ed
    2. /bin/nano        <---- easiest
    3. /usr/bin/vim.tiny

  Choose 1-3 [2]: 3     (3 を選択)

  # m h  dom mon dow   command
  PATH=/usr/bin:/bin:/usr/sbin:/sbin
  MAILTO=jxxxx@matsue-ct.jp                      (自分のメールアドレスを指定すること)
  */5 * * * * hostname -I > data_now/ip.txt ; cat data_now/ip.txt

cron が実行された時刻を見計らって, 自分のメールアドレスにメールが届いていることを確認する.

さらに, ファイルのタイムスタンプなどを確認する. タイムスタンプやファイルの中身が時間の経過と共に変化していることを確認すること.

$ ls -l data_now/ip.txt  (ファイルのタイムスタンプを確認)

  -rw-r--r-- 1 hogehoge hogehoge 15 10月 21 13:10 data_now/ip.txt

$ cat data_now/ip.txt    (ファイルの中身を確認)

  10.138.64.114       (有線 LAN と無線 LAN を使っている場合は IP が 2 つ表示される)

$ ls -l data_now/ip.txt  (ファイルのタイムスタンプを確認; 時間をおいて実行)

  -rw-r--r-- 1 hogehoge hogehoge 15 10月 21 13:15 data_now/ip.txt

crontab を修正し, data_now ディレクトリをサーバ sky.epi.it.matsue-ct.jp に送る設定にする. ファイル送信には rsync コマンドを用いる. また, jxxxx は自分の学生番号に直すこと.

$ crontab -e

  PATH=/usr/bin:/bin:/usr/sbin:/sbin
  MAILTO=sugiyama@matsue-ct.jp
  */5 * * * * hostname -I > data_now/ip.txt ; rsync -e "ssh -l jxxxx" -a data_now sky.epi.it.matsue-ct.jp:~/

ファイルがサーバ sky.epi.it.matsue-ct.jp に転送されたか確認する.

$ ssh -l jxxxx sky.epi.it.matsue-ct.jp

  The programs included with the Debian GNU/Linux system are free software;
  the exact distribution terms for each program are described in the
  individual files in /usr/share/doc/*/copyright.

  Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
  permitted by applicable law.
  Last login: Sat Oct 21 13:21:00 2017 from 10.138.64.114

sky$ 
sky$ ls -l data_now/ip.txt

  -rw-r--r-- 1 jxxxx jxxxx 15 10月 21 13:25 data_now/ip.txt

sky$ exit  (サーバからログアウト)

$ exit

crontab 編集後は cron メールが届かなくなるはずである. これは, 5 分毎に実行しているコマンドが標準出力に何も出力しないためである. 例えば, crontab に記述したコマンドをターミナル上で実行すると, そのことを確認することができる.

$ hostname -I > data_now/ip.txt ; rsync -e "ssh -l jxxxx" -a data_now sky.epi.it.matsue-ct.jp:~/

  (何も表示されない)

$ 

課題

  • 上記演習を行い, サーバ (sky.epi.it.matsue-ct.jp) に data_now ディレクトリを転送せよ.
    • 本日の演習の最後に, 教員は各自のホームディレクトリに ip.txt が出来ているか & メール送信できるか確認する.
    • 次回の最初にも同様の確認を行う. 次回の最初までに演習内容を終えていれば OK.
  • 上記演習で自分に届いたメール (含むヘッダ) を wbt のオンラインテキストにコピペせよ. さらに, メールヘッダ上のキーワード (Return-Path, Deliverd-To, Recieved, Mime-Version, Content-Type, Content-Transfer-Encording, From, To, Subject, Date, Message-Id) の意味を調べよ.