Perl Script Laboratory

UNIXの基礎の基礎

当サイトのコンテンツをhtmlソースごとそのままコピーして自分のサイトのコンテンツにしてしまう人がいます。そのような行為は当サイトの著作権を侵害する行為ですので絶対にしないでください。発見し次第断固とした措置を取ります。

インターネット人口が爆発的に増えた結果、圧倒的な割合でWebサーバに使われているOSである、UNIXが注目されてきました。Webはその性質上、入出力をすべてテキストで行なうため、テキストベースのUNIXはうってつけでした。Windows/Macからコンピュータの世界に入った人にとっては、 CUIの世界ははじめは取っつきにくいでしょうが、CGIやSSIを使おうとするなら、UNIXの知識が不可欠になります。

UNIXは1969年、米国のAT&Tのベル研究所というところで誕生しました。本家のSystem X(バージョンをローマ数字で表記)の他にBSD(Berkeley Software Distribution)やSun Micro-systems社のSunOSなどさまざまな互換バージョンともいうべきものがあります。
近年はPC-UNIXといわれる、LinuxやFreeBSDが爆発的に普及していて、今後さらにUNIXの世界を席巻しそうです。

PC-DOSとMS-DOSが違うように、これらのUNIXもいろいろな点で違いがありますが、UNIXはUNIXということで、ここではその違いがどうということはなく、共通部分のみに絞って、CGIやSSIを構築する上で必要な基礎の基礎だけをお話しします。

あさだくんのUNIX入門

UNIXの基本操作

ログイン(telnet接続)

UNIX系のOSマシンを使うためにはじめに行う作業です。UNIXは複数ユーザーによって使われることを前提に作られたOSですので、MS-DOSなどのようにパソコンをたち上げたらすぐにプロンプトが出てくるというわけにはいきません。Windows95やNTでは複数ユーザーによって使われることがあるため、デスクトップが現れる前にログインのウインドウが出てきます(出なくすることもできます)。

しかし、私たちはUNIXのパソコン(端末)の前にすわって作業しているわけではありません。そこで、telnet(テルネット)やsshを使って、電話回線やインターネット専用線を通じて自分のパソコンからサーバコンピュータにリモートログインするのです。Windowsなどでは、telnet専用のフリーウエアがあります。また、TeraTermPro(テラタームプロ)などの高機能なフリーウエアもあります。そのソフトをたち上げて現れたウインドウが、UNIXコンピュータの一つの端末かのように機能します。

Telnetではまず、どのサーバに接続するのかを指定しなければなりません。TeraTerm Proの場合ですと、ソフトをたち上げると接続先のホスト名を入力するボックスが現れます。

ログインではユーザー名とパスワードが必要です。これを入力してEnterキーを押せば、下記の例のようにプロンプト(www/akira67/~:)が現れます。なお、プロンプトの表示は、システムによって違うので注意してください(実際には、プロンプトというのは自分の設定ファイルを書き換えることによっていくらでも書き換えられます)。

UNIX(r) System V Release 4.0 (cosmo.jah.ne.jp)

login: akira67
Password: ********←実際には表示(エコーバック)されない
Last login: Thu Dec 31 22:42:10 from linz.pslab.gr.jp
Sun Microsystems Inc.   SunOS 5.5.1     Generic May 1996
You have mail. ←メールが来ているときに表示される
akira67/~:←これがプロンプト

▲TOP


ホームディレクトリ

特に設定をしていない限り、ログインした直後のカレントディレクトリ(今いるディレクトリ、という意味)は、自分のホームディレクトリです。ホームディレクトリとは、UNIXに複数のユーザーが登録されている場合、各ユーザーが自由に使えるディスク領域のうち一番上位のディレクトリのことです。ホームディレクトリはUNIXの管理者によって作成されます。ファイルの読み書き、削除などは基本的にホームディレクトリの中でしかできません。自分が今どのディレクトリにいるかを調べるにはpwdコマンドを使います。使い方は、pwdをタイプした後にENTERキーを押します。

