「ファイルのパーミッションと属性」の版間の差分
(→パーミッションのコピー: 翻訳) |
細 (→所有者の変更: typo) |
||
(3人の利用者による、間の25版が非表示) | |||
2行目: | 2行目: | ||
[[Category:コマンドライン]] |
[[Category:コマンドライン]] |
||
[[en:File permissions and attributes]] |
[[en:File permissions and attributes]] |
||
+ | [[es:File permissions and attributes]] |
||
+ | [[pt:File permissions and attributes]] |
||
[[ru:File permissions and attributes]] |
[[ru:File permissions and attributes]] |
||
+ | [[zh-hans:File permissions and attributes]] |
||
{{Related articles start}} |
{{Related articles start}} |
||
{{Related|ユーザーとグループ}} |
{{Related|ユーザーとグループ}} |
||
8行目: | 11行目: | ||
{{Related|アクセス制御リスト}} |
{{Related|アクセス制御リスト}} |
||
{{Related|ケイパビリティ}} |
{{Related|ケイパビリティ}} |
||
+ | {{Related|拡張属性}} |
||
{{Related articles end}} |
{{Related articles end}} |
||
− | [[ファイルシステム]]は[[ |
+ | [[ファイルシステム]]は、[[Wikipedia:ja:ファイルパーミッション|パーミッション]]と[[wikipedia:File attribute|属性]]を使って、どの程度のレベルでシステムのプロセスがファイルやディレクトリとやり取りできるかを規定します。 |
− | {{Warning|パーミッション |
+ | {{Warning|セキュリティ目的で使用する場合、パーミッションと属性は、起動済みのシステムからの攻撃しか防御しません。マシンへ物理的にアクセスできる攻撃者からデータを保護するには、[[ディスク暗号化]]も施さなければなりません。}} |
== パーミッションの表示 == |
== パーミッションの表示 == |
||
− | [[ |
+ | [[ls]] コマンドの {{ic|-l}} オプションを使えば、ディレクトリのコンテンツのパーミッション ('''ファイルのモード''' とも) を確認できます。例: |
{{hc|$ ls -l /path/to/directory| |
{{hc|$ ls -l /path/to/directory| |
||
total 128 |
total 128 |
||
− | drwxr-xr-x 2 archie |
+ | drwxr-xr-x 2 archie archie 4096 Jul 5 21:03 Desktop |
− | drwxr-xr-x 6 archie |
+ | drwxr-xr-x 6 archie archie 4096 Jul 5 17:37 Documents |
− | drwxr-xr-x 2 archie |
+ | drwxr-xr-x 2 archie archie 4096 Jul 5 13:45 Downloads |
− | -rw-rw-r-- 1 archie |
+ | -rw-rw-r-- 1 archie archie 5120 Jun 27 08:28 customers.ods |
− | -rw-r--r-- 1 archie |
+ | -rw-r--r-- 1 archie archie 3339 Jun 27 08:28 todo |
− | -rwxr-xr-x 1 archie |
+ | -rwxr-xr-x 1 archie archie 2048 Jul 6 12:56 myscript.sh |
}} |
}} |
||
− | + | 1番目の列に注目してください。例えば {{ic|drwxrwxrwx+}} という値であれば、それぞれの文字の意味は以下の様のようになります: |
|
{| class="wikitable" |
{| class="wikitable" |
||
38行目: | 42行目: | ||
| {{ic|+}} |
| {{ic|+}} |
||
|- |
|- |
||
− | | ファイルの |
+ | | ファイルの種類。技術的にはパーミッションの一部ではありません。ここに入りうる値の説明は {{ic|info ls -n "What information is listed"}} を参照してください。 |
− | | ファイル |
+ | | このファイルに対して所有者が持っているパーミッション。以下で説明されています。 |
− | | ファイル |
+ | | このファイルに対してグループが持っているパーミッション。以下で説明されています。 |
− | | ファイルの |
+ | | このファイルに対してその他のユーザが持っているパーミッション。以下で説明されています。 |
− | | |
+ | | 代替のアクセス手法がこのファイルに対して適用されているかどうかを示す単一の文字。この文字が空白ならば、代替のアクセス手法は適用されていません。{{ic|.}} 文字の場合は、ファイルにセキュリティコンテキストが存在しているが、代替のアクセス手法は適用されていないことを示します。代替のアクセス手法がその他の組み合わせで適用されているファイルでは、{{ic|+}} 文字で表されます。例えば、[[アクセス制御リスト]]の場合です。 |
|} |
|} |
||
− | + | 3つの文字からなるパーミッション (上記の例では {{ic|rwx}}) には、以下の文字のどれかが入ります: |
|
{| class="wikitable" |
{| class="wikitable" |
||
! scope="col" style="width: 10%;" | |
! scope="col" style="width: 10%;" | |
||
! scope="col" style="width: 10%;" | 文字 |
! scope="col" style="width: 10%;" | 文字 |
||
− | ! scope="col" style="width: 30%;" | ファイル |
+ | ! scope="col" style="width: 30%;" | ファイルに対する効果 |
− | ! scope="col" style="width: 50%;" | ディレクトリ |
+ | ! scope="col" style="width: 50%;" | ディレクトリに対する効果 |
|- |
|- |
||
− | ! rowspan="2" style="text-align:left;" | 読み取り |
+ | ! rowspan="2" style="text-align:left;" | 読み取りパーミッション (最初の文字) |
| style="text-align:center;" | {{ic|-}} |
| style="text-align:center;" | {{ic|-}} |
||
− | | ファイル |
+ | | ファイルは読めません。 |
− | | ディレクトリの中身 |
+ | | ディレクトリの中身は表示できません。 |
|- |
|- |
||
| style="text-align:center;" | {{ic|r}} |
| style="text-align:center;" | {{ic|r}} |
||
− | | ファイルを読 |
+ | | ファイルを読むことができます。 |
− | | ディレクトリの中身を表示 |
+ | | ディレクトリの中身を表示できます。 |
|- |
|- |
||
− | ! rowspan="2" style="text-align:left;" | 書き込み |
+ | ! rowspan="2" style="text-align:left;" | 書き込みパーミッション (2番目の文字) |
| style="text-align:center;" | {{ic|-}} |
| style="text-align:center;" | {{ic|-}} |
||
− | | ファイル |
+ | | ファイルは変更できません。 |
− | | ディレクトリの中身 |
+ | | ディレクトリの中身は変更できません。 |
|- |
|- |
||
| style="text-align:center;" | {{ic|w}} |
| style="text-align:center;" | {{ic|w}} |
||
− | | ファイルを変更 |
+ | | ファイルを変更できます。 |
− | | ディレクトリの中身を変更 |
+ | | ディレクトリの中身を変更できます (ここでの変更とは、新しいファイルやディレクトリの作成、既存のファイルやディレクトリの名称変更や削除です)。ただし、実行パーミッションも設定されていなければなりません。さもないと、このパーミッションは効果を持ちません。 |
|- |
|- |
||
− | ! rowspan="6" style="text-align:left;" | 実行 |
+ | ! rowspan="6" style="text-align:left;" | 実行パーミッション (3番目の文字) |
| style="text-align:center;" | {{ic|-}} |
| style="text-align:center;" | {{ic|-}} |
||
− | | ファイル |
+ | | ファイルは実行できません。 |
− | | ディレクトリ |
+ | | ディレクトリは [[cd]] でアクセスできません。 |
|- |
|- |
||
| style="text-align:center;" | {{ic|x}} |
| style="text-align:center;" | {{ic|x}} |
||
| ファイルを実行できます。 |
| ファイルを実行できます。 |
||
− | | ディレクトリ |
+ | | ディレクトリに [[cd]] でアクセスできます。これは、親ディレクトリから事実上 "継承している" とみなすことのできる唯一のパーミッションビットです。事実、親ディレクトリの''どれか1つでも'' {{ic|x}} が設定されていないと、パスの最後のファイルやディレクトリにも (それのパーミッションに依らず) アクセスできません。詳細は {{man|7|path_resolution}} を参照してください。 |
|- |
|- |
||
| style="text-align:center;" | {{ic|s}} |
| style="text-align:center;" | {{ic|s}} |
||
− | | colspan="2" | '''u'''ser の |
+ | | colspan="2" | ユーザ ('''u'''ser) のパーミッションにある場合は [[w:ja:setuid|setuid]] ビット、グループ ('''g'''roup) のパーミッションにある場合は '''setgid''' ビットとなります。その他のユーザ ('''o'''thers) のパーミッションには現れません。この文字は、{{ic|x}} も設定されていることを意味します。 |
|- |
|- |
||
| style="text-align:center;" | {{ic|S}} |
| style="text-align:center;" | {{ic|S}} |
||
− | | colspan="2" | {{ic|s}} と同じですが、{{ic|x}} は設定されていません。通常のファイルで使われ |
+ | | colspan="2" | {{ic|s}} と同じですが、{{ic|x}} は設定されていません。通常のファイルで使われることは滅多になく、ディレクトリでは意味がありません。 |
|- |
|- |
||
| style="text-align:center;" | {{ic|t}} |
| style="text-align:center;" | {{ic|t}} |
||
− | | colspan="2" | [[ |
+ | | colspan="2" | [[w:ja:スティッキービット|スティッキービット]]です。その他のユーザ ('''o'''thers) のパーミッションにしか現れません。この文字は、{{ic|x}} も設定されていることを意味します。 |
|- |
|- |
||
| style="text-align:center;" | {{ic|T}} |
| style="text-align:center;" | {{ic|T}} |
||
− | | colspan="2" | {{ic|t}} と同じですが、{{ic|x}} は設定されていません。通常のファイルで使われ |
+ | | colspan="2" | {{ic|t}} と同じですが、{{ic|x}} は設定されていません。通常のファイルで使われることは滅多にありません。 |
|} |
|} |
||
− | 詳 |
+ | 詳細は {{ic|info Coreutils -n "Mode Structure"}} と {{man|1|chmod}} を見てください。 |
+ | |||
+ | {{Tip|{{ic|namei -l ''path''}} を使えば、パスと一緒にパーミッションを表示できます。}} |
||
=== サンプル === |
=== サンプル === |
||
− | いくつか例を見て |
+ | いくつか例を見て、理解を深めましょう: |
− | '''drwx------''' 6 archie |
+ | '''drwx------''' 6 archie archie 4096 Jul 5 17:37 Documents |
− | 上記の場合 |
+ | 上記の場合、Archie は {{ic|Documents}} ディレクトリへの完全なアクセス権を持っています。Archie は、Documents 内のファイルを (そのファイルのパーミッションに依らず) 一覧表示、名称変更、削除することができ、さらにファイルを Documents 内に作成することができます。しかし、ファイル自体にアクセス (つまり、読み書き実行) できるかどうかは、そのファイルのパーミッションに依ります。 |
− | '''dr-x------''' 6 archie |
+ | '''dr-x------''' 6 archie archie 4096 Jul 5 17:37 Documents |
− | Archie はファイル |
+ | Archie はファイルの作成、名称変更、削除ができませんが、それ以外なら可能です。Archie は Documents 内のファイルを一覧表示することができ、Documents 内のファイルに (そのファイルのパーミッションで許可されているならば) アクセスできます。 |
− | '''d-wx------''' 6 archie |
+ | '''d-wx------''' 6 archie archie 4096 Jul 5 17:37 Documents |
− | Archie は Documents |
+ | Archie は {{ic|Documents}} ディレクトリ内で {{ic|ls}} を実行することができませんが、ディレクトリ内の特定のファイルの名前を知っているならば、そのファイルを一覧表示、名称変更、削除することができ、さらに (そのファイルのパーミッションで許可されているならば) アクセスすることができます。また、新しいファイルを作成することもできます。 |
− | '''d--x------''' 6 archie |
+ | '''d--x------''' 6 archie archie 4096 Jul 5 17:37 Documents |
− | Documents |
+ | Archie は、{{ic|Documents}} ディレクトリ内のファイルのうち、名前を知っているものにアクセスすることしかできません (ただし、そのファイルのパーミッションで許可されている場合に限る)。ディレクトリ内のファイルを一覧表示することはできず、ファイルの作成、名称変更、削除もできません。 |
ここで説明しているのはディレクトリのパーミッションであり、個々のファイルのパーミッションとは関係がありません。新しくファイルを作成したとき、変更があるのはディレクトリです。したがってディレクトリの書き込み権限が必要となります。 |
ここで説明しているのはディレクトリのパーミッションであり、個々のファイルのパーミッションとは関係がありません。新しくファイルを作成したとき、変更があるのはディレクトリです。したがってディレクトリの書き込み権限が必要となります。 |
||
119行目: | 125行目: | ||
今度はディレクトリではなくファイルの例を見てみましょう: |
今度はディレクトリではなくファイルの例を見てみましょう: |
||
− | '''-rw-r--r--''' 1 archie |
+ | '''-rw-r--r--''' 1 archie web 5120 Jun 27 08:28 foobar |
− | 上記の例では最初の文字が {{ic|d}} ではなく {{ic|-}} になっていることが確認できます。 |
+ | 上記の例では最初の文字が {{ic|d}} ではなく {{ic|-}} になっていることが確認できます。なので、これはディレクトリではなくファイルであることを知ることができます。次に所有者のパーミッションは {{ic|rw-}} なので所有者はファイルの読み書きができますが実行することはできません。所有者が3つのパーミッション全てを得ていないことはおかしく思えるかもしれませんが、{{ic|x}} パーミッションは Gedit や [[Emacs]] などのテキストエディタから読むテキストファイル、あるいは [[R]] などのソフトウェアから読み込むデータファイルでは必要ないパーミッションです (python のコードなどが入っている場合は実行権限が与えられることがあります)。グループのパーミッションは {{ic|r--}} に設定されており、所有グループはファイルを読むことはできても編集することができません。何かを読み取り専用に設定することは重要です。他のユーザーのパーミッションはグループと同じに設定されています。 |
− | == パーミッション |
+ | == パーミッションの変更 == |
− | [[Wikipedia:chmod|chmod]] は Linux などの Unix ライクなオペレーティングシステムで使われるコマンドで、ファイルやディレクトリのパーミッション ( |
+ | [[Wikipedia:ja:chmod|chmod]] は Linux などの Unix ライクなオペレーティングシステムで使われるコマンドで、ファイルやディレクトリのパーミッション (アクセスモード (''mod''e) とも) を変更 (''ch''ange) することができます。 |
− | === |
+ | === 文字を使う方法 === |
− | ファイルのパーミッション ( |
+ | ファイルのパーミッション (''アクセスモード'' とも) を変更するにはターミナルで ''chmod'' コマンドを使います。以下はコマンドの一般的な使い方です: |
− | chmod ''who''='' |
+ | chmod ''who''=''パーミッション'' ''ファイル名'' |
− | {{ic|''who''}} はパーミッションを与える対象を指定する文字です。以下のどれかになります: |
+ | {{ic|''who''}} は、パーミッションを与える対象を指定する文字です。以下のどれかになります: |
− | * {{ic|u}}: ファイルを所有する[[ |
+ | * {{ic|u}}: そのファイルを所有する[[ユーザー]]。 |
− | * {{ic|g}}: ファイルが所属する[[ユーザー |
+ | * {{ic|g}}: そのファイルが所属する[[ユーザーグループ]]。 |
− | * {{ic|o}}: 他 ('''o'''ther) のユーザー。つまり、全 |
+ | * {{ic|o}}: その他 ('''o'''ther) のユーザー。つまり、その他全員。 |
− | * {{ic|a}}: 上記 |
+ | * {{ic|a}}: 上記全て。{{ic|ugo}} と入力する代わりとして使えます。 |
− | + | ここでのパーミッションとは、[[#パーミッションの表示]] で説明しているのと同じです ({{ic|r}}、{{ic|w}}、{{ic|x}})。 |
|
− | それではコマンドを使用例を見てみましょう。Documents |
+ | それではコマンドを使用例を見てみましょう。Documents ドキュメントを守るために、このディレクトリであなた以外の全員が読み書きと実行 (この場合は検索ともいえます) を行えないようにするには: |
− | + | 前: {{ic|drwxr-xr-x 6 archie web 4096 Jul 5 17:37 Documents}} |
|
$ chmod g= Documents |
$ chmod g= Documents |
||
$ chmod o= Documents |
$ chmod o= Documents |
||
− | + | 後: {{ic|drwx------ 6 archie web 4096 Jul 6 17:32 Documents}} |
|
上記ではパーミッションを取り去るために、{{ic|1==}} の後に何も文字を入力していません。所有者のパーミッションだけ {{ic|rwx}} となり、他のパーミッションは全て {{ic|-}} に変更されたことが確認できます。 |
上記ではパーミッションを取り去るために、{{ic|1==}} の後に何も文字を入力していません。所有者のパーミッションだけ {{ic|rwx}} となり、他のパーミッションは全て {{ic|-}} に変更されたことが確認できます。 |
||
155行目: | 161行目: | ||
上記の設定は以下のコマンドで元に戻すことができます: |
上記の設定は以下のコマンドで元に戻すことができます: |
||
− | + | 前: {{ic|drwx------ 6 archie web 4096 Jul 6 17:32 Documents}} |
|
$ chmod g=rx Documents |
$ chmod g=rx Documents |
||
$ chmod o=rx Documents |
$ chmod o=rx Documents |
||
− | + | 後: {{ic|drwxr-xr-x 6 archie web 4096 Jul 6 17:32 Documents}} |
|
− | グループと他のユーザ |
+ | 次の例では、グループとその他のユーザに対して読み込みと実行のパーミッションを与えてみます。つまり、{{ic|1==}} の後にパーミッションの文字 ({{ic|r}} と {{ic|x}}) を入れます (スペース無しで)。 |
− | {{ic|''who''}} に複数の文字を入力することで |
+ | {{ic|''who''}} に複数の文字を入力することで、これを行うことができます。例えば: |
$ chmod go=rx Documents |
$ chmod go=rx Documents |
||
− | {{Note| |
+ | {{Note|{{ic|chmod}} コマンドで {{ic|''who''}} に入力する文字やパーミッション文字の順番は特に意味をなしません: {{ic|1=chmod go=rx file}} でも {{ic|1=chmod og=xr file}} でも全く同じ意味になります。}} |
− | 次に、2番目の例を考えてみましょう。たとえば、{{ic|foobar}} ファイルを変更して、読み取りと書き込みのアクセス許可を与え、 |
+ | 次に、2番目の例を考えてみましょう。たとえば、{{ic|foobar}} ファイルを変更して、読み取りと書き込みのアクセス許可を与え、{{ic|web}} グループの同僚が作業している可能性があると仮定します。{{ic|foobar}} は読み取りと書き込みもできますが、他のユーザーは読み取りしかできません: |
− | + | 前: {{ic|-rw-r--r-- 1 archie web 5120 Jun 27 08:28 foobar}} |
|
$ chmod g=rw foobar |
$ chmod g=rw foobar |
||
− | + | 後: {{ic|-rw-rw-r-- 1 archie web 5120 Jun 27 08:28 foobar}} |
|
− | これは最初の例とまったく同じですが、ディレクトリではなくファイルを使用し、書き込み権限を付与します |
+ | これは最初の例とまったく同じですが、ディレクトリではなくファイルを使用し、書き込み権限を付与します (権限を付与する例を全て示すため)。 |
− | ==== |
+ | ==== 文字を使う方法のショートカット ==== |
''chmod'' コマンドでは {{ic|1==}} の代わりに {{ic|+}} または {{ic|-}} を使うことでパーミッションを追加したり削除することができます。上記のコマンドのようにパーミッションを完全に書き換えることがありません (例えば、パーミッションを {{ic|r--}} から {{ic|rw-}} に変更する場合でも上記のコマンドを使うときは ''chmod'' コマンドの {{ic|1==}} の後に {{ic|w}} だけでなく {{ic|r}} も必要です。{{ic|r}} を指定しなかった場合、{{ic|r}} のパーミッションが消えてしまいます。{{ic|+}} と {{ic|-}} を使うことで現在のパーミッションから一部のパーミッションを追加したり削除することができるようになります)。 |
''chmod'' コマンドでは {{ic|1==}} の代わりに {{ic|+}} または {{ic|-}} を使うことでパーミッションを追加したり削除することができます。上記のコマンドのようにパーミッションを完全に書き換えることがありません (例えば、パーミッションを {{ic|r--}} から {{ic|rw-}} に変更する場合でも上記のコマンドを使うときは ''chmod'' コマンドの {{ic|1==}} の後に {{ic|w}} だけでなく {{ic|r}} も必要です。{{ic|r}} を指定しなかった場合、{{ic|r}} のパーミッションが消えてしまいます。{{ic|+}} と {{ic|-}} を使うことで現在のパーミッションから一部のパーミッションを追加したり削除することができるようになります)。 |
||
186行目: | 192行目: | ||
前記のグループに書き込みパーミッションを与える例を {{ic|+}} と {{ic|-}} で試してみましょう: |
前記のグループに書き込みパーミッションを与える例を {{ic|+}} と {{ic|-}} で試してみましょう: |
||
− | + | 前: {{ic|-rw-r--r-- 1 archie web 5120 Jun 27 08:28 foobar}} |
|
$ chmod g+w foobar |
$ chmod g+w foobar |
||
− | + | 後: {{ic|-rw-rw-r-- 1 archie web 5120 Jun 27 08:28 foobar}} |
|
また、全てのユーザー ('''a''') から書き込み権限を奪いたい場合: |
また、全てのユーザー ('''a''') から書き込み権限を奪いたい場合: |
||
− | + | 前: {{ic|-rw-rw-r-- 1 archie web 5120 Jun 27 08:28 foobar}} |
|
$ chmod a-w foobar |
$ chmod a-w foobar |
||
− | + | 後: {{ic|-r--r--r-- 1 archie web 5120 Jun 27 08:28 foobar}} |
|
− | 別のショートカットは特殊な {{ic|X}} モードです。これは実際のファイルモードではありませんが、多くの場合、{{ic|-R}} オプションと組み合わせて使用され、ディレクトリに対してのみ実行可能ビットを設定し、通常のファイルに対しては変更しないでおきます。たとえば、次のようになります |
+ | 別のショートカットは特殊な {{ic|X}} モードです。これは実際のファイルモードではありませんが、多くの場合、{{ic|-R}} オプションと組み合わせて使用され、ディレクトリに対してのみ実行可能ビットを設定し、通常のファイルに対しては変更しないでおきます。たとえば、次のようになります: |
$ chmod -R a+rX ./data/ |
$ chmod -R a+rX ./data/ |
||
206行目: | 212行目: | ||
==== パーミッションのコピー ==== |
==== パーミッションのコピー ==== |
||
− | '' |
+ | ''chmod'' で、あるクラスから別のクラスにパーミッションをコピーすることも可能です (例えば、所有者のパーミッションをグループにコピーする)。そうするには、{{ic|1==}} の後に、{{ic|r}} や {{ic|w}}、{{ic|x}} ではなく、もう一つの ''who'' 文字を入れてください。例えば: |
− | + | 前: {{ic|-rw-r--r-- 1 archie web 5120 Jun 27 08:28 foobar}} |
|
$ chmod g=u foobar |
$ chmod g=u foobar |
||
− | + | 後: {{ic|-rw-rw-r-- 1 archie web 5120 Jun 27 08:28 foobar}} |
|
− | このコマンドは基本的に、 |
+ | このコマンドは基本的に、"グループのアクセス許可を変更 ({{ic|1=g=}}) して、所有ユーザー ({{ic|1==u}}) と同じにします。ただし、パーミッションのセットをコピーして、なおかつ新しいパーミッションを付与するというようなことはできません。例えば: |
$ chmod g=wu foobar |
$ chmod g=wu foobar |
||
− | + | この場合、''chmod'' はエラーを吐きます。 |
|
=== 数字を使う方法 === |
=== 数字を使う方法 === |
||
224行目: | 230行目: | ||
''chmod'' では数字を使ってパーミッションを設定することもできます。 |
''chmod'' では数字を使ってパーミッションを設定することもできます。 |
||
− | 数字を使 |
+ | 数字を使えば、所有者、グループ、そしてその他のユーザのパーミッション全て、さらに setuid、setgid、そしてスティッキービットも一度に設定できます。基本的な使い方は以下のとおりです: |
− | $ chmod ''xxx'' '' |
+ | $ chmod ''xxx'' ''ファイル名'' |
− | {{ic|'''xxx'''}} は3桁の数字 |
+ | ここで、{{ic|'''xxx'''}} は3桁の数字で、各桁は0から7までのどれかです。最初の桁は所有者のパーミッション、2桁目はグループのパーミッション、そして3桁目はその他のユーザのパーミッションです。 |
− | + | この数字表記では、{{ic|r}}、{{ic|w}}、そして {{ic|x}} はそれぞれ独自の数字を持ちます: |
|
r=4 |
r=4 |
||
236行目: | 242行目: | ||
x=1 |
x=1 |
||
+ | 3桁の数字を計算するには、所有者、グループ、そしてユーザーにどのようなアクセス許可を付与するかを検討し、それらの値を合計する必要があります。例えば、ディレクトリの所有者には読み書きと実行のパーミッション、グループとその他のユーザには読み込みと実行のパーミッションのみを与える場合、数字は以下のようになります: |
||
− | To come up with a 3-digit number you need to consider what permissions you want owner, group, and user to have, and then total their values up. For example, if you want to grant the owner of a directory read write and execution permissions, and you want group and everyone else to have just read and execute permissions, you would come up with the numerical values like so: |
||
− | * |
+ | * 所有者: {{ic|rwx}}=4+2+1=7 |
− | * |
+ | * グループ: {{ic|r-x}}=4+0+1=5 |
− | * |
+ | * その他: {{ic|r-x}}=4+0+1=5 |
− | $ chmod 755 '' |
+ | $ chmod 755 ''ファイル名'' |
+ | これは、以下の2つのコマンドを実行したときと等価です: |
||
− | This is the equivalent of using the following: |
||
− | $ chmod u=rwx '' |
+ | $ chmod u=rwx ''ファイル名'' |
− | $ chmod go=rx '' |
+ | $ chmod go=rx ''ファイル名'' |
+ | ファイルやディレクトリのパーミッションを数字形式で見るには、{{man|1|stat}} コマンドを使ってください: |
||
− | Most folders and directories are set to {{ic|755}} to allow reading, writing and execution to the owner, but deny writing to everyone else, and files are normally {{ic|644}} to allow reading and writing for the owner but just reading for everyone else; refer to the last note on the lack of {{ic|x}} permissions with non executable files: it is the same thing here. |
||
+ | $ stat -c %a ''filename'' |
||
− | To see this in action with examples consider the previous example that has been used but with this numerical method applied instead: |
||
+ | %a オプションは出力を数字形式にするという意味です。 |
||
− | ビフォー: {{ic|-rw-r--r-- 1 archie users 5120 Jun 27 08:28 foobar}} |
||
+ | |||
+ | ほとんどのフォルダとディレクトリは {{ic|755}} に設定され、所有者には読み取り、書き込み、実行を許可しますが、それ以外のすべてのユーザーには書き込みを拒否します。ファイルは通常 {{ic|644}} で、所有者には読み取りと書き込みを許可しますが、他のすべてのユーザーには読み取りだけを許可します。実行可能ファイル以外では {{ic|x}} パーミッションがないという最後のノートを参照してください。ここでも同じです。 |
||
+ | |||
+ | 理解するために、数字形式を使って前回の例と同じことをしてみましょう: |
||
+ | |||
+ | 前: {{ic|-rw-r--r-- 1 archie web 5120 Jun 27 08:28 foobar}} |
||
$ chmod 664 foobar |
$ chmod 664 foobar |
||
− | + | 後: {{ic|-rw-rw-r-- 1 archie web 5120 Jun 27 08:28 foobar}} |
|
+ | 所有者とグループに実行パーミッションを与えたい場合、数字は {{ic|774}} になります。全員に読み込みパーミッションのみを与えたい場合は、{{ic|444}} になります。{{ic|chmod ''xxx'' ''filename''}} で使うための数字を計算する最も簡単な方法は、{{ic|r}} を 4、{{ic|w}} を 2、{{ic|x}} を 1 として扱うことでしょう。しかし、それぞれのパーミッションを2進数として扱い、その後で数字に変換する方法もあります。この方法は少し複雑ですが、完全を期すために言及しておきましょう。 |
||
− | If this were an executable the number would be {{ic|774}} if you wanted to grant executable permission to the owner and group. Alternatively if you wanted everyone to only have read permission the number would be {{ic|444}}. Treating {{ic|r}} as 4, {{ic|w}} as 2, and {{ic|x}} as 1 is probably the easiest way to work out the numerical values for using {{ic|chmod ''xxx'' ''filename''}}, but there is also a binary method, where each permission has a binary number, and then that is in turn converted to a number. It is a bit more convoluted, but here included for completeness. |
||
+ | 以下のパーミッション組を考えてみましょう: |
||
− | Consider this permission set: |
||
-rwxr-xr-- |
-rwxr-xr-- |
||
+ | 与えるパーミッションに1を、与えないパーミッションに0を置くと、以下のようになります: |
||
− | If you put a 1 under each permission granted, and a 0 for every one not granted, the result would be something like this: |
||
-rwxrwxr-x |
-rwxrwxr-x |
||
111111101 |
111111101 |
||
+ | そして、これらの2進数を変換します: |
||
− | You can then convert these binary numbers: |
||
000=0 100=4 |
000=0 100=4 |
||
277行目: | 289行目: | ||
011=3 111=7 |
011=3 111=7 |
||
+ | よって、結果は 775 となります。 |
||
− | The value of the above would therefore be 775. |
||
+ | グループから書き込みパーミッションを取り除いてみましょう: |
||
− | Consider we wanted to remove the writable permission from group: |
||
-rwxr-xr-x |
-rwxr-xr-x |
||
111101101 |
111101101 |
||
+ | よって、結果は 755 となり、書き込みパーミッションを取り除くには {{ic|chmod 755 ''filename''}} を実行すれば良いことになります。どの方法をとっても同じ3桁の数字が得られます。文字を使うか数字を使うかは個人の好みと入力速度に依ります。ディレクトリやファイルのパーミッションをデフォルトに戻したい場合 (例えば、所有者に読み書き (と実行権限) を与え、それ以外には書き込み権限を与えない)、{{ic|chmod 755/644 ''filename''}} を使うほうが速いかもしれません。しかし、通常とは異なるパーミッションに変更する場合は、パーミッションを数字に変換するよりも、文字を使う方法をとったほうがシンプルで速いかもしれません (それに、数字を使う方法は間違いを犯す可能性があります)。たまにしか ''chmod'' を使わないユーザにとっては、どちらの方法をとったとしても対して速度に違いはないという主張もあるでしょう。 |
||
− | The value would therefore be 755 and you would use {{ic|chmod 755 ''filename''}} to remove the writable permission. You will notice you get the same three digit number no matter which method you use. Whether you use text or numbers will depend on personal preference and typing speed. When you want to restore a directory or file to default permissions e.g. read and write (and execute) permission to the owner but deny write permission to everyone else, it may be faster to use {{ic|chmod 755/644 ''filename''}}. However if you are changing the permissions to something out of the norm, it may be simpler and quicker to use the text method as opposed to trying to convert it to numbers, which may lead to a mistake. It could be argued that there is not any real significant difference in the speed of either method for a user that only needs to use ''chmod'' on occasion. |
||
− | 数字を使 |
+ | 数字を使えば、4桁で {{ic|setuid}} ビット、{{ic|setgid}} ビット、そして {{ic|sticky}} ビットも設定できます。 |
setuid=4 |
setuid=4 |
||
292行目: | 304行目: | ||
sticky=1 |
sticky=1 |
||
− | 例えば |
+ | 例えば、{{ic|chmod 2777 ''filename''}} は、全員に対して読み/書き/実行ビットを設定し、さらに {{ic|setgid}} ビットも有効化します。 |
=== まとめて chmod === |
=== まとめて chmod === |
||
− | + | 一般に、ディレクトリとファイルの両方に同じパーミッションを設定することはありません。ディレクトリツリー内のパーミッションを一括で変更する必要がある場合は、[[find]] を使って選択的に修正してください。 |
|
− | ディレクトリだけを 755 に |
+ | ディレクトリのパーミッションだけを 755 に変更するには: |
− | $ find '' |
+ | $ find ''ディレクトリ'' -type d -exec chmod 755 {} + |
− | ファイルだけを 644 に |
+ | ファイルのパーミッションだけを 644 に変更するには: |
− | $ find '' |
+ | $ find ''ディレクトリ'' -type f -exec chmod 644 {} + |
− | == 所有者 |
+ | == 所有者の変更 == |
− | [[Wikipedia:chown|chown]] はファイルやディレクトリの所有者を変更します。場合によってはパーミッションの変更よりも簡単です。 |
+ | [[Wikipedia:ja:chown|chown]] はファイルやディレクトリの所有者を変更します。これは、場合によってはパーミッションの変更よりも速くて簡単です。 |
− | 以下の例では、[[GParted]] を使ってバックアップデータ用 |
+ | 以下の例では、[[GParted]] を使ってバックアップデータ用の新しいパーティションを作成しています。Gparted はデフォルトで全てを root として実行するため、ファイルの所有者が全て root になります。これ自体は全く問題ないのですが、マウントされたパーティションにデータを書き込むとなると、通常ユーザはアクセスが拒否されてしまいます。 |
brw-rw---- 1 root disk 8, 9 Jul 6 16:02 sda9 |
brw-rw---- 1 root disk 8, 9 Jul 6 16:02 sda9 |
||
drwxr-xr-x 5 root root 4096 Jul 6 16:01 Backup |
drwxr-xr-x 5 root root 4096 Jul 6 16:01 Backup |
||
− | + | 見ての通り、{{ic|/dev}} 内のデバイスは root によって所有されており、それはマウントポイント ({{ic|/media/Backup}}) でも然りです。以下を実行することで、マウントポイントの所有者を変更することができます: |
|
− | + | 前: {{ic|drwxr-xr-x 5 root root 4096 Jul 6 16:01 Backup}} |
|
# chown archie /media/Backup |
# chown archie /media/Backup |
||
− | + | 後: {{ic|drwxr-xr-x 5 archie root 4096 Jul 6 16:01 Backup}} |
|
+ | これで、パーミッションを変更することなく、新しい所有者である archie がこのパーティションにデータを書き込めるようになりました (所有者のパーミッションは {{ic|rwx}} であるため)。 |
||
− | Now the partition can have data written to it by the new owner, archie, without altering the permissions (as the owner triad already had {{ic|rwx}} permissions). |
||
{{Note| |
{{Note| |
||
− | * {{ic|chown}} は常に setuid と setgid ビットを消去します。 |
+ | * {{ic|chown}} は常に setuid と setgid のビットを消去します。 |
− | * root 以外のユーザ |
+ | * root 以外のユーザは {{ic|chown}} を使って自身のファイルを他のユーザに「渡す」ことはできません。 |
}} |
}} |
||
== アクセス制御リスト == |
== アクセス制御リスト == |
||
− | [[アクセス制御リスト]]は |
+ | [[アクセス制御リスト]]は、任意のユーザやグループに対するパーミッションをファイルに設定できるようにすることで、ファイルシステムに柔軟なパーミッション機構を追加します。 |
− | |||
− | アクセス制御リストがあるかどうかは [[アクセス制御リスト#ls コマンドの出力|ls コマンドの出力]]にプラス記号 ({{ic|+}}) があるかで確認できます。 |
||
== Umask == |
== Umask == |
||
342行目: | 352行目: | ||
== ファイルの属性 == |
== ファイルの属性 == |
||
− | [[ユーザーとグループ|ユーザーやグループ]]の読み書きや実行権限を制御するファイルモードビットとは別に、ファイル操作の可否を細かくカスタマイズするためのファイル属性を[[ファイルシステム]]がサポートしている場合があり |
+ | [[ユーザーとグループ|ユーザーやグループ]]の読み書きや実行権限を制御するファイルモードビットとは別に、ファイル操作の可否を細かくカスタマイズするためのファイル属性を[[ファイルシステム]]がサポートしている場合があります。 |
− | {{Warning|デフォルトでは、[[ |
+ | {{Warning|デフォルトでは、[[cp]]、[[rsync]]、そしてその他の似たようなプログラムはファイルの属性を保持しません。}} |
+ | {{Pkg|e2fsprogs}} パッケージには、{{man|1|lsattr}} と {{man|1|chattr}} というプログラムが含まれています。前者はファイルの属性を一覧表示し、後者は属性を変更します。 |
||
− | === chattr と lsattr === |
||
+ | いくつか便利な属性があります。全てのファイルシステムが以下の全てをサポートしているわけではありません。 |
||
− | ext2 や [[ext3]] ファイルシステムでは、{{Pkg|e2fsprogs}} パッケージに [[Wikipedia:lsattr|lsattr]] と [[Wikipedia:chattr|chattr]] というプログラムが含まれており、ファイルの属性を確認したり変更することができます。全てのファイルシステムで反映されるわけではありませんが、以下の属性を使用することができます: |
||
+ | * {{ic|a}} - 追加のみ: ファイルは追加 (append) 専用でしか開けなくなります。 |
||
− | * {{ic|a}}: 追記のみ |
||
+ | * {{ic|c}} - 圧縮済み: ファイルに対してファイルシステムレベルでの圧縮を有効化します。 |
||
− | * {{ic|c}}: 圧縮 |
||
+ | * {{ic|i}} - 変更不可: 変更、削除、名称変更が禁止され、さらにそのファイルにリンクを張ることができなくなります。root のみがこれを設定できます。 |
||
− | * {{ic|d}}: ダンプしない |
||
+ | * {{ic|j}} - データのジャーナリング: ファイルデータの書き込みとメタデータに対して[[ファイルシステム#ジャーナリング|ジャーナル]]を使用します。 |
||
− | * {{ic|e}}: 拡張フォーマット |
||
+ | * {{ic|m}} - 圧縮をしない: ファイルに対してファイルシステムレベルでの圧縮を無効化します。 |
||
− | * {{ic|i}}: 変更不可 |
||
+ | * {{ic|A}} - atime を更新しない: ファイルの atime が変更されなくなります。 |
||
− | * {{ic|j}}: データのジャーナリング |
||
+ | * {{ic|C}} - コピーオンライトをしない: コピーオンライトを無効化します (ファイルシステムがコピーオンライトをサポートしている場合)。 |
||
− | * {{ic|s}}: 安全な消去 |
||
− | * {{ic|t}}: 末尾のマージをしない |
||
− | * {{ic|u}}: 削除不可 |
||
− | * {{ic|A}}: アクセス日時を更新しない |
||
− | * {{ic|C}}: コピーオンライトしない |
||
− | * {{ic|D}}: ディレクトリの同期更新 |
||
− | * {{ic|S}}: 同期更新 |
||
− | * {{ic|T}}: ディレクトリ階層のトップ |
||
+ | 属性の完全なリストとそれぞれの属性の詳細は {{man|1|chattr}} を参照してください。 |
||
− | 例えば、特定のファイルに変更不可ビットを設定したい場合、次のコマンドを使用: |
||
+ | |||
+ | 例えば、とあるファイルに変更不可のビットを設定したい場合は、以下のコマンドを使用してください: |
||
# chattr +i ''/path/to/file'' |
# chattr +i ''/path/to/file'' |
||
− | ファイルから属性を |
+ | ファイルから属性を取り除くには、{{ic|+}} を {{ic|-}} に変更してください。 |
== 拡張属性 == |
== 拡張属性 == |
||
+ | [[拡張属性]] を見てください。 |
||
− | {{man|5|attr}} より: "拡張属性とはファイルやディレクトリに関連付けられる name:value のペアである。拡張属性には4つのクラスがある: security, system, trusted, user"。 |
||
− | |||
− | {{Warning|デフォルトでは、[[Core Utilities|cp]] や [[rsync]] などのプログラムは拡張属性までコピーしません。}} |
||
− | |||
− | === ユーザー拡張属性 === |
||
− | |||
− | ユーザー拡張属性を使うことでファイルに任意の情報を保存できます。ユーザー拡張属性を作成するには: |
||
− | |||
− | $ setfattr -n user.checksum -v "3baf9ebce4c664ca8d9e5f6314fb47fb" foo.bar |
||
− | |||
− | 拡張属性を表示するには getfattr を使用: |
||
− | |||
− | {{hc|$ getfattr -d foo.bar|2= |
||
− | # file: foo.bar |
||
− | user.checksum="3baf9ebce4c664ca8d9e5f6314fb47fb"}} |
||
− | |||
− | === ケイパビリティ === |
||
− | |||
− | 拡張属性は[[ケイパビリティ]]を設定するのにも使われます。 |
||
== ヒントとテクニック == |
== ヒントとテクニック == |
||
− | === |
+ | === Preserve root === |
{{ic|--preserve-root}} フラグを使うことで {{ic|chmod}} を {{ic|/}} で再帰的に実行してしまうことを防ぐことができます。システム全体から実行可能属性を取り除いてシステムが破壊されてしまう恐れがなくなります。フラグを毎回使いたい場合、[[エイリアス]]で設定すると良いでしょう。[https://www.reddit.com/r/linux/comments/4ni3xe/tifu_sudo_chmod_644/] も参照。 |
{{ic|--preserve-root}} フラグを使うことで {{ic|chmod}} を {{ic|/}} で再帰的に実行してしまうことを防ぐことができます。システム全体から実行可能属性を取り除いてシステムが破壊されてしまう恐れがなくなります。フラグを毎回使いたい場合、[[エイリアス]]で設定すると良いでしょう。[https://www.reddit.com/r/linux/comments/4ni3xe/tifu_sudo_chmod_644/] も参照。 |
||
401行目: | 388行目: | ||
== 参照 == |
== 参照 == |
||
− | * [[ |
+ | * [[Wikipedia:Chattr]] |
− | * [ |
+ | * [https://www.hackinglinuxexposed.com/articles/20030417.html Linux File Permission Confusion] |
− | * [ |
+ | * [https://www.hackinglinuxexposed.com/articles/20030424.html Linux File Permission Confusion part 2] |
+ | * [https://legacy-documentation.concrete5.org/tutorials/backup-and-restore-file-permissions-in-linux Backup and restore file permissions in Linux] |
||
− | * [[wikipedia:ja:拡張ファイル属性#Linux]] |
||
+ | * [https://serverfault.com/questions/364677/why-is-chmod-r-777-destructive Why is "chmod -R 777 /" destructive?] |
||
− | * [http://www.lesbonscomptes.com/pages/extattrs.html Extended attributes: the good, the not so good, the bad.] |
||
+ | * [https://web.archive.org/web/20210724233134/https://security.ias.edu/node/441 The How and Why of User Private Groups in Unix] |
||
− | * [http://www.concrete5.org/documentation/how-tos/designers/backup-and-restore-file-permissions-in-linux/ Backup and restore file permissions in Linux] |
||
+ | |||
− | * [https://serverfault.com/questions/364677/why-is-chmod-r-777-destructive Why is “chmod -R 777 /” destructive?] |
||
+ | {{TranslationStatus|File permissions and attributes|2023-08-15|785253}} |
2024年8月2日 (金) 12:04時点における最新版
ファイルシステムは、パーミッションと属性を使って、どの程度のレベルでシステムのプロセスがファイルやディレクトリとやり取りできるかを規定します。
目次
パーミッションの表示
ls コマンドの -l
オプションを使えば、ディレクトリのコンテンツのパーミッション (ファイルのモード とも) を確認できます。例:
$ ls -l /path/to/directory
total 128 drwxr-xr-x 2 archie archie 4096 Jul 5 21:03 Desktop drwxr-xr-x 6 archie archie 4096 Jul 5 17:37 Documents drwxr-xr-x 2 archie archie 4096 Jul 5 13:45 Downloads -rw-rw-r-- 1 archie archie 5120 Jun 27 08:28 customers.ods -rw-r--r-- 1 archie archie 3339 Jun 27 08:28 todo -rwxr-xr-x 1 archie archie 2048 Jul 6 12:56 myscript.sh
1番目の列に注目してください。例えば drwxrwxrwx+
という値であれば、それぞれの文字の意味は以下の様のようになります:
d
|
rwx
|
rwx
|
rwx
|
+
|
ファイルの種類。技術的にはパーミッションの一部ではありません。ここに入りうる値の説明は info ls -n "What information is listed" を参照してください。
|
このファイルに対して所有者が持っているパーミッション。以下で説明されています。 | このファイルに対してグループが持っているパーミッション。以下で説明されています。 | このファイルに対してその他のユーザが持っているパーミッション。以下で説明されています。 | 代替のアクセス手法がこのファイルに対して適用されているかどうかを示す単一の文字。この文字が空白ならば、代替のアクセス手法は適用されていません。. 文字の場合は、ファイルにセキュリティコンテキストが存在しているが、代替のアクセス手法は適用されていないことを示します。代替のアクセス手法がその他の組み合わせで適用されているファイルでは、+ 文字で表されます。例えば、アクセス制御リストの場合です。
|
3つの文字からなるパーミッション (上記の例では rwx
) には、以下の文字のどれかが入ります:
文字 | ファイルに対する効果 | ディレクトリに対する効果 | |
---|---|---|---|
読み取りパーミッション (最初の文字) | -
|
ファイルは読めません。 | ディレクトリの中身は表示できません。 |
r
|
ファイルを読むことができます。 | ディレクトリの中身を表示できます。 | |
書き込みパーミッション (2番目の文字) | -
|
ファイルは変更できません。 | ディレクトリの中身は変更できません。 |
w
|
ファイルを変更できます。 | ディレクトリの中身を変更できます (ここでの変更とは、新しいファイルやディレクトリの作成、既存のファイルやディレクトリの名称変更や削除です)。ただし、実行パーミッションも設定されていなければなりません。さもないと、このパーミッションは効果を持ちません。 | |
実行パーミッション (3番目の文字) | -
|
ファイルは実行できません。 | ディレクトリは cd でアクセスできません。 |
x
|
ファイルを実行できます。 | ディレクトリに cd でアクセスできます。これは、親ディレクトリから事実上 "継承している" とみなすことのできる唯一のパーミッションビットです。事実、親ディレクトリのどれか1つでも x が設定されていないと、パスの最後のファイルやディレクトリにも (それのパーミッションに依らず) アクセスできません。詳細は path_resolution(7) を参照してください。
| |
s
|
ユーザ (user) のパーミッションにある場合は setuid ビット、グループ (group) のパーミッションにある場合は setgid ビットとなります。その他のユーザ (others) のパーミッションには現れません。この文字は、x も設定されていることを意味します。
| ||
S
|
s と同じですが、x は設定されていません。通常のファイルで使われることは滅多になく、ディレクトリでは意味がありません。
| ||
t
|
スティッキービットです。その他のユーザ (others) のパーミッションにしか現れません。この文字は、x も設定されていることを意味します。
| ||
T
|
t と同じですが、x は設定されていません。通常のファイルで使われることは滅多にありません。
|
詳細は info Coreutils -n "Mode Structure"
と chmod(1) を見てください。
サンプル
いくつか例を見て、理解を深めましょう:
drwx------ 6 archie archie 4096 Jul 5 17:37 Documents
上記の場合、Archie は Documents
ディレクトリへの完全なアクセス権を持っています。Archie は、Documents 内のファイルを (そのファイルのパーミッションに依らず) 一覧表示、名称変更、削除することができ、さらにファイルを Documents 内に作成することができます。しかし、ファイル自体にアクセス (つまり、読み書き実行) できるかどうかは、そのファイルのパーミッションに依ります。
dr-x------ 6 archie archie 4096 Jul 5 17:37 Documents
Archie はファイルの作成、名称変更、削除ができませんが、それ以外なら可能です。Archie は Documents 内のファイルを一覧表示することができ、Documents 内のファイルに (そのファイルのパーミッションで許可されているならば) アクセスできます。
d-wx------ 6 archie archie 4096 Jul 5 17:37 Documents
Archie は Documents
ディレクトリ内で ls
を実行することができませんが、ディレクトリ内の特定のファイルの名前を知っているならば、そのファイルを一覧表示、名称変更、削除することができ、さらに (そのファイルのパーミッションで許可されているならば) アクセスすることができます。また、新しいファイルを作成することもできます。
d--x------ 6 archie archie 4096 Jul 5 17:37 Documents
Archie は、Documents
ディレクトリ内のファイルのうち、名前を知っているものにアクセスすることしかできません (ただし、そのファイルのパーミッションで許可されている場合に限る)。ディレクトリ内のファイルを一覧表示することはできず、ファイルの作成、名称変更、削除もできません。
ここで説明しているのはディレクトリのパーミッションであり、個々のファイルのパーミッションとは関係がありません。新しくファイルを作成したとき、変更があるのはディレクトリです。したがってディレクトリの書き込み権限が必要となります。
今度はディレクトリではなくファイルの例を見てみましょう:
-rw-r--r-- 1 archie web 5120 Jun 27 08:28 foobar
上記の例では最初の文字が d
ではなく -
になっていることが確認できます。なので、これはディレクトリではなくファイルであることを知ることができます。次に所有者のパーミッションは rw-
なので所有者はファイルの読み書きができますが実行することはできません。所有者が3つのパーミッション全てを得ていないことはおかしく思えるかもしれませんが、x
パーミッションは Gedit や Emacs などのテキストエディタから読むテキストファイル、あるいは R などのソフトウェアから読み込むデータファイルでは必要ないパーミッションです (python のコードなどが入っている場合は実行権限が与えられることがあります)。グループのパーミッションは r--
に設定されており、所有グループはファイルを読むことはできても編集することができません。何かを読み取り専用に設定することは重要です。他のユーザーのパーミッションはグループと同じに設定されています。
パーミッションの変更
chmod は Linux などの Unix ライクなオペレーティングシステムで使われるコマンドで、ファイルやディレクトリのパーミッション (アクセスモード (mode) とも) を変更 (change) することができます。
文字を使う方法
ファイルのパーミッション (アクセスモード とも) を変更するにはターミナルで chmod コマンドを使います。以下はコマンドの一般的な使い方です:
chmod who=パーミッション ファイル名
who
は、パーミッションを与える対象を指定する文字です。以下のどれかになります:
u
: そのファイルを所有するユーザー。g
: そのファイルが所属するユーザーグループ。o
: その他 (other) のユーザー。つまり、その他全員。a
: 上記全て。ugo
と入力する代わりとして使えます。
ここでのパーミッションとは、#パーミッションの表示 で説明しているのと同じです (r
、w
、x
)。
それではコマンドを使用例を見てみましょう。Documents ドキュメントを守るために、このディレクトリであなた以外の全員が読み書きと実行 (この場合は検索ともいえます) を行えないようにするには:
前: drwxr-xr-x 6 archie web 4096 Jul 5 17:37 Documents
$ chmod g= Documents $ chmod o= Documents
後: drwx------ 6 archie web 4096 Jul 6 17:32 Documents
上記ではパーミッションを取り去るために、=
の後に何も文字を入力していません。所有者のパーミッションだけ rwx
となり、他のパーミッションは全て -
に変更されたことが確認できます。
上記の設定は以下のコマンドで元に戻すことができます:
前: drwx------ 6 archie web 4096 Jul 6 17:32 Documents
$ chmod g=rx Documents $ chmod o=rx Documents
後: drwxr-xr-x 6 archie web 4096 Jul 6 17:32 Documents
次の例では、グループとその他のユーザに対して読み込みと実行のパーミッションを与えてみます。つまり、=
の後にパーミッションの文字 (r
と x
) を入れます (スペース無しで)。
who
に複数の文字を入力することで、これを行うことができます。例えば:
$ chmod go=rx Documents
次に、2番目の例を考えてみましょう。たとえば、foobar
ファイルを変更して、読み取りと書き込みのアクセス許可を与え、web
グループの同僚が作業している可能性があると仮定します。foobar
は読み取りと書き込みもできますが、他のユーザーは読み取りしかできません:
前: -rw-r--r-- 1 archie web 5120 Jun 27 08:28 foobar
$ chmod g=rw foobar
後: -rw-rw-r-- 1 archie web 5120 Jun 27 08:28 foobar
これは最初の例とまったく同じですが、ディレクトリではなくファイルを使用し、書き込み権限を付与します (権限を付与する例を全て示すため)。
文字を使う方法のショートカット
chmod コマンドでは =
の代わりに +
または -
を使うことでパーミッションを追加したり削除することができます。上記のコマンドのようにパーミッションを完全に書き換えることがありません (例えば、パーミッションを r--
から rw-
に変更する場合でも上記のコマンドを使うときは chmod コマンドの =
の後に w
だけでなく r
も必要です。r
を指定しなかった場合、r
のパーミッションが消えてしまいます。+
と -
を使うことで現在のパーミッションから一部のパーミッションを追加したり削除することができるようになります)。
前記のグループに書き込みパーミッションを与える例を +
と -
で試してみましょう:
前: -rw-r--r-- 1 archie web 5120 Jun 27 08:28 foobar
$ chmod g+w foobar
後: -rw-rw-r-- 1 archie web 5120 Jun 27 08:28 foobar
また、全てのユーザー (a) から書き込み権限を奪いたい場合:
前: -rw-rw-r-- 1 archie web 5120 Jun 27 08:28 foobar
$ chmod a-w foobar
後: -r--r--r-- 1 archie web 5120 Jun 27 08:28 foobar
別のショートカットは特殊な X
モードです。これは実際のファイルモードではありませんが、多くの場合、-R
オプションと組み合わせて使用され、ディレクトリに対してのみ実行可能ビットを設定し、通常のファイルに対しては変更しないでおきます。たとえば、次のようになります:
$ chmod -R a+rX ./data/
パーミッションのコピー
chmod で、あるクラスから別のクラスにパーミッションをコピーすることも可能です (例えば、所有者のパーミッションをグループにコピーする)。そうするには、=
の後に、r
や w
、x
ではなく、もう一つの who 文字を入れてください。例えば:
前: -rw-r--r-- 1 archie web 5120 Jun 27 08:28 foobar
$ chmod g=u foobar
後: -rw-rw-r-- 1 archie web 5120 Jun 27 08:28 foobar
このコマンドは基本的に、"グループのアクセス許可を変更 (g=
) して、所有ユーザー (=u
) と同じにします。ただし、パーミッションのセットをコピーして、なおかつ新しいパーミッションを付与するというようなことはできません。例えば:
$ chmod g=wu foobar
この場合、chmod はエラーを吐きます。
数字を使う方法
chmod では数字を使ってパーミッションを設定することもできます。
数字を使えば、所有者、グループ、そしてその他のユーザのパーミッション全て、さらに setuid、setgid、そしてスティッキービットも一度に設定できます。基本的な使い方は以下のとおりです:
$ chmod xxx ファイル名
ここで、xxx
は3桁の数字で、各桁は0から7までのどれかです。最初の桁は所有者のパーミッション、2桁目はグループのパーミッション、そして3桁目はその他のユーザのパーミッションです。
この数字表記では、r
、w
、そして x
はそれぞれ独自の数字を持ちます:
r=4 w=2 x=1
3桁の数字を計算するには、所有者、グループ、そしてユーザーにどのようなアクセス許可を付与するかを検討し、それらの値を合計する必要があります。例えば、ディレクトリの所有者には読み書きと実行のパーミッション、グループとその他のユーザには読み込みと実行のパーミッションのみを与える場合、数字は以下のようになります:
- 所有者:
rwx
=4+2+1=7 - グループ:
r-x
=4+0+1=5 - その他:
r-x
=4+0+1=5
$ chmod 755 ファイル名
これは、以下の2つのコマンドを実行したときと等価です:
$ chmod u=rwx ファイル名 $ chmod go=rx ファイル名
ファイルやディレクトリのパーミッションを数字形式で見るには、stat(1) コマンドを使ってください:
$ stat -c %a filename
%a オプションは出力を数字形式にするという意味です。
ほとんどのフォルダとディレクトリは 755
に設定され、所有者には読み取り、書き込み、実行を許可しますが、それ以外のすべてのユーザーには書き込みを拒否します。ファイルは通常 644
で、所有者には読み取りと書き込みを許可しますが、他のすべてのユーザーには読み取りだけを許可します。実行可能ファイル以外では x
パーミッションがないという最後のノートを参照してください。ここでも同じです。
理解するために、数字形式を使って前回の例と同じことをしてみましょう:
前: -rw-r--r-- 1 archie web 5120 Jun 27 08:28 foobar
$ chmod 664 foobar
後: -rw-rw-r-- 1 archie web 5120 Jun 27 08:28 foobar
所有者とグループに実行パーミッションを与えたい場合、数字は 774
になります。全員に読み込みパーミッションのみを与えたい場合は、444
になります。chmod xxx filename
で使うための数字を計算する最も簡単な方法は、r
を 4、w
を 2、x
を 1 として扱うことでしょう。しかし、それぞれのパーミッションを2進数として扱い、その後で数字に変換する方法もあります。この方法は少し複雑ですが、完全を期すために言及しておきましょう。
以下のパーミッション組を考えてみましょう:
-rwxr-xr--
与えるパーミッションに1を、与えないパーミッションに0を置くと、以下のようになります:
-rwxrwxr-x 111111101
そして、これらの2進数を変換します:
000=0 100=4 001=1 101=5 010=2 110=6 011=3 111=7
よって、結果は 775 となります。
グループから書き込みパーミッションを取り除いてみましょう:
-rwxr-xr-x 111101101
よって、結果は 755 となり、書き込みパーミッションを取り除くには chmod 755 filename
を実行すれば良いことになります。どの方法をとっても同じ3桁の数字が得られます。文字を使うか数字を使うかは個人の好みと入力速度に依ります。ディレクトリやファイルのパーミッションをデフォルトに戻したい場合 (例えば、所有者に読み書き (と実行権限) を与え、それ以外には書き込み権限を与えない)、chmod 755/644 filename
を使うほうが速いかもしれません。しかし、通常とは異なるパーミッションに変更する場合は、パーミッションを数字に変換するよりも、文字を使う方法をとったほうがシンプルで速いかもしれません (それに、数字を使う方法は間違いを犯す可能性があります)。たまにしか chmod を使わないユーザにとっては、どちらの方法をとったとしても対して速度に違いはないという主張もあるでしょう。
数字を使えば、4桁で setuid
ビット、setgid
ビット、そして sticky
ビットも設定できます。
setuid=4 setgid=2 sticky=1
例えば、chmod 2777 filename
は、全員に対して読み/書き/実行ビットを設定し、さらに setgid
ビットも有効化します。
まとめて chmod
一般に、ディレクトリとファイルの両方に同じパーミッションを設定することはありません。ディレクトリツリー内のパーミッションを一括で変更する必要がある場合は、find を使って選択的に修正してください。
ディレクトリのパーミッションだけを 755 に変更するには:
$ find ディレクトリ -type d -exec chmod 755 {} +
ファイルのパーミッションだけを 644 に変更するには:
$ find ディレクトリ -type f -exec chmod 644 {} +
所有者の変更
chown はファイルやディレクトリの所有者を変更します。これは、場合によってはパーミッションの変更よりも速くて簡単です。
以下の例では、GParted を使ってバックアップデータ用の新しいパーティションを作成しています。Gparted はデフォルトで全てを root として実行するため、ファイルの所有者が全て root になります。これ自体は全く問題ないのですが、マウントされたパーティションにデータを書き込むとなると、通常ユーザはアクセスが拒否されてしまいます。
brw-rw---- 1 root disk 8, 9 Jul 6 16:02 sda9 drwxr-xr-x 5 root root 4096 Jul 6 16:01 Backup
見ての通り、/dev
内のデバイスは root によって所有されており、それはマウントポイント (/media/Backup
) でも然りです。以下を実行することで、マウントポイントの所有者を変更することができます:
前: drwxr-xr-x 5 root root 4096 Jul 6 16:01 Backup
# chown archie /media/Backup
後: drwxr-xr-x 5 archie root 4096 Jul 6 16:01 Backup
これで、パーミッションを変更することなく、新しい所有者である archie がこのパーティションにデータを書き込めるようになりました (所有者のパーミッションは rwx
であるため)。
アクセス制御リスト
アクセス制御リストは、任意のユーザやグループに対するパーミッションをファイルに設定できるようにすることで、ファイルシステムに柔軟なパーミッション機構を追加します。
Umask
umask ユーティリティを使うことでファイル作成モードマスクを制御することができ、新しくファイルを作成したときのファイルパーミッションの初期値を決めることができます。
ファイルの属性
ユーザーやグループの読み書きや実行権限を制御するファイルモードビットとは別に、ファイル操作の可否を細かくカスタマイズするためのファイル属性をファイルシステムがサポートしている場合があります。
e2fsprogs パッケージには、lsattr(1) と chattr(1) というプログラムが含まれています。前者はファイルの属性を一覧表示し、後者は属性を変更します。
いくつか便利な属性があります。全てのファイルシステムが以下の全てをサポートしているわけではありません。
a
- 追加のみ: ファイルは追加 (append) 専用でしか開けなくなります。c
- 圧縮済み: ファイルに対してファイルシステムレベルでの圧縮を有効化します。i
- 変更不可: 変更、削除、名称変更が禁止され、さらにそのファイルにリンクを張ることができなくなります。root のみがこれを設定できます。j
- データのジャーナリング: ファイルデータの書き込みとメタデータに対してジャーナルを使用します。m
- 圧縮をしない: ファイルに対してファイルシステムレベルでの圧縮を無効化します。A
- atime を更新しない: ファイルの atime が変更されなくなります。C
- コピーオンライトをしない: コピーオンライトを無効化します (ファイルシステムがコピーオンライトをサポートしている場合)。
属性の完全なリストとそれぞれの属性の詳細は chattr(1) を参照してください。
例えば、とあるファイルに変更不可のビットを設定したい場合は、以下のコマンドを使用してください:
# chattr +i /path/to/file
ファイルから属性を取り除くには、+
を -
に変更してください。
拡張属性
拡張属性 を見てください。
ヒントとテクニック
Preserve root
--preserve-root
フラグを使うことで chmod
を /
で再帰的に実行してしまうことを防ぐことができます。システム全体から実行可能属性を取り除いてシステムが破壊されてしまう恐れがなくなります。フラグを毎回使いたい場合、エイリアスで設定すると良いでしょう。[1] も参照。