IT pass HikiWiki - [itbase2020]パーミッション Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

{{toc}}

#((<"スケジュール表・各回資料 (08/09)"|[Exp2017]スケジュール表・各回資料#08-2F09>))

= ファイルモードとリンク

== 本テキストの目的

* ファイルモードを理解する (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" というファイルを例に取って, この読み方を解説します. 左から順に,

# RT
-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

です.

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

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

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

# RT
-, その権限が出ていない
r, 読み込み許可
w, 書き込み許可
x, 実行許可

# s, s ビットが立っていて実行許可
# S, s ビットが立っていて実行不可
# t, スティッキー (sticky)
#
#リンクや s ビットについての説明はここでは省略します.


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

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

$ chmod <mode> file

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

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

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

   # RT
   許可, 記号, 数字
   読込, r, 4
   書込, w, 2
   実行, x, 1

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

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

  となるので,

   $ chmod 664 file

  とすれば変更できます.


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

  <mode> には,

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

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

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

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

   # RT
   対象, 操作
   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 で立ち上げて, 中の文字を書き換えてみましょう.

$ emacs testdir/word.txt &

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

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

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

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


=== ディレクトリのモード

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

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

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

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

$ cd testdir

実際に移動すると,

Permission denied

と怒られましたか?

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