§8.7 パーミッション


作成日:2001/12/07(木)

PerlはもともとUNIXというOS上で動くことを前提に開発されました。 このUNIXというOSは、複数のユーザが使うことを前提にして作られていて、今でもプロバイダのWWWサーバーなどに多く使われています。 このとき1つ問題が発生します。 それは、自分のファイルを他人が読み書きできる可能性があると言うことです。 アクセスカウンターのデータファイルや掲示板のログなどを他人に勝手に書きかえられてしまったら大変ですよね。 そこで登場するのが、この節のタイトルでもある「パーミッション(permission:許可)」です。 パーミッションとは、それぞれのファイルやディレクトリに対して、読みこみ、書き込み、実行と言うような許可、不許可を決める物です。 この節ではパーミッションのしくみと変更方法などを紹介していきます。

パーミッションとは何ぞや?

UNIXシステムでのパーミッションの設定は、利用者をユーザ、グループ、その他の3種類に分類して行います。 それぞれの意味は次の通りです。

ユーザ
ファイルやディレクトリの所有者をユーザと言います。パーミッションの設定や変更はこのユーザだけが行えます。

グループ
UNIXシステムを使えるようにユーザ登録したときに、ユーザはあるグループに属するように設定されます。 その際、同じグループにいる人に対してパーミッションを設定するのに用いられます。

その他
読んで字のとおり、ユーザでもなく、同じグループにも属していない、その他大勢を指します。

では、実際のパーミッションの仕組みを見てみましょう。 FTPソフトやTelnetなどでcan.cgiと言うファイルに関する情報を見たら、次のようだったとします。

名前 日付 サイズ 種類 属性 所有者
can.cgi 2001/11/26 16:04 5948 cgi -rwxr-xr-x can


上の表の「属性」と言う項目を見てください。 "-rwxr-xr-x"となっていますね。 この部分がパーミッションです。 この意味は次のようになります。 まず、最初の"-"。 これはcan.cgiが普通のファイルであることを示しています。 ここに来る文字としては次のような物があります。



文字 意味
d ディレクトリであることを示します。
l シンボリックリンク(Windowsで言うショートカット、Macintoshで言うエイリアスのような物)であることを示します。


"-"の次に、"rwx"とありますね。 ここでは「ユーザ」、つまり所有者である僕canに対するパーミッションの設定をしています。 それぞれの文字の意味は順番に、r(Read:読みこみ)、w(Write:書きこみ)、x(eXcute:実行)となります。 つまり、僕にはcan.cgiの中身を読む権限、内容を書きかえる権限、そしてスクリプトを実行する権限が与えられていることになります。

先へ進みましょう。 次には"r-x"と書いてあります。 この部分では、「グループ」に対するパーミッションを設定しています。 今の場合、読みこみ権と実行権はありますが、真中が"-"となっているので書きこみ権はありません。 このように権限がない場合にはその部分が"-"となります。

では最後。 もうだいたいわかりますね。 そう、ここは「その他」に対する設定をするところです。 そして設定の内容はグループのところと同じで"r-x"となっています。 つまり読みこみ権と実行権だけが与えられていると言うことです。

パーミッションを数字で表す

上で説明したパーミッション。 "-rwxr-xr-x"というのでは、人に説明するのが大変ですよね。 そこでこれを数字(8進数)で表してみましょう。 まず次の表のように各権限ごとに数字を割り当てます。



権限 数値
r(読みこみ) 4
w(書きこみ) 2
x(実行) 1
-(権限なし) 0


そして、ユーザ、グループ、その他のそれぞれに対して、与えられた権限を足していきます。 "rwxr-xr-x"の場合は次のようになります。 まずユーザに対しては4+2+1=7、グループに対しては4+0+1=5、その他に対しては4+0+1=5。 したがってパーミッションは755となります。

パーミッションの変更

Perlでパーミッションを変更するときにはchmod関数を使います。

 chmod(0755, "can.cgi");

上のスクリプトによってcan.cgiのパーミッションが755に変更されます。 パーミッションは8進数なので、先頭に0を付けることに注意してください。 複数のファイルのパーミッションを1度に変更するには、それらのリストを渡すと言う手があります。

 chmod(0755, "can.cgi", "ican.cgi", "youcan.cgi")
  or print "パーミッションの変更に失敗\n";

ところが、chmod関数は戻り値としてパーミッションの変更に成功したファイルの個数を返すので、そのうちの1つの変更に失敗しても偽にはなりません。 foreachループなどを使って1つ1つ変更するのがいいでしょう。

 @files = ("can.cgi", "ican.cgi", "youcan.cgi");
 foreach $file (@files) {
   chmod(0755, "$file") 
     or print "$fileのパーミッション変更に失敗\n";
 }

この節ではパーミッションについて簡単に触れてきました。 第8章はこれでおしまいです。 次の章ではディレクトリの操作についてお話します。


「§8.6 ファイル操作いろいろ」へ 「§9.1 ディレクトリハンドル」へ
ソフトバンク パブリッシング株式会社

Copyright (C) can All Rights Reserved
e-mail:ishiki@mrj.biglobe.ne.jp