Rim+C+CGI?

 このページでは「リムネットでC言語で書かれたCGIをどのようにして作るのか」ということを解説したいと思います。これを知ってないとどつぼにはまるかも。ってゆーかはまりました(泣)。

まずは「パーミッション」から
 Telnetで入ってからディレクトリを移動するときにぜひともしておいて欲しいのがパーミッションの確認です。
 「パーミッション」とは「許可」という意味で、ひとつひとつのファイルやディレクトリに持たせることができます。このパーミッションの設定を変えることで「このファイルは自分は見ることができるけど他の人には見せないようにする」といったことができるようになります。

 UNIXはたいがい、ネットワークを使用して多人数が同時に使うことを想定しています。インターネットはまさにそうですね。そういうばあい、他の人からプライバシーを護るための「間仕切り」や「鍵」が必要になるわけです。これがパーミッションだと考えてください。

 さて、そのパーミッションをどうやったら見られるのかというと、前回説明したls -lのコマンドで見ることができます。ファイル名の隣とかに-rw- r-- r--とかdrwx r-x r-xとか書かれていません? これがパーミッションを示しています。これはFTPでも見ることができると思います(ちなみに一番左のdは「ディレクトリ」を意味していて、パーミッションとは関係ありません)。

 この部分の意味を説明しましょう。
 まず細かくrwxの説明から。r読み込み可能(Readable)で、そのファイルの中身を表示することができるという意味です。w書き込み可能(Writable)で、そのファイルの中身を書き換えて保存することができるという意味です。最後にx実行可能(eXecutable)で、要するに「コマンド」や「アプリケーション」だということです。
 さらに、大きく左から自分自身(User)、グループ(Group)、他人(Other)を意味します。例えばrw- r-- r--なら自分自身はファイルを読むことも書き込むこともできるけれども、グループと他人は読むことだけという意味です。ホームページのファイルなんかはこれに当たります。rwx r-x r-xはそれに実行機能が付いたものです。ただし、そういうファイルのあるディレクトリにもこの属性が付きます
 ちなみに「グループ」は無視して、「他人」と同じ設定にしてください

 さて見方が分かったら、なにを注意すればいいのかです。
 ディレクトリを移動するときに見て欲しいのが、ディレクトリのパーミッションです。public_htmlからCGIを置くディレクトリまでのパーミッションがdrwx r-x r-xになっているか確認してください。これがなっていればOKです。たぶんなってると思います。
 なっていなかったら変更する必要があります。それにはchmodというコマンドを使います。

 具体的にはchmod go+rx public_htmlの様な形で使います。一番右がフォルダ名だということは分かると思います。真ん中のgo+rxは、パーミッションを指定しています。
 goというのは「グループ」と「他人」という意味で、要するに「誰のパーミッションを変更するか」ということを指定しています。だからuにすれば自分自身に、uoにすれば自分自身と他人になります。
 +「許可状態にする」という意味です。逆に-にすると「不許可状態にする」という意味になります。
 ここまで来れば分かっちゃうと思いますが、rxというのは「読み込みと実行」という意味で、要するに「どの機能を変更するか」ということを意味しています。だからwなら書き込み、rwなら読み込みと書き込みという意味になるわけです。
 というわけでgo+rxは、「グループと他人の読み込みと実行を許可する」パーミッションにするというわけです。これは「相対的」なものなので、例えばrw- r-- r--のパーミッションだったらrw- r-x r-xと、指定されていない部分はちゃんと残ります。だからこれならgo+xだけでいいというわけですね。

 この機能はあとで必ず必要になってきます。そのときにまた読み返してください。

「.htaccess」を置こう!
 さて、CGIの話に戻ります。
 CGIはサーバーで実行されるものです。では、例えばrwx r-x r-xのパーミッションを持ったファイルtest.cgiなるものがあった場合、そのファイルをブラウザで読み込んだらどうなるのでしょうか。
 結論は、そのまま読み込まれます。「そのまま」というのは要するにファイルの16進データそのものが入ってくるということです。
 たとえこのファイルをCGIとして作っても、そんなことサーバーは「知ったことじゃないと」そのままファイルとして渡してしまいます。レストランでカレーを頼んだらレトルトパックそのものが渡されるようなものです。こちらとしては、それを暖めてごはんに掛けてもらいたい、要するにサーバーに実行してもらいたいのです。

 そのためのファイルが.htaccessです。最初にピリオドがある点に注目。こういったファイルをUNIXではドットファイルと呼び、各種設定が入っていると見なされます。ウィンドウズで言うiniファイルと同じ、レジストリの代わりみたいなものです。
 このファイルはズバリサーバーにファイルのタイプを教えるものです。これがあれば、CGIをちゃんと実行してくれるわけです。ではこのファイルを作ってみましょう。

 まずタダのテキストファイルを用意してください。ファイル名は_.htaccessとでもしておきましょうか、ウィンドウズでは拡張子の前にファイル名がないと怒られますから。この中には次のように書き込んでください。

