ファイル上のすべてを許可するために777がchmodに割り当てられているのはなぜですか?


54

インタビューで、なぜ777がファイルのすべての許可を取得するように割り当てられているのか尋ねられました。なぜ555ではないのですか?彼はすべての理由があると言いました。それでは、777の理由は何ですか?なぜ他の番号ではないのですか?この数に意味はありますか?



2
@AvinashRajのリンクコメントを参照して、インスタンスに適用します。「なぜ?」という質問 それがどのインスタンスであり、どのような目的に役立つかによって異なります... :)
AzkerM

1
彼は、数字の7対5の意味について尋ねているのか、それとも文字ではなく数字である理由を尋ねているのか?
Braiam

4
これは素晴らしいインタビューの質問です。私はそれを盗む必要があるかもしれません。
デジタルクリス

5
厳密に言えば、それは777ではないですが、0777.
ルスラン

回答:


129

私は、根本的な原因に対処しようとするでしょう、なぜそれはむしろ、AAA、または999以上、777です。

許可は次の形式で提供されることに注意してください。

 u   g   o
rwx rwx rwx

ここで、u = user、g = group、o = otherです。

ここで、これらの各グループをバイナリとして表現していると想像してください。1は真、0は偽です。

すべてのユーザーにフルアクセスを許可する場合は、バイナリで次のアクセス許可を割り当てます。

 u   g   o
rwx rwx rwx
111 111 111

ここで、バイナリを知っている場合111、バイナリから10進数に変換するとが得られることに気付くでしょう7

したがって、フルアクセスをとして表すことができます777

注:実際にバイナリから8進数に変換しています。以下の編集を参照してください。

これは、他のすべてのアクセスモードでも機能します。

たとえば、555それぞれ5をバイナリに変換し、上記の形式で記述することにより、何を意味するかを簡単に理解できます。5バイナリは101であるため、次の権限があります。

 u   g   o
r-x r-x r-x
101 101 101
 5   5   5

同様に、ユーザーにすべての許可を与えたいが、他の人にのみ読み取りを許可したい場合は、数値表現を見つけることができます。

 u   g   o
rwx r-- r--
111 100 100
 7   4   4

これで、111バイナリが710進数であり100、バイナリが10進数であることがわかりました4。したがって、許可はになります744

編集:

技術的には、@LưuVĩnhPhúcおよび@Braiamで強調されているように、以下で説明するように、バイナリから8進数に変換しています。ただし、8未満の数値の10進表現と8進表現は同じであるため、3桁以下の2進数の場合、10進表現と8進表現は同じです。

3つのグループに分割し、各グループで2進数から10進数への変換を行うのではなく、8進数で表すと、実際には3つのグループすべてを1つの2進数としてまとめて8進数に変換できます。

たとえば、バイナリから8進数への変換の例を次に示します。

0b111111111 == 0o777
0b101101101 == 0o555
0b111100100 == 0o744

2進数と8進数を区別するために「0b」と「0o」を先頭に付けていることに注意してください。

これを試してみたい場合は、ターミナルを開いて実行pythonし、次のコマンドで試してください:

oct(0b111111111)
bin(0o555)

数字の先頭に「0b」または「0o」を追加することを忘れないでください。コンピュータに興味のあるベースを知らせます。


17
完全を期すため、数字の形式は8進数と呼ばれ、文字通り8の基数を意味します(0から始まるのは7 + 1 = 8であるため)。
14年

3
davie:8進数は簡単です。16進数のグループ4と同じように、実際には3ビットをグループ化するからです。10進数は2の累乗ではないため、ビットを適切にグループ化しません。
コネラク

2
まあ、どちらの場合でも同じ番号を取得します。バイナリから8進数への変換よりも、バイナリから10進数への変換を誰かが理解する可能性が高いと思います。また、数値が実際には10進数ではなく8進数であることを明確にするために、最後にセクションを追加しました。
daviewales

3
710進数と8進数は同じですが、そうで777はありません。ビットの反転について話しているとき、違いが生じます。
サムデュフェル

2
些細なことのために、7はGod's Numberと呼ばれ、デフォルトのアクセス権を持つrootユーザー777は時々Godと呼ばれます。
eyoung100

16

ファイル許可の読み取り、ファイル許可の4書き込み、2およびファイル許可の実行を意味し1ます。

したがって、これの合計はです7

さて、777とは何ですか:最初7はファイル所有者のためです。つまり、ファイル所有者は読み取り、権利、実行の許可を持っています。

2番目7は、ファイルが属するグループ用です。これは、グループがすべての読み取り、書き込み、実行の許可も持っていることを意味します。

そして3番目7は他人の許可です

ファイルにアクセス許可を与えると、ファイルには、アクセス許可のみが付与され555ます。owner, group and othersこれはread、読み取りアクセス許可が4を意味し、実行が1を意味するためです。executenot write5


グループとは何ですか、また他の許可は何ですか?回答ありがとうございます。
hellodear