akira67/~:pwd
/home/akira67 ←カレントディレクトリを表示
akira67/~:←プロンプト

▲TOP


ドキュメントルート

サーバ内の自分のユーザー領域の中で、Webに公開できる一番上のディレクトリのことをドキュメントルートといいます。URLで表すと、http://www.foo.ne.jp/~bar/ となる場合に、これに対応するディレクトリのことです。通常はホームディレクトリの直下に public_html または htdocs というディレクトリがあって(自分で作成する場合もある)、そのディレクトリです。例えば、http://www.psl.ne.jp/index.html で呼び出されるファイルは、/home/iwanami/public_html/index.html です。

このようなしくみになっていることにより、ブラウザからは /home/iwanami にあるファイルは見られないということになり(public_html以下のファイルしか見られない)、ユーザーだけのプライベートなディスク領域を持てることになります。

▲TOP


ログアウト

システムの使用を終了するときにはログアウトの操作を行います。ただし、telnetの場合はソフトを終了させようとすると「disconnect?」などと聞いてきますからYESを選択すれば結果的にはログアウトと同じになります。正式なログアウトの方法は、コマンドプロンプトから「logoutまたはexit」と入力すればいいのです。「CTRL+d」でもログアウトできるシェルもあります。

▲TOP


シェルの種類

シェルとは、MS-DOSでいうcommand.comのことで、コマンドインタプリタといい、コンソール(入出力装置)を持って、コマンドを入力して、結果を出力する機能を提供するものです。シェル自体もUNIXのプログラムです。Windowsなどでtelnetを使いログインする場合は、出力装置はディスプレイの中に表示されているTeraTermなどのtelnetソフトのウインドウということになります。入力装置はキーボードです。
MS-DOSの場合はcommand.comの1つしかなかったシェルですが、UNIXのシェルにはいろいろな種類があります。UNIXのシステムではユーザーごとにどのシェルを使うかを指定することもできますし、シェルの中で違うシェルを実行させることもできます。シェルの種類によって使用するコマンドに微妙な違いがあるので、自分がどのシェルを使っているかを知っておくのはとても有効です。
自分がどのシェルを使っているかは、シェル変数 shell に使っているシェルのフルパスが格納されています。echo コマンドで見てみましょう。

akira67/~:echo $shell
/usr/local/bin/tcsh
akira67/~:←プロンプト

この例の場合、tcshというcsh系のシェルを使用しています。なお、Linuxでは bash というシェルが広く使われています。

▲TOP


コマンド入力の法則

1.すべて小文字で

MS-DOSなどと違い、UNIXでは大文字と小文字は区別されます。たいていのコマンドは小文字ですので、小文字で入力する習慣をつけましょう。

2.引数(ひきすう)の入力方法

  • コマンド名と引数の間には1つ以上の空白文字を入れる。
  • 引数と引数の間には1つ以上の空白文字を入れる。
(例) ls -al ※「ls」「-al」の間に半角スペース1つを入れた例。

3.オプション指定の方法

  • はじめに「-(ハイフン)」を入れる。
  • 複数のオプションを指定するときは、例えば上の例で、「-a」オプションと「-l」オプションを同時に指定するときは、「-al」のようにまとめて指定する。

4.標準入力からの入力の方法

コマンドの中には標準入力(キーボード)からの入力を促すコマンドがあります。入力が終わったら行頭で CTRL+D(Ctrlキーを押しながらDを押す) で終了してください。

▲TOP


オンライン・マニュアル

UNIXではオンラインマニュアルが提供されています。このページではよく使うコマンドだけは説明していますが、手っ取り早いのはシェル上でオンラインマニュアルを見てしまうということです。どんな引数が必要か、どんなオプションがあるかなど、英語で書かれてはいますがすべて分かります。

