14.4.5 パーミッションと実行ファイル

それぞれのファイルやフォルダ (ディレクトリ) にはパーミッション,つまり「ユーザが閲覧や上書き,実行するための権限」が設定されています.ここではパーミッションを確認したり変更する方法とともに,実行ファイルについて説明します.Finder で対応する操作は,hwb14.3.6 詳細情報とパーミッションの操作 に説明があります.

パーミッションの意味・表示方法

ファイルやディレクトリのパーミッションを確認するには,ls コマンドを -l オプション付きで実行します(hwb14.4.2 ディレクトリの操作).

ls -lreturn2
total 38 drwx------ 4 0000000000 student 3072 3 12 15:13 Desktop drwx------@ 4 0000000000 student 1024 3 6 11:21 Documents drwx------ 2 0000000000 student 4096 3 2 13:09 Downloads drwx------ 5 0000000000 student 1024 4 14 2005 ECC drwx------@ 35 0000000000 student 3072 3 2 09:14 Library drwx------ 7 0000000000 student 1024 6 23 2005 Mail drwx------@ 2 0000000000 student 1024 6 30 2005 Movies drwx------@ 2 0000000000 student 80 1 14 2004 Music drwx------@ 2 0000000000 student 1024 5 19 2005 Pictures drwxr-xr-x@ 3 0000000000 student 1024 4 21 2005 Public drwxr-xr-x@ 3 0000000000 student 1024 4 21 2005 Sites drwxr-xr-x 2 0000000000 student 1024 3 12 14:36 tex drwx--x--x 4 0000000000 student 80 6 20 2005 windows

ここで,特に

drwxr-xr-x@  3 0000000000 student 1024 4 21  2005 Sites

について,左から順に見てみます.

項目 意味
d ディレクトリであることを表す
rwx(2〜4文字目) ファイルの所有者 (user) に対するパーミッション
r-x(5〜7文字目) ファイルの所属するグループ (group) に対するパーミッション
r-x(8〜10文字目) その他 (others) に対するパーミッション
0000000000 ファイルまたはディレクトリの所有者
student そのファイルまたはディレクトリの所属するグループ
1024 サイズ(バイト単位)
4 21 2005 作成日時(2005年4月21日を表している)
Sites 名称

「rwx」「r-x」といった3文字の意味は,次のようになっています.

  • 「r」はファイルの読み込み許可を表します.ディレクトリに対してこれがセットされた場合は,「ディレクトリの中身のファイル一覧を ls などで知ることが許可される」という意味です.
  • 「w」はファイルの中身の変更の許可,つまり書き込み許可です.ディレクトリに対しては,「その中にファイルを新たに作成したり,中のファイルを消すことなどが許可される」という意味です.
  • 「x」はファイルの実行許可です.ディレクトリに対しては,「そのディレクトリの下にあるファイルの情報を取得できる」という意味です.
  • 許可がない操作をしようとすると,「Permission denied」というエラーメッセージが出て,実行できません.

例えば所有者 0000000000,グループ student であるファイル a.sh に対する

rwxrw-r-x

というパーミッションは,

  • a.sh の中身の読み取りは,すべての人ができる.
  • グループ student に属するユーザは,a.sh の中身を書き換えられる.
  • a.sh を実行することは,所有者である 0000000000 と,グループ student でないユーザ(つまり others に該当するユーザ)のみ可能である.
ということを表していることになります.

ディレクトリに対する「x」許可がないとどうなるかの例を示します.

ls -l piyoreturn2
total 1 -rw-r--r-- 1 0000000000 student 42 3 7 14:29 bar.txt drw-r--r-- 2 0000000000 student 80 3 7 14:04 fuga
cd piyo/fugareturn2
-bash: cd: piyo/fuga: Permission denied

数字による表記法

パーミッションはしばしば 644, 755 などと,8 進法による 3〜4 桁の数字で表されることがあります (8 進法についてはhwb18.1.2 2進法, 16進法と8進法を参照).各桁はそれぞれ user, group, others に対応するパーミッションに対応し,また各数字は,2 進法に直したときの「1の位」が実行許可,「2の位」が変更許可,「4の位」が読み取り許可を表しています.

例えば,

rwxrw-r-x, rwxr-----

というパーミッションを数字で表してみます.rwx は 2 進法の 111 に対応するので,8 進法で表すと 7 になります.また rw- は 2 進法の 110 に対応するので,8 進法では 6 です.同様のことを続けて上のパーミッションを 3 桁の数字で表すと,それぞれ 765, 740 となります.

パーミッションの変更

パーミッションを変更するには,chmod コマンドを利用します.

chmod (パーミッションの指定) (対象とするファイル・ディレクトリ)return2

