いますぐ実践! Linuxシステム管理

いますぐ実践! Linux システム管理 / Vol.217 / 読者数:2067名

こんばんは、うすだです。

3月に入り、期末で忙しくなってまいりました。

…いえ、周囲のかたがたはお忙しいのですが、それとは別次元で、 非効率にずるずると孤高?の仕事をする日々が続いています。

先週も、わりと毎日短時間睡眠でがんばっていました。そして、 金曜日の夜までなんとかたどり着けたと安心したのでしょうか、土曜日は、 13時半過ぎまでずっと寝ていました。なんと、12時間連続睡眠です。

人間は、睡眠を貯金することはできないけれど、不足を補うことはできるそうです。 …とはいえ、1日で回復できたのかと聞かれますと、 そうですと言い切る自信はありません。

人間、健康が一番です。ですので、身体のことを考えて、 規則正しい生活を心がけねばと思います。みなさまも、ぜひ心がけてくださいませ。

とは言いながら、日付が変わりそうな現在もモーレツに書いている自分がダメだなあ …と思いつつ、今回もはりきってまいりましょう。

今回のお題 - MIMEマルチパートなメッセージをコマンドラインで作る

2005年2月に当メルマガを始めましたが、いままで、 メールで通知するというネタをさんざんやってまいりました。

さすがにもう最近はいいだろうと思い、あまりネタにしてきませんでしたが、 まだ手をつけていない領域があることに、先日気がつきました。

それは、送りたい情報を添付ファイルの形で送る、というネタです。
具体的には、MIME(Multipurpose Internet Mail Extension) という規格に従ったマルチパートメッセージを、 コマンドラインで作って送れるようにする、という内容をお送りしたいと思います。

MIME とは?

MIME(Multipurpose Internet Mail Extension)とは、 様々な形式のデータをメールで扱うための規格です。

メールは、7bitで表される文字しか扱えないため、そのままでは、 UTF-8やShift-JISなどの文字を扱うことはできません。また、 画像や音声などのデータも扱えません。

そこで、 これらの文字やデータを7bitの文字に変換することで扱えるように考え出されたのが、 MIMEです。
たとえば、ヘッダに以下を追加することで、MIMEを使用していることと、 本文が日本語であることがわかります。

  Mime-Version: 1.0
  Content-Type: text/plain; charset=iso-2022-jp

また、マルチパートと呼ばれる形式があり、 1つのメールに複数のデータを格納してやりとりすることができます。
よく、添付ファイルのあるメールが届きますが、それがマルチパートなメッセージです。

今回は、コマンドラインで、マルチパートメッセージを作成し、 メールとして送信する方法を、以降でご紹介しようと思っています。

といっても Perl の MIME::Lite を使ってしまいます

表題に書いてあることがすべてですが、今回は、 perl を使ってそのようなスクリプトを作成したいと思います。

まず、MIME::Lite というモジュールを使用します。以下のようにperldocを実行して、 No documentation found と言われたら、MIME::Lite はまだインストールされていません。

  $ perldoc MIME::Lite
  No documentation found for "MIME::Lite".

いつものように、パッケージをインストールしてください。

  $ sudo apt-get install libmime-lite-perl  (Debian系の場合)
  # yum install perl-MIME-Lite              (RedHat系の場合)

もしパッケージがなければ、cpan コマンドで直接インストールを試みてください。

  # cpan MIME::Lite

 

パッケージのインストールが終わったら、後はスクリプトを書いて動かすだけです。 ここでは簡略化のため、 画像(GIF)を添付して送るスクリプトでお茶を濁したいと思います。
(各種アドレスや文言、ファイル名などは適時変更してください。)

#!/usr/bin/perl
use MIME::Lite;
use strict;
use warnings;

