ファイルの操作

First Edition 2002.9.14
Last Modified 2003.5.28

UNIX系OSの基本、ファイルのパーミッションの話です。基本の中の基本ですが、実際にはまることが多い部分でもありますので、 細かく見ていきたいと思います。

  1. ファイルの書式(対象Ver:全て)(2003.5.28)
  2. ファイルのアクセス権を変更する(対象Ver:全て)(2003.5.28)
  3. ファイルの所有者を変更する(対象Ver:全て)(2002.10.1)
  4. ファイルのグループを変更する(対象Ver:全て)(2002.10.1)

ファイルの書式

ファイルの書式はターミナルで、
$ ll
もしくは
$ ls -l
と打つと、以下のように出力されます。
-rw----r--    1 lucky     lucky         9143 Sep  4 22:03 version.html
   (1)       (2) (3)       (4)           (5)       (6)        (7)
(1)ファイルの種類とパーミッション
(2)ハードリンク数
(3)所有者
(4)グループ
(5)ファイルサイズ
(6)作成、更新、変更した日付
(7)名称

それぞれ詳しく見ていきましょう。

■(1)ファイルの種類とパーミッション
-  rw-  ---  r--
1文字目は、ファイルの種類を示しています。ファイルの種類は以下のようなものがあります。

 - 普通のファイル
 d ディレクトリ
 l シンボリックリンク
 c キャラクタデバイス:データの受け渡しに際し、バッファリングを行わないもの
 b ブロックデバイス:データの受け渡しに際し、バッファリングを行うもの

シンボリックリンクとは、Windowsで言うところのショートカットです。ファイルとディレクトリのリンクには「ハードリンク」と 「シンボリックリンク」の2つがあります。

キャラクタデバイスとブロックデバイスは/dev/ディレクトリをのぞいてみるとたくさんあることが分かります。例として以下のような ものがあります。

キャラクタデバイスシリアル、パラレルポート
ブロックデバイスフロッピーディスク、ハードディスク

2文字目以降はパーミッションを示しています。パーミッションはファイルとディレクトリで全く意味が異なりますので、 注意が必要です。

ファイルのパーミッション
 r ファイル内容の表示が可能
 w 書き込み可能
 x 実行可能

ディレクトリのパーミッション
 r ファイル一覧の表示が可能
 w ファイルの追加が可能
 x ファイルの読み込み、書き込みが可能。cdコマンドで中に入ることも可能

Linux問わずUNIX系システムのパーミッションは、大きく分けて3つのグループに分けることが出来ます。

所有者
グループ
他人

それぞれに読みとり、書き込み、実行権限や、一覧表示、ファイルの追加、cdコマンドの許可を設定することが出来ます。

■(2)ハードリンク数
ハードリンクとは、ファイル、ディレクトリの実体へアクセスすることが出来る数です。
ファイル、ディレクトリはディスク上でi-nodeと呼ばれる番号によって管理されています。ファイル名、ディレクトリ名は最終的には i-node番号を示すために使われるのです。
ファイル、ディレクトリにアクセスするにはi-node番号が分かればよいわけで、たどり着くまでに使われる名称はいくつあっても かまいません。したがって、あるi-node番号にたどり着くための名称を複数作成することを「ハードリンクする」と言います。
試しに以下の操作をしてみましょう。

あるファイルを作成してみます。
$ vi file1.txt
中身はabcとでもしておきましょう。次にハードリンクをします。
$ ln file1.txt file2.txt
statコマンドにより、ファイルの詳細を見てみましょう。
$ stat file*.txt
  File: "file1.txt"
  Size: 3          Blocks: 8         Regular File
Access: (0644/-rw-r--r--)         Uid: (  500/    lucky)  Gid: (  500/    lucky)
Device: 30d        Inode: 444487     Links: 2    
Access: Fri Sep 13 00:29:02 2002
Modify: Fri Sep 13 00:29:02 2002
Change: Fri Sep 13 00:29:09 2002

  File: "file2.txt"
  Size: 3          Blocks: 8         Regular File
Access: (0644/-rw-r--r--)         Uid: (  500/    lucky)  Gid: (  500/    lucky)
Device: 30d        Inode: 444487     Links: 2    
Access: Fri Sep 13 00:29:02 2002
Modify: Fri Sep 13 00:29:02 2002
Change: Fri Sep 13 00:29:09 2002
このように、ハードリンクをすると、ファイル名は異なってもInode(i-node)が同じファイルが作成されます。
この状態で、file2.txtに変更を加えると、file1.txtの内容も全く同じに変更されます。実体が同じものなので、 当然の動きです。

しかし、ハードリンクより、シンボリックリンクの方が使い勝手がよいので、ハードリンクはほとんど使うことはないでしょう。

■(3)所有者
ファイル、ディレクトリの所有者を示します。所有者はほとんどすべての権限を持つことが出来ますが、所有者自身を他の所有者に 変更することだけは出来ません。

■(4)グループ
通常、人がLinuxを操作する場合など、複数のユーザーをまとめたものをグループとします。 それ以外に、デーモン(プログラム)などは1人のユーザーしかいないグループでプログラムが動作します。

■(5)ファイルサイズ
バイト単位のファイルサイズです。