第 1 引数 (パーミッションの指定) には,次のいずれかを指定します:

  • go-x のように,今のパーミッションの状態からどの部分を変更するかの指定.
    まず対象者を u(user), g (group), o(others) で指定し,その後に +(許可),-(禁止),最後に r(読み取り),w(変更),x(実行)の順番で指定する.
  • 644, 775 のように,上で述べた数による表記による指定.

例1

次の(意味のない)例では,chmod が 4つありますが,それによって test.tex のパーミッションは次のように変わっていきます.

rw-r--r-(最初)→ rwxr-xr-- → rwx--x--- → rwx--x-w- → rwxrwxrw-
chmod ug+x test.texreturn2
chmod go-r test.texreturn2
chmod o+w test.texreturn2
chmod ugo+w test.texreturn2

例2:書き込み許可の活用

大事なファイルが上書きされたり,削除されたりするのを防ぐため,書き込み許可を変更しておくという方法があります.

ls -lreturn2
total 8 -rw------- 1 0000000000 student  6 3 13 20:42 memo.txt -rw------- 1 0000000000 student 10 3 13 20:45 test.txt
chmod -w memo.txtreturn2
ls -lreturn2
total 8 -r-------- 1 0000000000 student  6 3 13 20:42 memo.txt -rw------- 1 0000000000 student 10 3 13 20:45 test.txt

このようにすると,rm コマンドに対して,「パーミッションでは書き込み許可がないが,本当にやって大丈夫か」という問い合わせがあります.

rm memo.txt return2
override r-------- 0000000000/student for memo.txt? n enter
ls -lreturn2
total 8 -r-------- 1 0000000000 student  6 3 13 20:42 memo.txt -rw------- 1 0000000000 student 10 3 13 20:45 test.txt

さらに, cp コマンドによる上書きや,エディタなどによって中身を変更しようとすると,「Permission denied」のエラーが出ることになります.

例3:シェルスクリプト

コマンドを順番に並べたシェルスクリプトhwb25.4 シェルスクリプト 参照)と呼ばれるプログラムがあります.例として,ここでは次の中身を持った test.sh を考えます:

#!/bin/sh
echo 3-8-1 Komaba Meguroku Tokyo
echo Todai Taro

echo コマンドは,それに続く文字列を出力するコマンドです.

しかし,ただ test.sh を作って保存しただけでは,実行できません.前にも書いたように,実行許可がないファイルは実行できないからです.

ls -l test.shreturn2
-rw-r--r-- 1 0000000000 student 60 3 13 21:04 test.sh
./test.shreturn2
bash: ./test.sh: Permission denied

実行許可を与えれば,実行できるようになります.

chmod +x test.shreturn2
ls -l test.shreturn2
-rwxr-xr-x 1 0000000000 student 60 3 13 21:04 test.sh
./test.shreturn2
3-8-1 Komaba Meguroku Tokyo Todai Taro

実行ファイル

実行許可があるファイルを実行ファイルといいます.普通は実行ファイルは意味のあるプログラムですが,そうでなければならないという規定はありません.中身が空のファイルだって,実行許可があれば実行ファイルです.

実行ファイルを実行するには,その実行ファイルのパス名を指定すればよいです.例えば /home01/0000000000/bin がカレントディレクトリのとき,その中にある a.out という実行ファイルは

./a.outreturn2
/home01/0000000000/bin/a.outreturn2

のどちらででも実行できます.

これまで説明してきたいろいろなコマンドも実行ファイルの形になっているものが多いです.例えば,ls, mv コマンドは,実際には /bin/ls, /bin/mv という実行ファイルです.コマンドが実際にはどの実行ファイルであるかは,which コマンドを使って調べることができます.

which lsreturn2
/bin/ls

実行ファイルのパス

ls コマンドが /bin/ls という実行ファイルであるならば,なぜ ls コマンドはパス名の指定をしなくても(コマンド名だけで)実行できるのでしょうか?

これは,実行パスで指定されているディレクトリの中に /bin/ls があるからです.現在の実行パスの値は,環境変数 PATH に格納されています(参考:hwb25.2 環境変数).教育用計算機システムの Mac 環境では,PATH の標準値は次のようになっています.

PATH=/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/usr/local/MacGPG2/bin

コマンドをパス名の指定なしに実行しようとすると,PATH に指定されている順番で,それぞれのディレクトリにコマンドが存在しているかが調べられ,最初に見つかった実行ファイルが実行されるという仕掛けになっています.

なお,上の PATH の値にカレントディレクトリの . が含まれていないことに注意して下さい.このため hwb14.4.1 ディレクトリ で触れたように,カレントディレクトリの実行ファイルであってもファイル名だけでは実行できず,./ を前置する必要があります.