実行 - みる会図書館


検索対象: UNIX MAGAZINE 2004年1月号
73件見つかりました。

1. UNIX MAGAZINE 2004年1月号

軽メールシステム 表 4 レシピに指定するフラグ お 意味 フラグ H B D h b hb f A E w W 1 ヘッダに対して egrep を実行 ( デフォルト ) メール本文に対して egrep を実行 egrep で大文字・小文字の区別をする ヘッダ部だけをアクションに渡す 本文だけをアクションに渡す ヘッタ部と本文をアクションに渡す ( デフォルト ) パイプをフィルタとみなす。アクションのパイプで処理した結果が、以降のレシピに渡される メールの内容力そのままアクションに渡される ( メール末尾を示す空行も加えない ) 馮囚みェラーを無視する w フラグと同じだが、フィルタやコマンドのエラーメッセージを無視する アクションに指定したフィルタやコマンドカ冬了するまで待ち、終了コードをチェックする。 直前に処理したレシピのアクションが失敗したら、このレシピが実行される 初に条件を満たしたものより下のレシピによる処理はおこなわれない 直前に処理したレシピが実行されていなければ、このレシピが処理される。 E フラグ付きのレシピカ芍車続している場合は、最 基本的には A と同じだが、直前のレシピのアクションか正常に終了したときだけ、このレシピによる処理がおこなわれる 直前にある、 A や a のフラグカ寸いてないレシピの条件が満たされていたら、このレシピが処理される (AND 動作 ) ピーされ、コピーされたプロセスはそのまま処理を続ける。親プロセスはプロックの最後までジャンフする 中幻医のためのレシピでは、メールのカーボンコピーが生成される。ネストプロックでは実行中の procmail のプロセスがコ 図 34 レシピの基本的な書式 : 0 [ フラグ 1 ] . * 条件 1 * 条件 2 * 条件れ アクション . [ フラグ司 [ : [ ロックファイル ] ] て処理がおこなわれます。すべてのレシピの処理が終った あとでもメールデータカ曵っていれば、そのユーザーのロ ーカルのメールスプールに書き出されます。 レシピの書式 レシピの基本的な書式を図 34 に示します。 レシピはレシピの動作を指示するフラグと、レシピが重 複して実行されないようにするためのロックファイルを指 定した行から始まり、アクションの言当で終ります。その * で始まる条イ髫于を複数謎杢することがで あいだには、 きます。 フラグとロックファイル 各レシピの先頭の行では、 : 0 " に続いて表 4 のフラグ を複数謎杢することができます。フラグに続けて、、 : " を記 述すると、そのレシピではロックファイルを用いた排他制 御がおこなわれます。 ファイルの書込み処理をともなうレシピでは、ロックフ UNIX MAGAZINE 2004. 1 ァイルによる排他制御が必要になります。 procmail はメ ールカサリ着するたびに起動されるため、短時間に連続して メールカリ着した場合には、同時に複数の procmail が実 行中となり、同じレシピにもとづく処理が並行しておこな われる可能性があります。書込み処理が同時に実行される と、書込み先のファイルが壊れてしまうので、ロックファ イルによってレシピが並行して実行されないようにしてい るわけです。 通常、ロックファイル名は、、 : " に続けて指定しますが、ア クションがファイル出力に関するものであれば省略しても かまいません。その場合には、レシピのアクションで出力 先に指定されたファイル名に変数 LOCKEXT の値を加 えたものがロックファイル名になります。 条件行 条 ( 于は、、 * " で始まります。 egrep で使われるものと同 じ正規表現で記述でき、メールのヘッダ部との比較がおこ なわれます。 procmail の条イ材引こは、表 5 のような特殊な条件を表 現するために特別な記号を含めることができます。この記 号を使うと、正規表現では表せない条件の言当カ河能にな ります。たとえば、変数名 ? ? と < という特殊な条件を組 * H ? ? く 250 み合わせた、 155

2. UNIX MAGAZINE 2004年1月号

などとすると、 $ var が展開されたときに、、何もなし " とな [ -eq yes ] めのコードが続きますが、その前に次のようなコメントが これらの関数の定義が終ると、実際に処理をおこなうた set ー v コマンド れません。 を 2 度インクルードしても、 2 度目以降は内容は取り込ま INCLUDED というマクロを定義するため、同じファイル いときにのみ内容を評価するのですが、そこで HEADER- HEADER-INCLUDED というマクロが定義されていな この場合にも、おこなっている処理はまったく同じです。 #endif # define HEADER_INCLUDED #ifndef HEADER_INCLUDED まれるのを避けるための言当などが挙げられます。 した。たとえば、 C 言語のヘッダファイルカ夏数回取り込 これとよく似た処理は、これまでにもいくつか紹介しま ていることになり、本体部分は実行されません。 次に実行しようとしたときにはすでにこの変数は設定され します。そこで md-created-boot の値を設疋するため、 boot カ又疋されていない場合には、 if 文の本体部分を実行 という処理がおこなわれます。つまり、変数 md-created- md_created_boot=created る引数が boot の場合、この部分では、 のコマンド行の意味はもうお分かりでしよう。関数に対す ントが複数回実行されないようになっています。この最後 とは組になっていて、同じマウントボイントに対するマウ eval md—created—$l=created の最後にある、 こまでにみてきた 1 行目の if コマンドと、その本体部 同じ文字を付けているのです。 字を付け加えています。そのため、比較対象となる側にも うため、引数が、、ない " という状況にならないように、 1 文 す。すると、 [ コマンドの構文に合わす工ラーとなってしま というコマンド行として解釈されてしまう可能生がありま 114 記されています。 # DEBUGGING # set —v コメントの最後の行では、コマンド行がコメントアウト されています。 シェルでは、起動時に一 v オプションカ甘旨定されると、読 み込んだコマンド行を標準工ラー出力に出力しながらコマ ンドを実行するようになります。この出力は、シェル・ス クリプトのデバッグの際にたいへん役立ちます。しかし、 今回紹介している initdiskless スクリプトは、コマンド行 で指定して実行するファイルではなく、 /etc/rc スクリプ トのなかから自動的に読み込まれて実行されます。そのた め、このファイルのデバッグをおこなう場合、ファイルの 実行時に一 v オプションを指定してシェルを実行すること はできません。 そこで登場するのが、上記のコメントアウトされたコマ ンド行です。シェルの set コマンドは、引数としてシェル に対するオプションを指定して実行すると、現在実行して いるシェルの起動時にそのオプションが指定されていたか のように動作します。つまり、 —V とすることで、以降は読み込んだコマンド行を出力しなが らスクリプトを実行するようになります。したがって、 のコマンド行を有効にすれば、 initdiskless スクリプトの デバッグ作業が楽になります。おそらく、このスクリプト の作者がデバッグしていたときの名残なのでしよう。 iflist=' ifconfig ー 1 ( bootp—ipbca= bootp—ipa= bootp—ifc=" " 数の初期化です。 このあとは、通常のコマンドが並んでいます。まずは変 アドレスなどの取得 UNIX MAGAZINE 2004. 1 しています。 ために ifconfig コマンドを実行し、その結果を変数に設疋 最後の iflist は、インターフェイスのリストを取得する

3. UNIX MAGAZINE 2004年1月号

連載 / 旧ルーティング 図 2 Zebra の構造 バケット ソケット ルーティング経路表 zebra 情報、経路の交換 インターフェイス ripd 図 3 丿レーティングプロトコ丿レ デーモン ospfd bgpd システム カーネ丿レ バケット転送 zebra デーモンと各デーモンの関係 ユーザー Te 旧 et コネクション ↓ ospfd ↓ bgpd UNIX ドメインソケット 、、、インターフェイス zebra 情報、経路の交換 システムカーネル ルーティング・メッセージの送受信 ません。 Zebra のデーモンがおこなうのは、ルーティング・ メッセージをほかのルータと交換し、自システムの糸登各表 を作成することだけです。実際のバケット転送は、カーネ ルがおこないます。バケット転送の際にカーネルカ釜路表 を参照するため、 zebra を用いてバケットの通り道をコン トロール ( 経路制御 ) することができるわけです。ただし、 、、ルータがどのくらい速くバケットを転送できるか " という 点には、 Zebra は関知しません。これは、ルータのハード ウェア構成や、プラットホームのカーネルの効率に依存し ます。 利用しないルーティング・デーモンは、起動する必要は ありません。たとえば、 RIPng を動かすだけのルータで あれば zebra デーモンと ripngd デーモンを起動すればよ く、 ospfd や bgpd などは起動する必要がありません。ま た、もつばらスタティック・ルーティングをおこなうルー タで Zebra を利用するのなら、 zebra デーモンだけを起動 すればよいわけです。今回の末尾近くで説明する設定をお こなうとき、起動する必要があるのは zebra デーモンだけ です。 Zebra の各デーモンには、設疋用のイ反想末の機能があ ります。各デーモンは、特定のポート番号で Telnet プロ トコルによる接続を待ち受けています。ここで動的な設定 や、設定・動作伏況の確認をおこなうことができます。設 定用端末の詳細はします。 zebra デーモンと、 ripd などのルーティングプロトコ ル・デーモン ( 以下、ルーティング・デーモン ) の関係は、 UNIX MAGAZINE 2004. 1 図 3 のようになっています。各デーモンと zebra デー モンは、 UNIX ドメインソケットを用いたコネクション を確立します ( これを TCP ソケットを利用したコネク ションに変更するには、コンパイルする際、 configure に —enable—tcp—zebra を指定します ) 。 各ルーティング・デーモンがもつ外部へのインターフェ イスは、カーネルに対するルーティング・メッセージの送 受信用ソケット、 zebra デーモンに対する UNIX ドメイ ンソケット、そしてユーザーに対する設疋粫末用 TCP ソ ケット (Telnet ターミナル ) の 3 つです。 ー殳的なルーティング・デーモンの動作は、次のように なります。 ユーザー端末や zebra からの入力もプロトコル・イベン ル・イベントをスケジュールする ( 上記の 4 に戻る ) 。 5. ルーティング・メッセージの受信から、適切なプロトコ 要であればルーティング・メッセージを送信する。 4. スケジュールされたプロトコル・イベントを実行し、必 から、適切なプロトコル・イベントをスケジュールする。 3. 設疋ファイルとネットワーク・インターフェイスの情報 イス情報を読み込む。 2. zebra デーモンに接続し、ネットワーク・インターフェ 1. 起動後、設疋ファイルから言定を読み込む。 て実現されます。プロトコル・イベントの実行時には糸各 れは、 lib/thread. c モジュールを用いてイ反想スレッドとし トと同様にスケジュールされ、並行して実行されます。 133

4. UNIX MAGAZINE 2004年1月号

ロプログラミンク・テクニック 多治見寿和 rc スクリプト ( 2 ) 前回は、あるプログラムをとりあげてその動作やソース コードを解説するこれまでのスタイルとはすこし異なり、 システムの起動時におこなわれる処理に注目しました。そ の一連の処理のなかで実行される /etc/rc ファイルをとり あげ、このスクリプトの内容と動作について説明しました。 しかし、前号で紹介したのはほんの入口の部分にすぎま せん。 /etc/rc ではほかにもいくつかの技術が使われてい ます。今回は、 rc スクリプトのなかから最初に呼び出され るスクリプトである initdiskless についてみていきましょ /etc/rc. d ディレクトリに置かれているスクリプトの実 行判よ、前回紹介した rcorder プログラムで決められま す。それによれば、最初に実行するのは initdiskless スク リプトになります。これは、システムをディスクレス・マ シンとして起動する際にメモリディスクの設疋をおこなう ためのスクリプトです。したがって、通常の起動時には実 行する必要はなく、ディスクレス・マシンとして利用する 場合にのみ実行されます。 このファイルも / b ⅲ / sh スクリプトとして作られている ため、インタープリタ指定の行から始まっています。 # ! /bin/sh このあとに続くコメントのなかで、 rcorder コマンド用 rco 「 der による順番の決定 # PROVIDE: initdiskless の条イ牛指定プロックカ第当されています。 # KEYWORD : FreeBSD 前回も説明したように、 この言当からは、 このファイル UNIX MAGAZ 工 NE 2004. 1 では initdiskless という条件を提供しており、 FreeBSD のときに利用するファイルであることが分かり ます。 システムカゞ 111 場合にのみ 1 となっています。 の値は、システムをディスクレス・マシンとして利用する less-valid というシステムの変数値を取得しています。 最初の行では、 sysctl コマンドを使って vfs. nfs. disk- [ ${d1v:=0} -eq 0 ] & & exit 0 2 > /dev/null ( dlv='/sbin/sysctl —n vfs . nfs . diskless_valid , で折り返しています。以下同様 ) 。 行からプログラムの本体部分が始まります ( 誌面の都合上、 これ以降もコメントカいたあと、次のようなコマンド 内容を実行するかどうかの決定 ドによってこのファイルが先頭に配置されたわけです。 指定されることはありません。そのため、 rcorder コマン REQUIRE に指定されることはあっても、 BEFORE に PROVIDE している initdiskless は、ほかのファイルで 行することはできません。一方、 initdiskless ファイルが で BEFORE に指定されているため、これらを最初に実 が PROVIDE している securelevel は、ほかのファイル と vinum が PROVIDE している disks や、 securelevel less 、 securelevel 、 vinum の 4 つがあります。しかし、 ccd 調べてみると、このようなファイルには ccd 、 initdisk- いファイルはないことも分かります。 このファイルを実行する前に実行しておかなければならな また、 REQUIRE キーワードは指定されていないので、

5. UNIX MAGAZINE 2004年1月号

プログラミング・テクニック 71 図 1 create-md 関数 create-md() { if [ t'x'eval echo \\$md—created—$l ( if [ "x'eval echo \\$md-size-$l' md_size=4096 else ] ; then "x'l ] ; then md—size='eval ech0 \\$md—size—$l mount—md $md—size / $ 1 /bin/chmod 755 / $ 1 eval md—created—$l=created f i 数はかならすルート・ディレクトリに存在するディレクト リでなければならず、たとえば / b 。 ot を指定する場合には 、 boot" と記述します。また、同じマウントボイントに複 数のメモリディスクを作成してしまわないような工夫も施 されています。 関数定義の 1 行目では、ちょっと複雑な処理をしてい ます。 [ コマンドの引数の指定でわざわざバッククオートを こでは何をしているのでしようか。 使っていますが、 たとえば、引数として boot が指定された場合を考えて みましよう。最初に、 [ コマンドを実行するために引数を準 備します。しかし、第 1 引数や第 3 引数はダブルクオート で括られているため、まずバッククオートの処理や変数の 展開などがおこなわれます。今回の例では、バックスラッ シュによるエスケープの処理と、変数 $ 1 の展開がおこなわ eval echo \$md—created—boot まれているため、次にその内側を実行します。 こうしてできあがった第 1 引数にはバッククオートが含 if [ x'eval echo \$md—created—boot ( れます。 then UN 工 X MAGAZINE 2004. 1 つまり、 md-created-boot という変数の値カ駛われる echo $md—created—boot れます。 回の例では、バックスラッシュによるエスケープが処理さ て実行するのはこれらの処理が終ったものになります。今 ープの処理などを再度おこなうため、実際にコマンドとし 解釈部では、変数の展開やバックスラッシュによるエスケ がシェルのコマンドの解釈部分に渡されます。コマンドの マンド行とみなして実行するコマンドです。そこで、引数 実行すべきコマンドは eval で、これは引数をそのままコ ことになります。 113 [ $var -eq "yes" ] 比較する場合に、 たとえば、空文字列に展開されるような変数と文字列を 能性があります。 合には、空文字列カ在しないものと解釈されてしまう可 ォートで括られていたりして、ネ礬な処理の対象となる場 指定できます。ところが、今回のコードのようにバックク ルクオートを 2 つ使って””と記述することで空文字列を 較をおこなう場合、空文字列と比較したいのであればダブ おこなうときの常套手段になっています。単純に文字列比 じません。しかし実際には、これはシェルで文字列比較を x という文字です。一見したところ、とくに必要性は感 もう 1 つの疑問は、このコマンド行に付けられている のようなネ辧隹な処理も可能になります。 列も十分に扱えないものですが、すこし工夫することでこ やすさに大きな違いがあります。シェルは言語としては配 想配列カ駛えるのと使えないのとでは、プログラミングし し、プログラムの実行速度も遅くなります。それでも、連 はかなりのカ技ですから、あまりスマートとはいえません もちろん、バッククオートや eval コマンドを利用する方法 クオートと eval コマンドを使って実現しているわけです。 ようど、 awk や perl の連想配列と同様の効果を、バック に含むような変数の値を参照していることになります。ち このコマンド行では、引数として渡された文字列を名前 となります。 if [ xcreated = x ] ; then 行全体としては、 boot の部分は created に置き換えられるため、コマンド この変数の値が、、 created" だとすると、 md-created-

6. UNIX MAGAZINE 2004年1月号

連載 / 旧ルーティング 図 1 Zebra のソースコードのディレクトリ構造 AUTHORS COPYING COPYING. LIB CVS/ ChangeLog INSTALL M akefile. am Makefile. ⅲ NEWS README REPORTING-BUGS configure. ac configure config. sub config. h. ⅲ config. guess bgpd/ aclocal.m4 TODO SERVICES dep comp ospfd/ ospf6d/ mkinstalldirs rmssmg lib/ install-sh init/ guile/ doc/ ports/ zebra/ vtysh/ update-autotools t001S / stamp-h. in ripngd/ ripd/ 表 1 各ディレクトリの内容 ティレクトリ名内容 zebra ripd ripngd ospfd ospf6d bgpd lib zebra デーモン ripd デーモン ripngd デーモン ospfd デーモン ospf6d デーモン bgpd デーモン 説明 BGP4 と BGP4 十 (IPv6 用 BGP) の両方を実行 OSPFv3 (IPv6 用 OSPF) を実行 OSPFv2 を実行 RIPng (IPv6 用 RIP) を実行 RIPv1 、 RIPv2 を実行 ほかの各デーモンとカーネルとを仲介 libzebra ライプラリすべてのデーモンカ坏リ用するライプラリ 追加にも適しています 2 。石黒さんがソフトウェアとして の品質を重視しているため、 Zebra はべータバージョンで すが、それにもかかわらず、、プロダクション・レベル " と ・ http://www.zebra.org/ Zebra のソースコードは、 Zebra の構造 呼ばれるほと漓い品質を保っています。 ルーティング・プロトコルへの拡張も、 Zebra プロジェクトの外でおこな 2 IS-IS プロトコルや、 MANET (Mobile Ad-hoc NETworking) お分かりだと思いますが、各デーモンはそれぞれの名前 名付けられています。 情報を奐するための特別なデーモンが zebra デーモンと これらの各デーモンをとりまとめ、システムのカーネルと BGP を動作させるための独立したデーモンです。そして、 のデーモンです。たとえば、 ospfd は OSPF を、 bgpd は それぞれ 1 つのルーティング・プロトコルを実行するため Zebra は、複数のデーモンから構成されます。これらは、 bra の主要なプログラムコードを含むディレクトリです。 リが生成されます。これらのうち、太字で表したのが Ze- tar. gz ) を展開すると、図 1 のようなファイルやディレクト からダウンロードできます。ソースコード (zebra-0.93a. 132 われているようです。 と同じディレクトリにオ内されています。また、 lib ディレ クトリには、各デーモンが共通して利用するライプラリが 含まれています。ライプラリとしては、〕叫吉リスト、パト リシアツリーなどのデータ構造を実装しているプログラム コードのほか、各デーモンが zebra デーモンと情報をやり とりするための関数群 (lib/zclient. c など ) が含まれてい ます。各ディレクトリの内容は、表 1 のとおりです。 zebra デーモンは、各ルーティング・プロトコルとカー ネルとの情報のやりとりを仲介する、サーバーのような役 目を果たしています。各ルーティング・デーモンは、ネッ トワーク・インターフェイスや、システムか現在イ寺してい る彳各などの情報を zebra デーモンから取得します。ネッ トワーク・インターフェイス情報の取得方法は、 Linux や FreeBSD など、プラットホームごとに異なります。しか し、 zebra デーモンが仲立ちをしてくれるため、各ルーティ ング・デーモンはプラットホームの違いを意識する必要が 少なくなります。しかし、各ルーティング・デーモンは、す べての処理を zebra デーモン経由でおこなうわけではあり ません。たとえば、ルーティング・プロトコル特有のメッ セージは、カーネルとのあいだで直接送受信されます。 の様子を図 2 に示します。 図 2 に示した Zebra の 4 つのデーモンと、カーネルがお こなうバケットの輯医 ( 図の下部 ) には、直接の関係はあり UNIX MAGAZINE 2004. 1

7. UNIX MAGAZINE 2004年1月号

特集安全なネットワー 図 4 chkconfig の実行 同様にほかのネットワーク・デーモンも起動しないよう このコマンドを実行しても、すでに起動しているプロセ ク① # /sbin/chkconfig —list nt pd syslog netfs network xinetd 0:off O:off 0:off 0:off 0 : off l:off l:off l:off l:off l:off 2:off 2:off : 0 Ⅱ 2:off 2 2 ・ 3 : 0 Ⅱ : on 3 : on 3 : on 3 : 0 Ⅱ 3 4:off : on : on : on : on 4 4 4 4 5:off : 0 Ⅱ : 0 Ⅱ : 0 Ⅱ : 0 Ⅱ 5 5 5 5 6:off 6:off 6:off 6:off 6:off 図 5 Control と Caps Lock を入れ替える ( 下線部おロ ) に言定してください。 KEYTABLE="us ctrl" KEYBOARDTYPE="pc" カーネルのソースコードもインストールしているのは、 ・ kernel ー source -2.4.20 ー 20.9. i386. rpm ・ kernel ー 2.4.20 ー 20.9. i686. rpm ジがインストールされていることを豺是に話を進めます。 たファイルを選びましよう ) 。以降では、これらのパッケー インストールしました ( 使用している CPU の種類に合っ してインストールします。私は、下記の 2 つのファイルを 新のカーネルとカーネルソースの RPM パッケージを入手 次に、 Red Hat L ⅲ ux のダウンロード・サイトから最 # loadkeys us ctrl 次のコマンドを実行しましよう。 変更します。いますぐ入れ替えたいのなら、 root の権限で たいときは、 /etc/sysconfig/keyboard を図 5 のように コンソールで Caps Lock と Control キーを入れ替え いる人にとっては、このままではひどく不便です。 だん、 xmodmap などでこれらのキーを入れ替えて使って 隣、 Control は左 Shift キーの下に配置されています。ふ 101 や 106 キーポードなどでは、 Caps Lock は A キーの ソール上でおこなうことになります。ところが、いわゆる トログインができるようになるまでは ) キャラクタ・コン をインストールしないため、操作は ( すくなくとも、リモー ファイアウォール・ホストには、 X ウインドウ・システム るポート番号を確認しましよう。 て netstat コマンドを再度実行し、待受け状態になってい スは停止されません。設定を終えたらシステムを再起動し 48 次回に PPTP サーバーをインストールするための下準備 です。 PPTP のサーバー・プログラムは、ファイアウォー ル・ホストとは別のホストにインストールしますが、 ip- tables を PPTP に対応させるためのパッチを当ててモ ジュールを再コンパイルする必要があります。 PPTP を インストールしないのであれば、カーネルのソースコード はインストールしなくてもかまいません。 OS のインストール終了後、ディスプレイとキーポード を取り外して運用する場合は、シリアル・コンソールをセッ トアップします。 Red Hat Linux のカーネルは、シリアル・コンソール の機能を組み込んでコンパイルされているので、カーネル を再構築する必要はありません。 編集するファイルは以下の 3 つです。 /etc/grub. conf /etc/inittab /etc/securetty これらのファイルをそれぞれ図 6 のように変更します。 変更したら、 OS を再起動します 2 。 インターネットから DMZ の SSH サーバーへの接続を 可能にするには、 22 番ポートへの接続をファイアウォール で逆 IP masquerade し、 DMZ へ転送します。ところ が、このように設疋すると、インターネットからファイア ウォール・ホストへ SSH で接続できなくなってしまいま す。さきほども述べたように、セキュリティ対策という点 では、インターネットからファイアウォール・ホストへの ログインは禁止すべきです。しかし、リモートからメンテ ナンスしたり、緊急用にログインできるようにしておきた 2 grub. conf を変更しても、 grub-install を再度実行する必要はありませ ん。 LILO では、 lilo. conf ファイルの変更後にⅢ 0 コマンドを実行す る必要がありました。そのときの記億力指に刻み込まれていると、ついつい GRUB も・・・・・・と手カ働きそうになりますが、 GRUB の言ファイルの 変更は OS の走閉塒に反映されます。 UNIX MAGAZINE 2004. 1

8. UNIX MAGAZINE 2004年1月号

このシステム変数の値を取得する際、変数カ在しない 場合はエラーメッセージが出力されるので、その出力を抑 えるために標準工ラー出力を / dev / nu Ⅱにリダイレクトし ています。 次に、最初の行で得られた dlv 変数の値が 0 かどうか を調べますが、たんに変数の値を取得するのではなく、モ ディファイアを付けて取得しています。 こで使っている、 $ { 変数名 : = 値 } という変数参照の形式は、変数に値が設定されていなけれ ば、 : = の後ろに指定された値を設定したうえで参照すると いうものです。つまり今回のコードの場合、 sysctl コマン ドにより値が得られていればその値になり、うまく値カ陬 得できなかったときは変数参照のなかで指定されている 0 になります。 このコマンド行では、 [ コマンドを使ってこの変数値が 0 であることを調べています。 [ コマンドは test コマンドと 同じもので、シェル・スクリプトのなかで使いやすいよう に、 [ で始まり ] で終るコマンドとして用意されていること は前回も紹介したとおりです。 この [ コマンドカ阯しく終了する ( 真を返す ) と、 & & の 後ろのコマンドが実行されます。この & & 条件演算子の制 御構造としての利用方法についても、以前に紹介しました。 このコマンド行を if 文を使って言当すると、 if [ ${d1v:=0} -eq 0 ] then exit 0 この後ろでは、いくつかの関数が定義されています。最 初に定義されているのは chkerr 関数です。 シェル・プログラムで関数を言古する場合、関数に対す る引数カ俐用できます。引数を利用するときでも、通常の f i となります。つまり、 dlv 変数が 0 の ( または設定されて いない ) 場合に、 exit コマンドを実行します。けっきよく この部分のコードは、 vfs. nfs. diskless-valid というシステ ムの変数の値が 0 の ( もしくは値が設定されていない ) 場 合には、このプログラムを終了することを未しています。 chkerr 関数 112 C 言語などでみられるように、関数宣言において仮引数を 宣言する必要はありません。何も宣言しなくても、シェル・ スクリプトに対する引数と同様に、 $ 1 や $ 2 といった変数 # RESUME /bin/sh echo " $ 2 failed: case $ 1 in chkerr ( ) { で参照することができます。 dropping int0 /bin/sh" chkerr 関数は、第 1 引数に指定された値が 0 であれば何 UN 工 X MAGAZINE 2004. 1 なサイズのメモリディスクを作成してマウントします。引 もので、引数として渡されたマウントボイントに対し、適切 関数です。この関数は mount-md 関数を使って動作する もう 1 つ定義されているのが、図 1 に小す create-md /sbin/mdmfs -i 4096 —s $ 1 —M md $ 2 mount -md ( ) { ントするマウントボイントを指定します。 する値で、第 2 引数では、作成したメモリディスクをマウ 渡す第 1 引数は、作成するメモリディスクのサイズを指定 クを作成してそれをマウントするためのものです。関数に 次に定義されている mount-md 関数は、メモリディス メモリ・ファイルシステム関連の関数 にエラーになったのかを示して、シェルを起動します。 が発生した場合は、どのようなコマンド行を実行したとき なかったことを確認するのがこの関数の役割です。ェラー す。つまり、あるコマンド行を実行し、それがエラーになら します。 $ ? は最後に実行したコマンドが返した値を示しま 1 行目と 2 行目の、、コマンド行 " には同じものを指定 chkerr $ ? " コマンド行 " コマンド行 この関数の使い方は次のようになります。 すメッセージも表示します。 のとき、第 2 引数を使って、シェルが起動された理由を示 もしませんが、 0 以外の場合にはシェルを起動します。

9. UNIX MAGAZINE 2004年1月号

お手軽メールシステ 図 30 不カ先をティレクトリ (mail) 、 メールポックス (mail/ read) の偵にたどる AP4 ディレクトリ ( ホームディレクトリ ) 移動先のメールホックスを選 - ・てくだき . 、 . デイしクトリを旧ノこ場合はそのデイし外リに移第ノて 他のメールボックスを退 R することになります . 移動をやめる場合は「動を中止する」を退んて実行をノてくたさい . 地のメ、一ルボックスを選すを : とになります。 デイしクトリを選択プこ場合はそのデイしクトリに移ノて 移動先のメ、一ルポックスを選ーノてくだき . 、 IMAP4 ディレクトリ mall/ ウープメ、ラー“ 0 ・ m “′げィレトリ : 図 31 メールは mail/read に不舞カ 移動をやめる場合ロ「移を中止する」を遺んて実行を押ノてくたさい . メールポックス mail/read こウメ、 - ラー第・ ウまをツツ ~ 倉第 3 第 - 第ツ烹新第 0 リ鼬上新他のメ : : 、ル 2 クス「区こ元返匳一赴レス帳個人設定国グアワ E 一度に表示するメールの数司実行ー 3 通のメっしがあります ( ト 3 通目を表示 ) Oat S : を 2 、物い。 r ・な rnv ル 0 / 11 / 16 ( 日 ) 14194 み ? ま繧をえ送「 。第警をヒ”・増 mp 地 .ip 第 0 / 1 リ 16 ( 日 ) 142325 を 959 ま信え返 . 「「 ウニくげ第 ~ ト 0 れ、 > 0 コ / い / 16 ( 日 ) 1516 酌 2 朝 2 新 : 返 ! き上 ; ま、 t¯ 図 32 INBOX はもぬけの殻 しプメ、ラ、・“ 0. 時 4 メールポックス INBOX ソスト新他のメールポックス メールはありません . に ! ールにアドレス報人設定「ログアウト 、一度に表示するメールの数「ヨ - 当世」 移動するメールにチェックを入れ、これらのメールを れるまでディレクトリの選択を繰り返します。ます、 mail/ 動するかと訊かれるので、目的のメールボックスが選択さ ディレクトリを選択すると、さらにそのなかからどこへ移 ィレクトリを越える指定は直接はおこなえません mail/read メールボックスへ移動させたいわけですが、デ 押すと、移動先を選択するメニューカ覲れます。ここでは 移動するコマンドを選択して ( 図 29 ) [ 実行 ] ボタンを UNIX MAGAZINE 2004. 1 [ ディレクトリ ] を選択して [ 実行 ] ボタンを押し、次に ルされます (rpm コマンドで調べると、 procmail ー 3.22 ー 9 procmail は、 Red Hat Linux 9 に標準でインストー 電話のメールアドレスへ中幻去するといったこともできます。 を自動的におこないます。また、家族からのメールは携 れた条件をテストし、それに応じて転送や破棄、保存など ルを調べて、メールのヘッダ、内容、サイズに対して設定さ こんなときにイリなのが procma ⅱです。受信したメー 悲しいことに SPAM メールもたくさんやってきます。 ルを見落としたりということが起こります。また、最近は ールを受け取るようになります。すると、友人からのメー 子に乗って購読を増やしていくと、毎日それなりの量のメ ルマガジンやメーリングリストの購読でしよう。ただ、調 家庭でインターネットに接続する楽しみの 1 つは、メー 第メールを自動的に分類する 残っていません ( 図 32 ) 。 が分かります ( 図 31 ) 。もちろん、 INBOX にはメールは したメールが表示され、メールがここへ移動していること クス mail/read の表示に切り替わります。さきほど選択 [ 実行 ] ボタンを押します ( 図 30 ) 。すると、メールボッ 表示されるメニューで read [ メールボックス ] を選んで ・破棄 ・ファイルへの保存 ・ほかのアドレスへの転送 です。 procmail でおこなえる処理は、大きく分けて次の 4 つ procmail を試してみる というバージョンでした ) 。 るかをみていきましよう ( 図 33 も合わせてこ覧ください ) 。 純な設定を紹介して、 procmail でどのようなことができ のファイルの書式はあとで説明します。まず、基本的で単 procmail の設疋は、 ~/. procmailrc に言当します。 せる機能です。 最後の 1 つは、外部のプログラムにメールを渡して処理さ 最初の 3 つについては、とくに説明は要らないでしよう。 ・ほかのプログラムへメールを渡す 153

10. UNIX MAGAZINE 2004年1月号

連載 / 旧ルーティング 図 6 zebra テーモンのおもなノード Te 旧 et ログイン VIEW ノード hostname> exit Ctrl- D enable Telnet ログアウト exit Ctrl- D ENABLE ノード hostname# exit Ctrl-D configure terminal end Ctr ト Z CON 日 G ノード hostname(config) # exit Ctr ト D ⅱ ne vty interface インターフェイス名 hostname(config-line) # INTERFACE ノード hostname(config-if)# は、 VIEW ノードにはないからです。各ノードで実行可能 コマンドは使えません。したがって、設疋の変更がどのよ なコマンドの一覧は、 list コマンドで確認できます。 うな影響を与え、ルータの状態がどうなったのかを確認す zebra デーモンの主要なノードは、図 6 のようになって るには、 ENABLE ノードに戻る必要があります。 います。楕円がノードで、その下に記してあるのが各ノー CONFIG ノードから ENABLE ノードに戻るには、 ドでのシェル・プロンプトです。矢印付きの線はノード間 CtrI-D を入力するか (ControI キーと D キーを同時に の移動を表し、線の横に移動のためのコマンドを記してあ 押す ) 、 exit コマンドを実行します。どのノードにも上位 ります。 ノードがあります。 exit は、上位ノードに移動する ( 戻る ) telnet で VTY にアクセスし、パスワード認証に成功 ためのコマンドです。また、 Ctrl-Z か end コマンドを実 すると、はじめは VIEW ノードにいることになります。 行すると、どこにいても ENABLE ノードに戻ることがで UNIX でいえば、一殳ユーザーでログインした場合に似て きます。 います。ある程度の情報の確認はできますが、設疋ファイ このように、目的に応じたノードへの移動をユーザーに ルの表示や設定の変更はできません。特権ユーザーになる 課すことにより、キーの打ち間違いや、意図しない設定変更 には、 enable コマンドを実行します。 enable 用のパス による事故が起こりにくくなっています。言い換えれば、 ワードが設疋されていれば、この場合もパスワードの入力 ノードの移動によって、ユーザーの操作を暗黙のうちに確 を求められます。パスワード認証に成功すると ENABLE 認している、ともいえます。 ノードに移動することができ、言定ファイルの確認を含む、 ノードは、図 6 に示したものだけではありません。各ル すべての情報が表示できます。しかし、 こではまだ設疋 ーティング・デーモンは、 VIEW 、 ENABLE 、 CONFIG 、 INTERFACE 、 VTY の各ノードのほかに、各プロトコ の変更はできません。 configure terminal コマンドを 実行して ENABLE ノードから CONFIG ノードに移動 ルに固有の設疋をおこなうためのノードを 1 つ以上用意し ています。たとえば bgpd であれば、 CONFIG ノードの する必要があります。 CONFIG ノードには、設定を変更 するためのさまざまなコマンドが用意されています。 下に BGP ノードがあり、さらにその下にいくつかのノー CONFIG ノードでは、設疋ファイルの表示以外の show ドがあります。 136 UNIX MAGAZINE 2004. 1