[Exp2017]ファイルのモード

ファイルモードとリンク

本テキストの目的

  • ファイルモードを理解する (ls -l の出力結果が理解できるようになる).
  • ファイルのパーミッションを変更できるようになる.

ファイルモード

Unix/Linux は、複数のユーザーで同一のマシンを使用することを前提に設計されています (マルチユーザの概念). そこで, Unix/Linux においてファイルへのアクセス権制御, 即ち他人に見せてもよいファイル・見せたくないファイルの制御が重要となります.

Unix/Linux は, 自分のホームディレクトリへ他人が勝手にファイルを書いたり, 自分のメールを他人に読まれたりされないようにすることが可能です. また特定のグループに所属するメンバーのみ読み書きが可能なファイルを作ることもできます. ここでは, このようなファイルのアクセス権の制御について見ていきます.

ファイルモード

自分のホームディレクトリで ls コマンドを幾つかのオプションを指定して実行すると, およそ以下のような出力が得られます. (以下はあくまで出力例です)

$ ls -laF
total 140
drwxr-xr-x 20 chikuwa2 chikuwa2  4096 Apr 24 17:05 ./
drwxr-xr-x  9 root     root      4096 Apr 20 03:34 ../
drwxr-xr-x  3 root     root      4096 Mar 21 10:52 .emacs.d/
drwx------  4 chikuwa2 chikuwa2  4096 Apr  8 09:51 .gconf/
drwxr-xr-x  2 chikuwa2 chikuwa2  4096 Mar 31 13:12 Desktop/
-rw-r--r--  1 chikuwa2 chikuwa2     5 Apr 25 21:21 hoge.txt         < このファイルに注目
drwxr-xr-x  2 root     root      4096 Mar 27 22:39 public_html/

........... (以下ファイル・ディレクトリが続く)

この出力の "hoge.txt" というファイルを例に取って, この読み方を解説します. 左から順に,

-rw-r--r--ファイルモード
1ファイルへの "リンク数"
chikuwa2ファイルの所有者
chikuwa2ファイルの属するグループ
5ファイルの大きさ(バイト単位)
Apr 25 21:21ファイルの最終更新時刻
hoge.txtファイルの名前

を表しています. これらをファイルの「属性」と呼びます. なお,

$ man ls

としてみるとより詳しいことが分かります.

一番左側の表示の文字列はファイルの「モード」, すなわちファイルの型 (type) と利用権限 (permission) を表しています. 例えば, hoge.txt のすぐ上の Desktop/ のモードを見ると,

drwxr-xr-x 

と書かれてあります. 左端の 1 文字はファイルの型を示します. 取りうる文字と型は後述します.

2 〜 10 文字目は, 利用権限を示しています. 利用権限の許可対象には,

  • ファイルの持ち主
  • ファイルの所有グループ
  • その他のユーザー

があり, それぞれに対する許可情報を,

  • ユーザーパーミッション (user permission)
  • グループパーミッション (group permission)
  • アザーズパーミッション (others permission)

と読んでいます.

また利用権限には,

  • 読み出し許可 (read permission)
  • 書き込み許可 (write permission)
  • 実行許可 (execute permission)

の 3 種類があります. ファイルモードの読み方は,

d rwx r-x r-x
^ ^^^ ^^^ ^^^
|  |   |   |
|  |   |   アザーズパーミッション
|  |   |
|  |   グループパーミッション
|  |
|  ユーザーパーミッション
|
ファイルの型(type)

となります. 各箇所で取りうる文字は,

- --- --- ---
d rwx rwx rwx
l   s   s   t
s   S   S
b
c
P

です.

左端の文字とファイルの型は, 次のように対応づけられています.

-通常のファイル
dディレクトリディレクトリファイル
lシンボリックリンクWindows の "ショートカット" に近い機能
sソケットファイルソケットという通信方法で使用される特殊ファイル
bブロックデバイスデータを一定の文字数で転送する際に使用される特殊ファイル
cキャラクタデバイスデータを 1 文字ずつ転送する際に使用される特殊ファイル
P名前つきパイプ複数のプロセス間で通信を行う際に使用される特殊ファイル

また, 利用権限は以下の通りです.

-その権限が出ていない
r読み込み許可
w書き込み許可
x実行許可
ss ビットが立っていて実行許可
Ss ビットが立っていて実行不可
tスティッキー (sticky)

リンクや s ビットについての説明はここでは省略します.

利用権限の設定 (ファイルモードの設定)