オンラインマニュアルを見るためのコマンドは、

man

または

man コマンド名

です。

オンラインコマンドは次のようなセクションに分かれています。

セクション1…コマンド
セクション2…システムコール
セクション3…関数
セクション4…周辺機器
セクション5…ファイル形式
セクション6…ゲーム
セクション7…その他
セクション8…管理用コマンド

コマンドの表記方法で、man(1)とか、cal(1)とか書かれている場合があります。この場合のかっこの中の数字は、上記のセクション番号のことです。CGIプログラムを書くときにシェルコマンドをそのまま処理の一部に使うなどということは頻繁にありますので、PerlやCの解説の中にもこういう表記方法が出てくるかもしれませんが、その時は思い出してください。

▲TOP


ファイル

ファイル名の法則

MS-DOSやWindowsとは少し違うUNIXのファイルについて説明します。

1.ファイル名は自由に付けてよい

ファイル名に使える文字は、アルファベットの大文字、小文字、数字、記号、空白文字も使えます。ただし、空白文字はブラウザがうまく認識してくれないことがありますので注意してください。また、全角文字(日本語)をディレクトリ名またはファイル名に使っている人がまれにいますが、避けた方が無難です。 ただし、STDINやデバイス名など、ファイルとして扱われる一部の予約語は使うことができません。

2.ファイル名の長さは通常255文字まで

長い名前が使えるというのは便利ですが、長すぎると指定するのがいちいち面倒ですし、入力ミスなども起こるので、適度な長さにしましょう。

3.大文字と小文字は区別される

例えば、 sampleSampleSAMPLE では、すべて違うファイルとして認識されます。

4.サフィックス(拡張子)

ファイル名の一番最後の「.」以降の部分をサフィックス(suffixes…拡張子という呼びが分かりやすいかもしれません)といいます。ファイルの内容によってはこの部分に決められた文字を使わなければならないことがあります。

例えば、HTML文書は「.html」、Cソースファイルは「.c」、FORTRANのソースファイルは「.f」などです。しかしそれ以前の部分については自由で、こんなファイル名も可能です。

abc.def.g.html
a.b.c
a.b.c.d.e.f

▲TOP


ディレクトリ

ディレクトリとは、Windows95/98ではフォルダといい、ファイルを格納する大きな袋のようなものです。UNIXでは、ディレクトリはファイル名と、そのファイルについているiノード番号の情報を格納した一種の「ファイル」です。

lsコマンドで自分のディレクトリを見てみましょう。なお、自分が今いるディレクトリはpwdコマンドでフルパス表示されます。

cdコマンドはカレントディレクトリを変更するときに使います。引数なしで使うと、自分のホームディレクトリへ移動します。

akira67/~:pwd
/home/akira67
akira67/~:cd public_html/
akira67/~/public_html:pwd
/home/akira67/public_html ←フルパス表示
akira67/~/public_html:ls -aF
./ ←このディレクトリ自身
../←1つ上のディレクトリ
_gr15.jpg
_gr16.jpg ←このディレクトリにあるファイル
_gr18.gif
cgi-bin/ ←このディレクトリの下にあるディレクトリ
akira67/~/public_html:cd
akira67/~:pwd
/home/akira67
akira67/~:

▲TOP


絶対パスと相対パス

1.絶対パス

絶対パスとは、ルートディレクトリ「/」から任意のファイルまでをすべて表記したものです。例えば、sample.htmlが自分のホームディレクトリの下のpublic_htmlの下のakiraの下のbinにあるとすると、絶対パス表記では

/home/akira67/public_html/akira/bin/sample.html

となります。

このパス表記を分解してみましょう。

/ home/ akira67/ public_html/ akira/ bin/ sample.html

はじめにルートディレクトリを示す「/」、
次に「home」というディレクトリ「home/」、
次に「akira67」というディレクトリ「akira67/」…、
といって、「bin」というディレクトリ「bin/」の中に
sample.htmlがあるという意味です。