AddType    application/x-httpd-cgi    .cgi
	

 たったこれだけでOK。このファイルをpublic_htmlディレクトリに送ってください。これで、CGIを実行ファイルとして見なしてくれます。
 注意して欲しいのは、これからファイルを送るときにはテキスト形式(アスキーモード)を使って欲しいということです。そうしないと、UNIXが正しく理解できないことがあります。各種FTPはこの形式で送ることができるはずです。

 ちなみに実は、この設定はサーバーによっては必要ない場合もあります。サーバーの元々の設定で、「拡張子がcgiなら実行すること」としてある場合もあるということです。
 リムネットは.htaccessが必要なので、この説明を書いてみました。あと、この講座では紹介しない予定ですが、SSIと呼ばれる物は多くのサーバーで必要のようです。

CGIをコンパイル!!
 さて、ここまでで準備は完了です。では実際にCGIを作ってみましょう。
 まず適当なフォルダを作り(ここではcgi-binとします)そこに次のコードが入ったファイルtest.cを送ってください。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main()
{
	printf( "Content-type: text/html\n\n" );
	
	printf( "<HTML>\n" );
	printf( "<TITLE> It's Test!! </TITLE>\n" );
	printf( "<BODY>\n" );
	printf( "This is test\n" );
	printf( "</BODY>\n" );
	printf( "</HTML>\n" );
}
	

 これをテキストモードで送信してください。
 次にTelnetで入り、このファイルのあるディレクトリに移動します。そうしたらcc test.c -o test.cgiと入れてください。
 ccとは、UNIX標準のCコンパイラを実行するコマンドです。左から2番目はソースコードのファイル名です。3番目の-oを付けることで、コンパイル後の実行ファイルが4番目で指定したファイル名になります。一番右は必要な機能を全部詰め込んでくださいという意味で、これを付けないとホームページで読むときにうまくいかないみたいです。

 エラーが出なかったらtest.cgiというファイルができるはずです。エラーが出たら……困っちゃいますね。とりあえず、本当に上の通りにしてください(コード中に日本語を入れないように!!)。
 また、失敗したときなどにたまにcoreというファイルが作られる時があります。このファイルはむちゃくちゃ大きいので、発見できしだい削除してください

 完成したらチェックしてみましょう。./test.cgiと入れてみてください。./というのは「今いるフォルダ」という意味で、これを付けないと実行されません。
 うまくいけば次のように表示されるはずです。

	
Content-type: text/html
	
<HTML>
<TITLE>It's Test!!</TITLE>
<BODY>
This is test
</BODY>
</HTML>

	

 確認したら、実際にホームページとして読み込んでみましょう。URLで直接test.cgiを指定すればOK。This is testと表示されるでしょう(もし表示されず、usr/bin/ld errorみたいに表示されたら、コンパイル時に -Bstaticというオプションを加えてcc test.c -o test.cgi -Bstaticとしてみてください)。
 これで、CGIの完成です!!

エチケットもちょっとだけ
 喜んでいるところ悪いんですが、一応後始末とかしておきましょう。何をするのかというと、ソースコード(ここではtest.c)を削除してください。コードを読まれると「そのCGIがどういうアーキテクチャーで動いているのか」分かってしまいます。
 また、このフォルダにindex.htmlを入れて置いてください。中身は空でいいです。たいがいのサーバーは、ディレクトリを指定されたときにindex.htmlを返すようにしています。が、このファイルがないとディレクトリの中身を表示してしまいます
 たまたまコードを消し忘れて、しかもこのファイルを置いてないんじゃ最悪です。それに、あなただけが使うべきCGIを勝手に使われる可能性もあります。そういうことを未然に防ぐためにも、これらは必要でしょう。

 ま、これは「知らない人」向けの対策だから、ある程度知ってる人には意味のないことでしょう。でも、何か起きちゃったときの理論武装のネタくらいにはなりますから。

意外と簡単?
 実際、結構簡単だと思います。C言語が使えるのなら、これからばりばりプログラミングできると思います。
 ただ、いくつか注意しなければならない点もあるので、その辺はまた今度。

(C)KAB-studio 1998 ALL RIGHTS RESERVED.