[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 | 実行許可 |
s | s ビットが立っていて実行許可 |
S | s ビットが立っていて実行不可 |
t | スティッキー (sticky) |
リンクや s ビットについての説明はここでは省略します.
利用権限の設定 (ファイルモードの設定)
ファイルの利用権限を設定するには chmod コマンドを用います. 基本的な使い方は次の通りです. (詳しくは $ man chmod を参照してください).
$ chmod <mode> file
<mode> の部分には 0 から 7 までの数字を 3 桁並べたもの, または記号が入ります.
<mode> に数字を入れる場合
3 桁の数字には, 左の桁から順にファイルの所有者, ファイルの所属グループ, その他のユーザーに対する利用権限を示します. 各々の読みだし, 書き込み, 実行権限は 4, 2, 1 の数字で表され, <mode> にはこの数字の和が代入されます.
許可 記号 数字 読込 r 4 書込 w 2 実行 x 1 例えば, モードを -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 を消去してください. このとき, どのようなモードだとファイル消去できないかも是非試してください.
Keyword(s):
References:[[Exp2017]スケジュール表・各回資料] [[Exp2017]ファイルとディレクトリ] [[itbase2017]ファイルとディレクトリ] [[itbase2017]惑星学実験実習の基礎II] [[itbase2018]ファイルとディレクトリ] [[itbase2019]ファイルとディレクトリ]