インタビューで、なぜ777がファイルのすべての許可を取得するように割り当てられているのか尋ねられました。なぜ555ではないのですか?彼はすべての理由があると言いました。それでは、777の理由は何ですか?なぜ他の番号ではないのですか?この数に意味はありますか?
インタビューで、なぜ777がファイルのすべての許可を取得するように割り当てられているのか尋ねられました。なぜ555ではないのですか?彼はすべての理由があると言いました。それでは、777の理由は何ですか?なぜ他の番号ではないのですか?この数に意味はありますか?
回答:
私は、根本的な原因に対処しようとするでしょう、なぜそれはむしろ、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
バイナリが7
10進数であり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」を追加することを忘れないでください。コンピュータに興味のあるベースを知らせます。
7
10進数と8進数は同じですが、そうで777
はありません。ビットの反転について話しているとき、違いが生じます。
777
は時々Godと呼ばれます。
ファイル許可の読み取り、ファイル許可の4
書き込み、2
およびファイル許可の実行を意味し1
ます。
したがって、これの合計はです7
。
さて、777とは何ですか:最初7
はファイル所有者のためです。つまり、ファイル所有者は読み取り、権利、実行の許可を持っています。
2番目7
は、ファイルが属するグループ用です。これは、グループがすべての読み取り、書き込み、実行の許可も持っていることを意味します。
そして3番目7
は他人の許可です
ファイルにアクセス許可を与えると、ファイルには、アクセス許可のみが付与され555
ます。owner, group and others
これはread
、読み取りアクセス許可が4を意味し、実行が1を意味するためです。execute
not write
5
一番の答えほど多くの言葉ではありません:
各ファイルには、読み取り、書き込み、実行の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つのグループすべてに読み取り、書き込み、および実行の許可があることを意味します。
read
3番ではなく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
+read
3つの権限から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)
何らかの理由で、UNIX設計者は、ファイルのアクセス許可にOCTAL番号を使用することにしました。ご存知のように、1桁の8進数の最大値は7です。ユーザーアクセス、グループアクセス、ワールドアクセスにそれぞれ8進数で1桁あれば、ほぼすべてに十分であることがわかりました。最大3桁の8進数は777であり、「すべての人/すべてへのアクセス」を示すことだけが意味をなします。
今日では、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進数で書かれているのではないかと思われる場合があるため、先頭のゼロに注意する必要がある理由でもあります。