この参照してくださいリンクグループとその他の権限のために、これらは、サーバー上の他の誰に強制されるものでないか、あなたやあなたのいないグループで
プラカシュV Holkar

7

一番の答えほど多くの言葉ではありません:

各ファイルには、読み取り、書き込み、実行の3つの許可オプションがあります。これらのどれも、これらの1つ、これらの2つ、またはこれらのすべてを選択できます。

C(3,0)+ C(3,1)+ C(3,2)+ C(3,3)= 8

1 + 3 + 3 + 1 = 8

したがって、全部で8つの組み合わせがあります。許可の8つのオプション。0から数えて、最後の数字は7(0から7)です。したがって、数字で表されたすべてのオプションは次のとおりです。

0 - nothing
1 - execute
2 - write
4 - read
3 - execute + write (1 + 2)
5 - execute + read (1 + 4)
6 - write + read (2 + 4)
7 - execute + write + read (1 + 2 + 4)

順序が[ユーザーのアクセス許可] [グループのアクセス許可] [その他のアクセス許可]になるため、3つの数字があります。

したがって、777は、3つのグループすべてに読み取り、書き込み、および実行の許可があることを意味します。


また、間接的に関連しているため、必ずしもこの部分を読む必要はありません。なぜなら、その関連性が重要だと思うからです。 なぜread3番ではなく4番なのでしょうか?

0 - nothing
1 - execute
2 - write
3 - read
4 - execute + read (1 + 3)
5 - write + read (2 + 3)
6 - execute + write + read (3 + 2 + 1)
7 - ????? no way to get this with the 3 basic options (and we are missing execute + write)

すべての可能性に対して一意の組み合わせを取得する唯一の方法は、基本オプションを2の累乗で行うことです。2 0 = 1(実行)、2 1 = 2(ライト)、2 2 = 4(読み出し)、及び第4の基本的なオプションがあった場合には2番のであろう3 = 8メモwriteの全ての組み合わせになるまで表示されていないが以前のオプションがリストされています(これは単なるオプションであるため、単なるオプションですexecute)。readは、前のオプションのすべての組み合わせがリストされるまでリストされません(2つのオプション- execute+の組み合わせは1つだけなので、再び1つwrite)。execute+ write+read3つの権限から2つの選択肢があるため、以前のすべての組み合わせ(3)がリストされるまで、リストされません。基本的なオプションがいくつあっても、リストはこのように続きます。例のために、4つの基本オプションを使用します(4つのオプションと2 4 = 16 があるため、合計16の組み合わせがあることにも注意してください)。

0 - nothing
1 - execute
2 - write
4 - read
3 - execute + write (1 + 2)
5 - execute + read (1 + 4)
6 - write + read (2 + 4)
7 - execute + write + read (1 + 2 + 4)
8 - love
9 - execute + love (1 + 8)
10 - write + love (2 + 8)
11 - execute + write + love (1 + 2 + 8)
12 - read + love (4 + 8)
13 - execute + read + love (1 + 4 + 8)
14 - write + read + love (2 + 4 + 8)
15 - execute + write + read + love (1 + 2 + 4 + 8)

6
この答えは、Unixファイル許可ビットのソースとしてバイナリ、さらに重要なことには8進数システムを認識できないため、まったく悪いです。(おもしろいことに、それらは3でも4でもありません...現在は完全な18ビットは使用されていませんが、6です。)
ミラビロス

1
111は7であるため、ベースは重要ではありません。許可が111であるか7であるかは、同じ値であるため重要ではありません。関係する数学を示すために、例を簡単にするために10進数を使用しました。バイナリを使用することもできましたが、数学はそれほど単純ではありませんでした。塩基を相互に変換できる場合、何が問題になりますか?
ダニエルウォード

4

マークを完全に見落とすほど多くの同様の答えに驚いています。

読み取り、書き込み、実行が必要な3つのクラスを決定した後。ファイルシステムの管理に必要なスペース最小限に抑えるために、 8進数(3ビット)を使用しました


3

何らかの理由で、UNIX設計者は、ファイルのアクセス許可にOCTAL番号を使用することにしました。ご存知のように、1桁の8進数の最大値は7です。ユーザーアクセス、グループアクセス、ワールドアクセスにそれぞれ8進数で1桁あれば、ほぼすべてに十分であることがわかりました。最大3桁の8進数は777であり、「すべての人/すべてへのアクセス」を示すことだけが意味をなします。


これは良い説明だとは思いません。UNIXの設計者は、可能性が小数を持っているし、まだなってしまっているだろう7のではなく、最大のアクセスを示す9(最大小数点以下の桁など)。7は、数字は可能な限り最高の一桁から始まることも可能であるかに基づいて、「減算」選ばれたが、「加法」全く権利のためにゼロから始まる単一のバイナリ桁で許可されたアクセスに基づいてされていません。
またはマッパー14年

「なんらかの理由で」非常に最初に書いたことに注意してください...-OPの質問ではないので、なぜ8進数を選んだのかについての詳細な説明にはしたくありませんでした。問題は、777がすべての許可を与える理由でした。
DejanLekic 14年