2.相対パス

いつも絶対パス表記をしていると、階層の深いファイルなど、ファイル名よりもはるかにフルパス名が長くてやってられません。そこで、通常は相対パスというものを使います。自分のホームページの中のリンクなどはこちらが便利です。

  • 同じディレクトリのファイルを指定する

    この場合はパスをいっさい省略できます。

    ex)) sample.html
  • 下のディレクトリのファイルを指定する

    この場合、今いるディレクトリからのパス名を指定します。例えばカレントディレクトリが

    /home/user/public_html/

    として、絶対パスで

    /home/user/public_html/akira/bin/sample.html

    のファイルを相対パスで表記すると、

    akira/bin/sample.html

    となります。

  • 上のディレクトリのファイルを指定する

    この場合、今いるディレクトリからのパス名を指定します。例えばカレントディレクトリが

    /home/user/public_html/

    として、絶対パスで

    /home/user/public_html/akira/bin/sample.html

    のファイルを相対パスで表記すると、

    akira/bin/sample.html

    となります。

  • 真上でも真下でもない場合

    今までの表記方法を組み合わせて表記します。例えば、カレントディレクトリが

    /home/user/public_html/akira/bin/

    として、

    /home/user/public_html/akira2/bin2/sample.html

    を表す場合、ディレクトリをたどっていくと、カレントディレクトリから出発して、1つ上がakira/、もう1つ上がpublic_html/、その下のakira2/、その下のbin2/ですから、

    ../../fukazawa/bin2/sample.html

    となります。

▲TOP


iノード(i-node, index-node)

UNIXのファイルシステムは、

1. ブート領域
2. スーパーブロック
3. iノードリスト領域
4. ファイル領域

に分類することができます。 そして、ファイルは、ファイルに関する情報を集めた「iノード」とiノードによって排他的に指定される「ファイルそのもの」によって構成されます。 ●「iノード」が持っているファイル情報

  • パーミッション情報(保護ビットともいう)
  • ファイルタイプ
  • ファイルサイズ
  • アクセス時刻
  • 修正時刻
  • 更新時刻
  • ファイルポインタテーブル(ファイルそのものがある場所を指す)

ディレクトリ(これもファイルの一種です)には、そのディレクトリに含まれるファイルの名前と、そのファイルに対応する iノード番号の情報が入っています。ファイルを参照するときには、UNIXシステムはiノード番号によってファイルの実体の位置を知って、アクセスするのです。普通のファイル、ディレクトリファイル、デバイスファイルはすべてiノード番号によって管理されています。

ls コマンドに -i オプションをつけることでiノード番号を表示させることができます。

1159774 ./
  61534 ../
 195934 bin/
1159777 books.shtml
1159801 books2.shtml
1159796 bgm.html
…

見やすいように、揃えてしまいましたが、実際の表示はちょっとずれています。はじめの3行はディレクトリですね。ディレクトリもファイルなので対応するiノード番号が決まっています。

▲TOP


ハードリンクとシンボリックリンク

いきなりこの話をしても難しいので、まずは簡単に表にしてみます。