■(6)作成、更新、変更された日付
ファイル、ディレクトリに対して作成、更新、変更などを行ったときの日と時間です。

■(7)ファイル名
ファイル名、ディレクトリ名、シンボリックリンク名、キャラクタデバイス名、ブロックデバイス名などです。

ファイルのアクセス権を変更する

ファイルの書式でお話ししたとおり、ファイルには、「所有者」、「グループ」、「他人」の3つの グループがあることが分かりました。それぞれに対して、「ファイル内容の表示が可能」、「書き込み可能」、「実行可能」の 3つの属性を設定できることも分かりました。
では、それらの設定できる属性を変更してみます。適当にテキストファイルを作成してみます。
-rw-r--r--    1 lucky     lucky            6 Sep 23 23:12 test.txt
"test.txt"というファイルを作成してみました。すると、上記のようなパーミッションになりました。これは、

所有者:読みとりと書き込み
グループ:読みとりのみ
他人:読みとりのみ

とう属性が設定されていることになります。「読みとりはすべての人に許可されていますが、所有者以外は変更が不可能」になっています。 デフォルトで設定されるパーミッションは、"umask"という値により制御されています。"umask"については今後書きたいと思います。
パーミッションを変更するには、2つの方法があります。パーミッションは所有者もしくはrootしか変更できません。

1.chmod 640 test.txt
2.chmod o-x text.txt

1.の方法
これは、変更したいパーミッションを16進数で設定する方法です。
所有者、グループ、他人への属性は、以下の数字を足したものを設定します。
r:4
w:2
x:1
(例1)
$ chmod 777 test.txt
$ ll test.txt
-rwxrwxrwx    1 lucky     lucky            6 Sep 23 23:12 test.txt
読み込み書き込み実行
所有者
グループ
他人

(例2)
$ chmod 770 test.txt
$ ll test.txt
-rwxrwx---    1 lucky     lucky            6 Sep 23 23:12 test.txt
読み込み書き込み実行
所有者
グループ
他人不可不可不可

(例3)
$ chmod 600 test.txt
$ ll test.txt
-rwx------    1 lucky     lucky            6 Sep 23 23:13 test.txt
読み込み書き込み実行
所有者
グループ不可不可不可
他人不可不可不可

これらの例では数が少ないと思いますので、自分でいろいろ試してみるとよく分かります。

2.の方法
これは、変更したいパーミッションを所有者、グループ、他人で分けて設定する方法です。
所有者:u
グループ:g
他人:o
所有者に実行属性を与えたい場合は、"u+x"というように"+"を使います。逆に実行権を取りたい場合は、"u-x"とします。 これは、今設定されている属性に対して付け加えたり取り外したりする方法です。直接設定するには、"u=rwx"というように "="を使います。 (例1)
$ chmod u+x test.txt
$ ll test.txt
-rwxr--r--    1 lucky     lucky            6 Sep 23 23:14 test.txt
読み込み書き込み実行
所有者
グループ不可不可
他人不可不可

(例2)
$ chmod g+x test.txt
$ ll test.txt
-rwxr-xr--    1 lucky     lucky            6 Sep 23 23:14 test.txt
読み込み書き込み実行
所有者
グループ不可
他人不可不可

(例3)
$ chmod o-r test.txt
$ ll test.txt
-rwxr-x---    1 lucky     lucky            6 Sep 23 23:14 test.txt
読み込み書き込み実行
所有者
グループ不可
他人不可不可不可

(例4)
$ chmod o=rwx test.txt
$ ll test.txt
-rwxr-xrwx    1 lucky     lucky            6 Sep 23 23:14 test.txt
読み込み書き込み実行
所有者
グループ不可
他人

(例5)
$ chmod ugo-rwx test.txt
$ ll test.txt
----------    1 lucky     lucky            6 Sep 23 23:14 test.txt
読み込み書き込み実行
所有者不可不可不可
グループ不可不可不可
他人不可不可不可

これでは、オーナー自身も全くアクセスできなくなってしまいますが、あくまでも例ということで。
これら以外にも、自分でいろいろ試してみてください。

ファイルの所有者を変更する

ファイルの所有者を変更するには、ルートでないと変更できません。以下のようにして変更します。
# ll test.txt
-rw-r--r--    1 lucky     lucky            5 Oct  1 21:37 test.txt
# chown hogehoge test.txt
# ll test.txt
-rw-r--r--    1 hogehoge     lucky            5 Oct  1 21:37 test.txt
"chown"コマンドを使います。所有者を変更されて上記のファイルは以下のようなアクセス権になります。

読み込み書き込み実行
所有者(hogehoge)不可
グループ(lucky)不可不可
他人不可不可

ファイルのグループを変更する

ファイルのグループを変更するには、ルートもしくは所有者しか変更できません。所有者の場合は、変更後のグループに所有者が所属している必要が あります。
$ ll test.txt
-rw-r--r--    1 hogehoge     lucky            5 Oct  1 21:37 test.txt
$ chgrp hogehoge test.txt
$ ll test.txt
-rw-r--r--    1 hogehoge     hogehoge            5 Oct  1 21:37 test.txt
上記のように"chgrp"コマンドを使います。


[HOME]
since 2001.4.22