Unixでディレクトリを変更するために実行権限が必要なのはなぜですか?


5

これは、マシンに与えられた許可です。

drwxrwxrwx   4 root     root         512 May 16 09:32 STC_10
drwxrw-rw-   4 root     root         512 May  5 11:22 STC_11

今ここに問題があります:

cd STC_11
-bash: cd: STC_11: Permission denied

しかし、これはうまくいきます:

-bash-4.0$ cd STC_10
-bash-4.0$ ls
Codemgr_wsdata  src

そのディレクトリにアクセスするには、なぜ実行許可が必要なのですか STC_11?読み書き権限で十分ではありませんか。

ls コマンドオン STC_11 うまくいくでしょう。

回答:


12

次のデモでは、いくつかのディレクトリを作成しました。

$ mkdir read_only
$ mkdir exec_only
$ mkdir r_e
$ touch read_only/cant_open
$ echo foo > read_only/cant_open 
$ echo bar > exec_only/cant_find
$ echo baz > r_e/normal
$ chmod 400 read_only/
$ chmod 100 exec_only/
$ chmod 500 r_e/

読み取り権限で十分です ディレクトリの内容を一覧表示する ls(1) 見つからない 詳細 ファイルについてですが、それはあなたにファイルの名前を伝えることができます。

$ ls read_only/
ls: cannot access read_only/cant_open: Permission denied
cant_open

しかし、読み取り専用アクセスでは許可されません トラバース ディレクトリ

$ cat read_only/cant_open 
cat: read_only/cant_open: Permission denied

実行権限で十分です ディレクトリをたどる (含む cd )しかし、あなたは内容をリストすることはできません:

$ ls exec_only/
ls: cannot open directory exec_only/: Permission denied

ディレクトリ内のファイルのリストを取得できない場合でも、ディレクトリ内を移動できます。

$ cat exec_only/cant_find
bar

読み取り権限と実行権限はどちらも期待通りに機能します。

$ ls r_e
normal
$ cat r_e/normal 
baz

ディレクトリ内のファイルを一覧表示する権限を持つことは最初は混乱しますが、それを行うことはできません。 行う 彼らと一緒に何か、そしてそれはに許可を持っていることも混乱しています 行う ファイルを使っているがそれらをリストすることができない、それは賢いことのために使用されている単純なメカニズムのUnixの伝統の一部です:これら2つの要素だけで実装を容易にする 機能ベースのセキュリティ 。ディレクトリに数千のファイルを配置したいが 一部 ファイルを読む人々が彼らのために意味する、私は容易に推測できないファイル名を選び、人々がファイルを読むためにお金をくれたときにファイル名を配ることができた。 :)

または、おそらく1ダースのクライアントがあり、それらすべてがそれらのクライアント用のファイルのディレクトリにアクセスできるようにします。実行アクセス権のみですべてのクライアント情報を1つのディレクトリに配置した場合、他のクライアントを特定できない場合があります。 知っている 他の人はクライアントです。


3

定義により、ディレクトリに対する 'x'許可は特別な意味を持ちます - それはあなたがそれに 'cd'する許可を持っていることを意味します。


@Karmakaze:ディレクトリの内容を一覧表示するには、iノード構造を書き出す必要があります。ファイルシステムの設計に興味があります。

1

x 許可は単に「実行」を意味するのではありません。適用される場所によって異なります。ファイルに対して、ファイルを実行する許可を与えます。ディレクトリでは、ディレクトリへの変更を許可します。ファイルシステムの構造とはあまり関係がないと思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.