ここで、彼らが8進数を選んだ理由はここでは無関係です。私のポイントは、最大の権利が数字7で表される理由、7が最大の8進数であることではないということです。
またはマッパー14年

2

今日では、1バイトが8ビットであることは誰もが知っています。これは何十年もの間、普遍的に合意されています。しかし、常にそうであるとは限らず、Unix(多くの点でLinuxに影響を与えた)は、これがまだ議論されている間に書かれました。特に、6ビットバイトまたは8ビットバイトを使用するシステムに移植可能である必要がありました。それを書いた人々の何人かは議論の片側にいました、そして、他は反対側にいました。

関連するメモでは、Base-2(バイナリ)は値を書き出すための非常に便利な表記法ではありません。現在、ほとんどのプログラマーは、代わりにBase-16(16進数)を使用するよりコンパクトな表記法を作成しています。16は、4ビットを1桁の16進数に正確にパックできるほど十分に大きいです。たとえば、バイナリの「0000」は16進数の0x0です(「0x」は、 「1111」は0xF(または10進数では15)です。実際には、バイナリでカウントするだけで、単一の16進数を使用して4ビットの可能な組み合わせを書くことができ、位置計算の仕組みのため、それを積み重ねることができます:2つの16進数は8ビットの可能な組み合わせをエンコードできますカウントなどによって。それで、8ビットの人々はこれを愛していました。

6ビットの人々はこれを行う独自の方法を持っていましたが、Base-16を使用する代わりに、Base-8(8進数)を使用しました。16進数と同様の利点があります。3ビットの任意の位置を8進数で格納でき、同様の方法で数字を積み重ねることができます。したがって、8ビットの人々が1バイトに2桁の16進数を使用したように、6ビットの人々は1バイトに2桁の8進数を使用しました。もう8進数は表示されませんが、通常、先頭にゼロが付きます。たとえば、「111」は8進数で07です。

さて、これはすべてUnixパーミッションと何の関係があるのでしょうか?Unixに関する限り、ファイルでできることは3つあります。ファイルを読む、書き込む、プログラムとして実行する、の3つです。アクセス許可でそれを制限する場合は、それぞれに少し必要です。誰かが許可されていることをオンにし、許可されていないことはオフにしておきます。追跡されるものは3つあるため、3ビットが必要です。UNIXは3行(所有者、グループ、全員)で追跡するため、合計9ビットが必要です。

線に沿ったある時点で、おそらく6ビットキャンプの誰かが「ねえ、これには8進数を使用できます」と言いました。そして、これは非常に便利な表記法であることが判明しました。ビットフィールドのあらゆる可能な組み合わせをエンコードするには、3桁の8桁で十分です。彼らがこれを行うと決めたとき、777の運命(および000の運命)は封印されました。それらの数字はビットをどのように配置しても同じであるが、他のすべての数字の順序が重要だったので、彼らはこれを行うことを決めました。

彼らは、アクセス許可を3ビットのフィールドに配置しました。最初に読み取り、中央に書き込み、最後に実行します。次に、フィールド自体を配置しました。最初は所有者、中央はグループ、最後はその他です。彼らがこれを行った後、残りの数字を割り当てるためにしなければならないことはすべてカウントでした。

これらは3ビットのフィールドであるため、各8進数がフィールドの1つを制御すると言うことができます。1桁目は所有者のアクセス権を制御し、2桁目はグループのアクセス権を制御します。したがって、777(111 111 111)はすべてのユーザーのすべてのアクセス許可であり、700(111 000 000)は所有者のみのすべてのアクセス許可です。他の組み合わせも一般的です:666(110 110 110)はすべてのユーザーに対して読み取り/書き込みですが、実行はできません)、555(101 101 101)はすべてのユーザーに対して読み取り/実行ですが、書き込みではなく、400(100 000 000)は読み取り-所有者のみで、他の人はアクセスできません。

そして、それが777がすべての許可を意味する理由です。最近では、おそらく8進数を使用するのが最も一般的な理由ですが、Unixとその子孫にはまだ8進数が残っています。たとえばod、、またはOctal Dumpは、ファイルのバイナリダンプを8進数形式で取得する方法です(16進数のいとこxxdがありますが、それはあまり知られていないため、どこでも利用できません)。また、プログラミング言語によっては、数字が8進数で書かれているのではないかと思われる場合があるため、先頭のゼロに注意する必要がある理由でもあります。


まず最初に、Linuxが作成されたとき(1992年頃)、8ビット6ビットの議論は終わりました。2番目の理由はこれが行われた理由ではない
アーメドマスード14年

1
歴史的な文脈のために8ビット/ 6ビットのものを提供しました。Linuxはその議論が終わったずっと後に作成されたのは事実ですが、Unixから多くのインスピレーションを得たため、同様の方法でその議論の影響を受けました。これが、歴史的背景を紹介するのが良い考えだと思った理由です。
スプーニエスト14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.