# マルチパートメッセージを作成
my $msgs = MIME::Lite->new(
    From      => 'usu@usupi.org',
    To        => 'kuriking@gmail.com',
    Subject   => 'test mail',
    Type      => 'multipart/mixed'
);
# テキストをアタッチ
$msgs->attach(
    Type      => 'text/plain',
    Data      => 'I sent a status image.'
);
# 画像(120318-0100.gif)をアタッチ
$msgs->attach(
    Type      => 'image/gif',
    Path      => 'some/where/120318-0100.gif',
    Filename => '120318-0100.gif',
    Disposition => 'attachment'
);
$msgs->print(\*STDOUT);

上記は、usu@usupi.org さんから kuriking@gmail.com さんへ、 決まった画像(120318-0100.gif)を送付するためのスクリプトです。
厳密には、最後に標準出力へ出力しているだけですので、 メールの送信が行われることはありません。

本当にメールを送りたい場合は、最後の1行を以下に差し替えます。
この場合は、sendmailコマンドを使ってメールを送信します。

$msgs->send();

さて、上記スクリプトを実際に実行すると、以下のような出力が標準出力に吐かれます。

  $ ./send_gif.pl
  MIME-Version: 1.0
  Content-Transfer-Encoding: binary
  Content-Type: multipart/mixed; boundary="_----------=_1332089568314820"
  X-Mailer: MIME::Lite 3.027 (F2.78; T1.30; A2.08; B3.08; Q3.08)
  Date: Mon, 19 Mar 2012 01:52:48 +0900
  From: usu@usupi.org
  To: kuriking@gmail.com
  Subject: test mail

  This is a multi-part message in MIME format.

  --_----------=_1332089568314820
  Content-Disposition: inline
  Content-Transfer-Encoding: 8bit
  Content-Type: text/plain

  This is a multipart message.
  --_----------=_1332089568314820
  Content-Disposition: attachment; filename="120318-0100.gif"
  Content-Transfer-Encoding: base64
  Content-Type: image/gif; name="120318-0100.gif"

  R0lGODlhoANEAvIAAAAAAD8/P2lpaf//fwAAgJaWlsDAwP///yH5BAAAAAAA
  If4VQ3JlYXRlZCB3aXRoIFRoZSBHSU1QACwAAAAAoANEAgAD/ni63P4wykmr
  ...

日本語を入れてみる

ひとまずこれで、添付ファイルをメールで送るスクリプトができました。
ですが、メッセージやサブジェクトが英文なのが、ややもの足りません。
ここでは、それらを日本語にしていきたいと思います。

まず、サブジェクトですが、以下のようにすると、日本語が使えるようにできます。 ('テスト' の部分を適時変更してください。)

use Encode;
...
my $msgs = MIME::Lite->new(
    From      => 'usu@usupi.org',
    To        => 'kuriking@gmail.com',
    Subject   => encode('MIME-Header-ISO_2022_JP', 'テスト'),
    Type      => 'multipart/mixed'
);
...

Encode というモジュールを使って、encode という関数で変換したものを指定します。

メッセージは、from_to で変換しています。
('画像送るよ。' の部分を適時変更してください。)

use Encode qw(encode from_to);
...
my $message = '画像送るよ。';
from_to($message, 'utf8', 'ISO-2022-JP');
...
$msgs->attach(
	Type	=> 'text/plain; charset=ISO-2022-JP',
	Data	=> $message,
	Encoding => '7bit'
);
...

おわりに

以上、 PerlスクリプトでMIMEマルチパートなメッセージを送信(出力)する方法をご紹介しました。

GIFだけでなく、いろいろなものを送りたいことがあると思います。
上記をとっかかりにして、いろいろ作成して実行してみてください。

宿題の答え

前回の宿題は、

  違う鍵で参照させたときの動作を確認してみましょう。

でした。

以降では、参照される側が「172.30.1.1」、参照する側が「172.30.1.2」であり、 使用する鍵は共有済という前提で話を進めます。

まず、参照される側は「restrict」ですべて許可しておき、

restrict 172.30.1.2
keys /etc/ntp/key
trustedkey 1

参照する側は間違った鍵で暗号化する、という設定で試してみます。

server 172.30.1.1 key 2
keys /etc/ntp/key
trustedkey 2