ハードリンク シンボリックリンク
一言でいうと 別の「本名」 別名(エイリアス)
制約 同じファイルシステム内
でしか作成できない
特に制約がない
iノード番号 同じものを共有する 別である
主な例 .(カレントディレクトリ)
..(一つ上のディレクトリ
/usr/bin/local/perl
ロックファイル

1.ハードリンク

ハードリンクは、本名が複数あるようなもので、ファイル実体としては1つのものを指します。したがって、iノード番号も同じです。ハードリンクは

ln oldfile newfile

で作成できます。
以下に、いくつかの例を挙げておきます。

akira67/~/public_html:cd dir ※1
akira67/~/public_html/dir:ls -aiF ※2
1612863 ./
1159774 ../
akira67/~/public_html/dir:touch newfile.txt ※3
akira67/~/public_html/dir:ls ※4
newfile.txt
akira67/~/public_html/dir:ln newfile.txt newfile2.txt ※5
akira67/~/public_html/dir:ls -aiF ※6
1612863 ./
1159774 ../
1612864 newfile.txt
1612864 newfile2.txt
akira67/~/public_html/dir:

解説:
はじめに、新規で作った「dir」という名前のディレクトリに移動します(※1)。
そのディレクトリに入っているファイルの一覧をlsコマンドで表示させます(※2)。
この時点ではシステムによって自動的にコピーされた「.(このディレクトリそのもの)」「..(一つ上のディレクトリ)」のみがあります。 次に、touch コマンドで newfile.txt というファイルを作成します(※3)。
lsコマンドで見てみましょう(※4)。-aオプションをつけていないので、先ほどの2つのディレクトリファイルは見えません。
次に、今作った newfile.txt に newfile2.txt という名前のハードリンクを作成します(※5)。するとどうでしょうか。新しく newfile2.txt というファイルができましたね。2つのファイルのiノード番号を見てください。同じになっています。この2つのファイルは名前が違うだけで、どちらも同じファイルの実体を示しています。
なお、ハードリンクを削除するためには、1つずつのファイル名を削除します。最後のファイル名を削除した時点でファイルの実体も削除されます(ファイルそのものを削除するコマンドはないのです)。

ハードリンクは、ユーザーがディレクトリに対して作成することができません。なぜかというと、ディレクトリのツリー構造が維持できなくなってしまうからです。ディレクトリのml/」と「public_html/にある./」と「dir/にある../」、「public_html /にあるdir/」と「dir/にある./」はそれぞれ1つのディレクトリを指しているハードリンクとなっています。iノード番号が同じであることを皆さんの環境で確認してみてください。

ハードリンクというのは、もともとディレクトリ用にできたシステムらしく、一般にはあまり使われていません。

2.シンボリックリンク

もっぱら使われるのがこのシンボリックリンクで、例えば、私たちが何気なく使っているシェル上のコマンド(/usr/local/binに入っている)は、たいていがシンボリックリンクファイルです。また、Perlスクリプトの1行目に必ず書く #!/usr/local/bin/perl というこの「perl」も、「perl5.00302」というファイルのシンボリックリンクなのです(これはJAHの場合)。 シンボリックリンクは

ln -s oldfile newfile

で作成できます。
以下に例を挙げておきます。

akira67/~/public_html/dir:ln -s original.file symbolic.link
akira67/~/public_html/dir:ls -ai
1612863 ./
1159774 ../
1612864 hardlink.file1
1612864 original.file
1612865 symbolic.link@
-----------------------------------------------------------
akira67//usr/local/bin:ls -ail perl
114010 lrwxrwxrwx   1 root other 11 Mar 18 12:00 perl ->
perl5.00302*
akira67//usr/local/bin:

シンボリックリンクファイルは、通常のlsでは「@」がついています。「-F」オプションをつけて表示させると、元のファイル名を「->」で示してくれます。
シンボリックリンクはハードリンクと違って、別のファイル実体を持ちます。わかりやすくいえば、Windows95のショートカット、Macintosh のエイリアスのようなものです。シンボリックリンクファイルにはそのリンクが指し示す元のファイル「名」が文字列として格納されているだけのファイルです。
だから、シンボリックリンクを削除してしまっても元のファイルは消えませんし、元のファイルを消してしまっても、シンボリックリンクファイルは消えません(ただしこの場合は元ファイルがなくなってしまっているのでアクセスできません)。

▲TOP


リダイレクションとパイプ

標準入力と標準出力

UNIXコマンドは、通常以下のような流れで実行されます。

文字などの入力プログラム本体(実行)実行結果の出力

このとき、「文字などの入力」にあたる部分を標準入力といい、「実行結果の出力」にあたる部分を標準入力といいます。標準入力は通常キーボードから入力されますが、後述のリダイレクトによって、ファイルの中身を入力のかわりにすることもできます。また、標準出力は通常端末(ディスプレイ)に出力されますが、後述のリダイレクトによって、ファイルに結果を書き出すこともできます。また、パイプを使うことによって、複数のコマンドのうち、一方コマンドの出力を他方のコマンドの入力として使うことができます。

これらの技法を使いこなせるようになると、UNIXの奥の深さを知ることができるだけでなく、とても便利です。

▲TOP


入力リダイレクション

入力リダイレクションとは、本来ならキーボードから入力する標準入力を、ファイルから入力させることです。もっとも、ほとんどのコマンドには、ファイルから入力させるために引数を取るので、あまり使われません。

catコマンドは、引数にとった1つまたは複数のファイルの中身を表示させるためのプログラムです。

cat file.txt

とすれば、file.txtの中身が表示されます。これを入力リダイレクションを使って、

cat < file.txt

と表すことできます。
このように、入力リダイレクションを使うようなケースでは、たいていそのコマンドの引数にファイル名を取ればいいような場合がほとんどであるために、あまり使われないということです。

▲TOP


出力リダイレクション

出力リダイレクションとは、あるコマンドが本来なら端末(ディスプレイ)に出力する標準出力を、ファイルに対して出力する(書き出す)ようにすることです。

test.c という C のソースファイルがあります。このファイルを cat で表示させるかわりに、test2.c という名前のファイルに書き出す操作をします。この操作は、

cat test.c > test2.c

と表すことができます。test2.c というファイルが存在しないときには新しく作られます。すでに存在しているときには上書きされます。

この操作は、cp test.c test2.c と全く同じふるまいをします。

akira67/~/public_html/cgi-bin:cat test.c
#include 
main () {
printf("Hello, World!\n");
}
akira67/~/public_html/cgi-bin:cat test.c > test2.c
akira67/~/public_html/cgi-bin:cat test2.c
#include 
main () {
printf("Hello, World!\n");
}
akira67/~/public_html/cgi-bin:

出力リダイレクションをするときに、 > のかわりに >> を使うことによって、すでにあるファイルの末尾に新たな出力を追加していくことができます。

test.c という C のソースファイルがあります。このファイルを cat で表示させるかわりに、test2.c という名前のファイルに追加モードで書き出す操作を2度繰り返します。この操作は、

cat test.c >> test2.c

と表すことができます。test2.c というファイルが存在しないときには新しく作られます。すでに存在しているときにはファイルの末尾に新たな出力が追加されます。

akira67/~/public_html/cgi-bin:cat test.c
#include 
main () {
printf("Hello, World!\n");
}
akira67/~/public_html/cgi-bin:cat test.c >> test2.c
akira67/~/public_html/cgi-bin:cat test.c >> test2.c
akira67/~/public_html/cgi-bin:cat test2.c
#include 
main () {
printf("Hello, World!\n");
}
#include 
main () {
printf("Hello, World!\n");
}
akira67/~/public_html/cgi-bin:

▲TOP


パイプ

標準出力(ディスプレイ端末)に出力するコマンドと、標準入力(キーボード)から入力を要求するコマンドを1つにつなげることができます。このつなぎのことをパイプといいます。

cat file.txt | sort

上記の例では、cat コマンドで file.txt の中身を端末に表示させるかわりに、sort コマンドの入力としてつないでいます。sort コマンドの結果は端末に表示されます。つまり、この一連の操作は、「file.txt の内容を行単位にASCIIコード順に並べ換えて端末に表示」します。

head file.txt -n 50 | tail -n 10

上記の例では、file.txt の41行目から50行目までを端末に表示します(head コマンドは、引数に指定したファイルの中身の、1行目から n オプションで指定した行数までを表示します。また、tail コマンドは、同様に、最後の行から数えて1行目から n オプションで指定した行数までを表示します)。

gzip -dc file.tar.gz | tar xvf -

これは、tar.gz なファイルを解凍・展開するための常套手段です。gzip コマンドで解凍したファイル書庫(tar ファイル)を、tar コマンドに渡して展開しています。

これらは一例に過ぎません。パイプはいくつつないでも構いません。

▲TOP


パーミッション

UNIXでは、複数ユーザーのOSであるために、ファイルまたはディレクトリごとに、所有者およびグループが設定されるようになっていて、ファイルまたはディレクトリに対する実行/読み込み/書き出しについての許可/不許可を設定することができます。これをパーミッションといいます。

akira67/~/public_html:ls -lg
total 1282
drwxr-xr-x  11 akira67  users       4608 Dec 14 22:52 ./
drwxr-xr-x   4 akira67  users        512 Oct 27 18:09 ../
-rw-r--r--   1 akira67  users         76 Mar 12  1998 _enter.gif
drwx---rwx   3 akira67  users        512 Dec 10 21:30 auto_kuji/
-rw-r--r--   1 akira67  users        789 Nov 19  1997 auto_pass.html
drwx---rwx   2 akira67  users       1024 Dec  7 00:58 bbpro/
-rwx---r-x   1 akira67  users       7497 Jan 13  1998 bcount.cgi*
-rw-r--r--   1 akira67  users        172 Jan 13  1998 bcount02.html
-rw-rw-r--   1 akira67  users         30 Dec 26 11:56 bgm.html
-rw-r--r--   1 akira67  users        321 Dec 18 13:08 bgm1.html
akira67/~/public_html:

このリストの「drwx---rwx」とか、「-rw-rw-r--」とかいう記号が、パーミッションの情報です。

所有者 グループ その他

まず、1文字目の d は、ディレクトリを示します。通常のファイルの場合は - となっています。

2文字目からの9つの文字群は、それぞれ3つずつ3つのブロックに分かれています。

最初のブロックの r w x は、所有者(akira67)に対する 読み取り許可、書き込み許可、実行許可です。r w x の文字が表示されていれば許可、- になっていれば不許可です。上記の例ではすべて許可です。

次のブロックの r w x は、所有者が属するグループ(users)に対する 読み取り許可、書き込み許可、実行許可です。上記の例ではすべて許可です。

最後のブロックの r w x は、所有者(akira67)でもなく、所有者が属するグループ(users)にも含まれないその他のユーザーに対する 読み取り許可、書き込み許可、実行許可です。
上記の例では書き込みが許可されていません。

▲TOP


「読み取り」「書き込み」「実行」の意味

通常ファイル ディレクトリ
読み取り 指定したファイルの内容を表示する 指定したディレクトリのリストを表示する
書き込み ファイルの上書き、削除 ディレクトリの中にファイルを作ったり削除したりする
実行 実行ファイルの実行(プログラム、CGIなど) ディレクトリ内のファイルにアクセスする

▲TOP


2つめのブロックの「グループ」とは

プロバイダに加入しているたいていのユーザーは、グループというのは意識しなくても特に問題がないのですが、UNIXのシステムとして覚えておいてください。

UNIXでは、上記のとおり、「所有者」、「グループ」、「その他のユーザー」という3つの分類をします。で、この「グループ」ですが、UNIXのシステムで新たにユーザーを登録する場合、まずその人のID(この場合akira67)を決めます。それと同時に、このユーザーがどのグループに属するかということも決めます。この操作を行うのはスーパーユーザー(システムの管理者)です。プロバイダの場合、自分のグループだけに見せるページという考えがあまり意味がありません(自分以外はみんな他人ですから)が、学校や会社などでは、部や課の単位でグループを設定すれば、これは部内情報だから部の内部だけ見ることができるなどという設定が意味を持つわけです。

▲TOP


rw-rw-r--を数字で表す方法

rw-rw-r--という方法だと口でいうのも大変です。そこで、通常3ケタの数字(8進数)で表します。

  • 1.9つの文字を「1」または「0」で表す(2進数)

    rw-rw-r--の場合、110110100 となります。

  • 2.3つのブロックごとに1ケタずつ、合計3ケタに直す(8進数)

    110110100 110 110 100 に分け、それぞれ 6 6 4 となります。

簡単な方法としては、各ブロックごとに、r は 4、w は 2、x は 1 として、ビットが立っている部分だけを足す方法があります(上記と同じことなのですが)。

rw- → (r=4) + (w=2) → 6
rw- → (r=4) + (w=2) → 6
r-- → (r=4) → 4
→ 664

▲TOP


パーミッションの変更

パーミッションの変更は、Telnetでサーバに接続してシェルから行う方法と、CuteFTP のような FTPソフトを使って行う方法があります。ファイルのデフォルトのパーミッション664 または 644 ですので、CGI プログラムなどのファイルを実行できるようにするためにはパーミッションの変更をしなければなりません。

パーミッションの変更が必要なのはなぜかというと、CGI プログラムは通常の HTML ファイルのようにただ表示させる(読む)だけでなく、実行させるのであり、プログラムの中で扱われるデータファイルは、読み書き(特に書き)できるようにしておかなければならないからです。
ブラウザから CGI プログラムの URL を呼び出したときに、CGI プログラムを実行させるのは、Apache などの Web サーバです。この Web サーバは通常 nobody という架空のユーザー権限で動いていますので、CGI プログラムやデータファイルのパーミッションは、nobody 架空ユーザーにとって、実行できたり読み書きできなければなりません。したがって、実行権限や読み書き権限は、その他のブロックの部分で満たしている必要があります。
一方、シェル上では、ログインしているユーザーの権限でプログラムが実行されますので、シェル上でも実行(読み書き)可能にするためには、ユーザーのブロックのパーミッションを満たす必要があります。
グループのブロックは、CGI の場合通常関係ありません。そのままにしておいても構いませんが、私は 0 にしてしまいます。

一般的には、CGI プログラムファイルのパーミッションは 705(ユーザーは読み書き実行可能、Webサーバからは読みと実行が可能)、データファイルは606(ユーザー、Webサーバともに読み書きが可能)に変更します。

シェルから行う方法

変更したいファイル名が file.cgi で、変更したいパーミッションが 755 であるとします。

chmod 755 file.cgi

とすれば変更できます。このときの作業ディレクトリが、file.cgi のあるディレクトリになっていなければなりません(当然、File not found になります)。

chmodコマンドは、引数を複数指定できますので、複数ファイルのパーミッションを一括変更することができます。その場合、1つ1つのファイル名を指定してもよいですが、ワイルドカードを使って、簡単に指定することができます。

chmod 755 file1.cgi file2.cgi file3.cgi

は、file1.cgi、file2.cgi、file3.cgi の3つのファイルのパーミッションを 755 に変更します。

chmod 755 *.cgi

は、cgi を拡張子に持つカレントディレクトリ内のすべてのファイル(ファイル名の先頭に . が付くものを除く)のパーミッションを 755 に変更します。

FTPソフトの場合

細は各ソフトウエアのマニュアルまたはヘルプをご覧ください。Windows 版 CuteFTP の場合は、サーバ側の任意のファイルを選択した状態で、右クリックをして出たメニューの中の Change file attributes を選ぶと、下記のダイアログがあらわれますので、Manual の部分に直接変更したいパーミッション(3ケタの数字)を入力します。あとはOKボタンを押せば変更されます。なお、一度にたくさんのファイルのパーミッションを変更する場合、たいていの場合シェル上から chmod コマンドを使った方が速いです。

▲TOP