web-dev-qa-db-ja.com

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

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

54
hellodear

根本的な理由を解決しようとします。なぜ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の意味を簡単に理解できます。バイナリの5101であるため、次の権限があります。

 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は10進数の7であり、バイナリの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」を追加することを忘れないでください。コンピュータに興味のあるベースを知らせます。(そうでない場合は、ベース10と見なされます)

129
daviewales

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

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

777とは何ですか:最初の7はファイル所有者用で、ファイル所有者が読み取り、権利、実行の許可を持っていることを意味します。

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

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

ファイルにパーミッション555を与えると、ファイルowner, group and othersreadおよびexecuteパーミッションnot writeパーミッションのみを持ちます。これは、読み込みパーミッションが4で実行手段が1 5を取得します

16

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

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

4
Ununique

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

3
DejanLekic

今日、私たちはバイトが8ビットであることを知っています:これは何十年もの間、普遍的に合意されています。しかし、常にそうであるとは限らず、nix(多くの点で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進数と同様の利点があります。 8桁の3ビットで、同様の方法で数字を積み重ねることができます。したがって、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ビットのフィールドに配置しました。最初に読み取り、中央に書き込み、最後に実行します。次に、フィールド自体を配置しました。最初は所有者、中央はグループ、最後はその他です。 一度これを行うと、残りの番号を割り当てるために行う必要があるのはカウントだけでした。

ビットのフィールドであるため、各8進数がフィールドの1つを制御すると言うことができます:1桁目は所有者のアクセス権を制御し、2桁目はグループのアクセス権を制御し、3桁目はその他を制御します許可。したがって、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進数形式で取得する方法です(xxdと呼ばれる16進数のいとこがありますが、それはあまり知られておらず、 ' tはどこでも利用可能)。また、プログラミング言語によっては、実際には意図していない数字を8進数で書くつもりであると考えられる場合があるため、いくつかのプログラミング言語では、先頭のゼロに注意する必要があります。

2
The Spooniest