すると、参照される側のシステムログに、以下が出力されていました。

  ntpd[PID]: authreadkeys: invalid type for key 11
  ntpd[PID]: authreadkeys: invalid type for key 12
  ...
  ntpd[PID]: authreadkeys: invalid type for key 20

そして、参照する側は、reach が 0 のままであり、 時刻同期される気配がまったく感じられません。(まあ、当たり前ですが。)

       remote       refid    st t when poll reach  delay  offset jitter
  =====================================================================
   192.168.1.211   .INIT.    16 u   64  128    0   0.000   0.000  0.000

というわけで、鍵が違うと返事が返ってこなくなり、時刻同期できない、 ということがわかりました。

念のため、restrict に「notrust」を指定し、違う鍵で暗号化するとどうなるか、 確認してみました。
実際にやってみると…上記と同じ結果となりました。
また、restrict に「notrust」を指定し、暗号化なしでアクセスした場合も、 上記と同じ結果となりました。

最後に、補足と修正です。

「notrust」は、バージョン4.2以降と4.1以前とで、意味が異なります。
4.1以前だと、そのホストの時刻情報を信用しない、という意味です。
(今回は、4.2以降のバージョンという(暗黙の)前提で説明しました。)

6.5.3.1. notrust changed between versions 4.1 and 4.2
http://support.ntp.org/bin/view/Support/AccessRestrictions#Section_6.5.3.1.

また、前回、設定に「authenticate yes」と書いていましたが、 システムログに以下のような出力がありました。(xx はauthenticateの行です。)

  ntpd[PID]: line xx column 1 syntax error, unexpected T_String, \
  expecting $end
  ntpd[PID]: syntax error in /etc/ntp.conf line xx, column 1

指定しなくても動作しますので、指定しないほうがよさそうです。
失礼いたしました。

今回の宿題

今回の宿題は、

  データをZIPで暗号化したものをメールで送ってみましょう。

です。

サーバの情報をそのまま送るのは、ものによってはたいへん危険です。
鍵をどうするかという問題はさておき、暗号化して送るというニーズは、 多々あるのではないかと思います。

最初は汎用的でなくて構わないので、まず動くものを作ってみましょう。

あとがき

先日、会社で、コミュニケーションの勉強会がありました。

自由参加とはいえ、土曜日に丸一日かけて行われるとあって、 気分は複雑(やや抑えた表現を使用しております)でした。

テキストとして使う分厚い本を事前に読んでくることや、 当日は話を聞くだけでなくロールプレイングなどが行われることなど、 気分を複雑にする要素が満載でした。

ですが、当日、実際にやってみると、こっ恥ずかしいというのはありますが、 やってみないとわからないことがいろいろ見えてきたり、 他のひとの意見を聞けたりして、思ったよりも充実した一日を過ごせました。

一番驚いたのが、(当日いない)部下の役を誰かが演じるのですが、 みんな驚くほど特徴をとらえていたことです。そして、自分は、 まったく特徴を思い出せなかったことにショックを受けました。
(どんだけ自分本位で、ひとのことを見ていないんだ…という。)

というわけで、複数で一緒に勉強をすることでよい効果が得られること、 精神的にも物理的にも相手をちゃんと見ていないことに気づけたことが、 今回の収穫でした。
これらのことを、次に活かしていきたいなと思っております。

 

まあ、わたしの場合、職場に馴染むことをまずやるべきなのですが…。
(入社してもう1年経つんですけどね…。)

 

今回も、ここまで読んでいただき、たいへんありがとうございました。
次回は、4月1日(日) の未明にお会いしましょう!

 

「いますぐ実践! Linux システム管理」の解除は、以下からできます。
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

バックナンバーは、こちらにほぼ全部そろっています。
http://www.usupi.org/sysad/backno.html

「栗日記」- また低空飛行ぎみですが、描いてますよ。。
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)
http://usupi.org/k/ (モバイル栗日記)


[バックナンバーのトップへ] [Linux システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
Yahoo!ニュース - Linux
Yahoo!のLinuxに関するニュース一覧です。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本