ファイルの利用権限を設定するには chmod コマンドを用います. 基本的な使い方は次の通りです. (詳しくは $ man chmod を参照してください).

$ chmod <mode> file

<mode> の部分には 0 から 7 までの数字を 3 桁並べたもの, または記号が入ります.

  • <mode> に数字を入れる場合

    3 桁の数字には, 左の桁から順にファイルの所有者, ファイルの所属グループ, その他のユーザーに対する利用権限を示します. 各々の読みだし, 書き込み, 実行権限は 4, 2, 1 の数字で表され, <mode> にはこの数字の和が代入されます.

    許可記号数字
    読込r4
    書込w2
    実行x1

    例えば, モードを -rw-rw-r-- と変えたい場合,

    -rw-rw-r--	
     42 42 4
     |  |  |
     6  6  4         < これが <mode> になる

    となるので,

    $ chmod 664 file

    とすれば変更できます.

  • <mode> に記号を入れる場合

    <mode> には,

    対象操作許可
    [ugoa][+-=][rwxst]

    という形式を "," で区切って並べます.

    対象と操作の文字は以下の意味を表します.

    ※許可の所はファイルモードと同じです.

    対象操作
    u所有者
    gグループ
    oその他のユーザ
    a全員 (ugo と同じ)
    +許可を与える
    -許可を取り消す
    =許可を設定する

    この場合, 先の例と同じ設定 (-rw-rw-r--) にするには次のようにします.

    $ chmod u=rw,g=rw,o=r file

パーミッションを体験してみる

では, 実際にファイルを作成してパーミッションの変更をしてみましょう.

準備: ファイルとディレクトリの作成

以下の作業をしてディレクトリとファイルを作成してください.

$ cd                                        < ホームディレクトリに移動
$ mkdir testdir                             < testdir ディレクトリを作成
$ echo 'test-word' > ./testdir/word.txt     < testdir ディレクトリの中に
                                              'test-word' が書き込まれた
                                              word.txt というファイルを作成

ファイルを読めないようにしてみましょう

次に, word.txt を自分も含めて誰も読むことができないように, パーミッションを変更してください.

$ chmod ??? testdir/word.txt          < chmod を使って testdir/word.txt
                                       ファイルのパーミッションを変える.
                                       誰も読めないように
                                       ??? の部分を考える

さて, 上記の ??? には, いったい何の数字を入力すればよいでしょう?

ファイルの中身を見てみましょう

$ cat testdir/word.txt

もし,

Permission denied

と注意されファイルの中身が見えなければ成功です. もし見えてしまった場合は, 先の chmod コマンドを先程とは違うモードで 再度実行し, 見えない様にしてください.

見えないようにする方法が分かったら, 今度はいろいろなモードに変更して その違いを確かめてください.

ファイルに書き込めないようにしてみましょう

次に, word.txt を, 読むことはできるが, 書き込むことができないように, パーミッションを変更してください.

$ chmod ??? testdir/word.txt          < chmod を使って testdir/word.txt
                                       ファイルのパーミッションを変える.
                                       読めるが, 誰も書けないように
                                       ??? の部分を考える

さて, 上記の ??? には, いったい何の数字を入力すればよいでしょう?

ファイルの中身を書き換えてみましょう

emacs で立ち上げて, 中の文字を書き換えてみましょう.

$ emacs testdir/word.txt &

emacs で書き換えようとしたときに, emacs ウィンドウの下部に

Buffer is read-only: #<buffer word.txt>

といったメッセージが表示されれば成功です.

もし書き換えることができてしまった場合は, 先の chmod コマンドを 先程とは違うモードで再度実行し, 見えない様にしてください.

ディレクトリのモード

ディレクトリのモードを変えると, そのディレクトリに移動できなくなったり するはずです. cd コマンドなどを試してみてください. ディレクトリの パーミッションによってできる主な操作は以下のとおりです.

モード利用権限
rそのディレクトリの中に何があるか見れる (ls できる)
wそのディレクトリの中でファイルを作成・消去できる
xそのディレクトリの中のファイルにアクセスできる (cd できる)

ためしに, ディレクトリ「testdir」に, "自分は中に入れない" ような パーミッションを設定し, 入れないか確認してください.

$ chmod ??? testdir      < chmod をつかって testdir ディレクトリのパーミッションを変える
                          ディレクトリに入れないように ??? の部分を考えよう 

$ cd testdir

実際に移動すると, お互いに,

Permission denied

と怒られましたか?

最後に自分の作った word.txt を消去してください. このとき, どのようなモードだとファイル消去できないかも是非試してください.