UNIXのアクセス許可とファイルの種類について


68

chmod今日まで、どのようにうまくいったのか、私には本当に分かりません。私は大したことを説明したチュートリアルに従いました。

たとえば、3つの異なるアクセス許可グループがあることを読みました。

  • 所有者(u
  • グループ(g
  • みんな(o

これらの3つのグループに基づいて、私は次のことを知っています。

  • ファイルがユーザーによって所有されている場合、ユーザーのアクセス許可によってアクセスが決定されます。
  • ファイルのグループがユーザーのグループと同じ場合、グループのアクセス許可によってアクセスが決定されます。
  • ユーザーがファイルの所有者ではなく、グループに属していない場合は、他の権限が使用されます。

また、次の権限を持っていることも学びました。

  • 読む(r
  • 書き込み(w
  • 実行(x

私は新しく獲得した知識をテストするためのディレクトリを作成しました:

mkdir test

その後、いくつかのテストを行いました。

chmod u+rwx test/
# drwx------
chmod g+rx test/
# drwxr-x---
chmod u-x test/
# drw-r-x---

しばらくの間だまされた後、私は最終的にchmodこのコマンドを使用して許可を設定する方法と方法を知ったと思います。


しかし...

まだいくつか質問があります:

  • d最初は何を表していますか?
  • 収容スロットの名前と用途は何ですか?また、他のどの値を保持できますか?
  • どうすれば設定および設定解除できますか?
  • これの価値は何dですか?(7 = 4 + 2 + 1 7 = 4 + 2 + 1 7 = 4 + 2 + 1のみがあるため)
  • なぜ人々は時々権限を設定する0777代わりに使用するの777ですか?

しかし、私は複数の質問をするべきではないので、1つの質問で質問しようとします。

すべてのLinuxディストリビューションなどのUNIXベースのシステムでは、許可に関して、最初の部分(d)は何を表し、許可のこの部分の用途は何ですか?


3
次回は1つだけ質問してみてください。通常、複数の質問は参照するのが悪く、一度にすべての質問に答えることはほとんどありません。
キーウィ

1
@Kiwyすみません、同じテーマに関係しているので、このようにしたいと思いました。必要に応じて、私の質問のより良いタイトルを提案して、参照を改善することができます。
ピーター

1
ちなみに、「d」の値は040000 S_IFDIRです。これは、名前の下のヘッダーファイルにあります。ファイルモードを設定するときは使用しませんが、stat()関数は実際に値040750を返しますdrwxr-x---
Random832

2
@jamesqf実際、8進コードがどのようにマッピングされるかが理解できたので、そのように考える方が簡単です。
HalosGhost

4
@Peter:愚かな質問はありません-質問するのが怖いので学ばない愚かな質問だけです。
mgarciaisaia

回答:


117

質問の3つの部分に答えます:ファイルの種類、アクセス許可、さまざまな形式のユースケースchmod

ファイルタイプ

ls -l出力の最初の文字はファイルタイプを表します。dそれがディレクトリであることを意味します。設定または設定解除はできません。ファイルの作成方法によって異なります。ファイルタイプの完全なリストはlsドキュメントにあります。あなたが遭遇する可能性があるものは

  • -:ファイルを書き込むことができるプログラムで作成された「通常の」ファイル
  • b:ブロックスペシャルファイル(通常はディスクまたはパーティションデバイス)は、 mknod
  • c:キャラクタースペシャルファイル、で作成することもできますmknod/dev例を参照)
  • d:ディレクトリ、で作成可能 mkdir
  • l:シンボリックリンク、で作成できます ln -s
  • p:名前付きパイプ、で作成できます mkfifo
  • s:ソケット、で作成可能 nc -U
  • D:Solaris / openindiana上のサーバープロセスによって作成されたドア

許可

chmod 0777chmod変更をu+etc と結合するのではなく、1回の実行ですべての許可を設定するために使用されます。4桁のそれぞれは、許可のセットを表す8進数の値です。

  • suidsgidおよび「スティッキー」(以下を参照)
  • ユーザー権限
  • グループ権限
  • 「その他」の許可

8進数の値は、許可の合計として計算されます。

  • 「読み取り」は4
  • 「書き込み」は2
  • 「実行」は1

1桁目:

  • suidは4です。このビットが設定されたバイナリは、所有者ユーザーとして実行されます(通常root
  • sgid2です。このビットセットを持つバイナリは所有者グループとして実行されます(これはゲームに使用されたため、高いスコアを共有できますが、ゲームの脆弱性と組み合わせるとセキュリティ上のリスクになることがよくあります)。デフォルトでディレクトリの所有者グループ(これは共有フォルダーを作成するのに便利です)
  • 「スティッキー」(または「制限付き削除」)は1です。このビットが設定されたディレクトリ内のファイルは、その所有者、ディレクトリの所有者、またはroot/tmpこの一般的な例を参照してください)だけが削除できます。

詳細については、chmodマンページを参照してください。このすべてにおいて、ファイル(SELinux、ファイルACL ...)に対するユーザーのパーミッションを変更する可能性がある他のセキュリティ機能を無視していることに注意してください。

特殊ビットの処理方法は、ファイルのタイプ(通常のファイルまたはディレクトリ)および基盤となるシステムによって異なります。(これはchmodマンページに記載されています。)これをテストするために使用coreutilsしたext4システム(Linuxカーネル3.16.7-ckt2を実行するファイルシステムで8.23 を使用)での動作は次のとおりです。ファイルの場合、特別なビットは明示的に設定されない限り常にクリアされるため、とchmod 0777同等chmod 777です。両方のコマンドは特別なビットをクリアし、ファイルに対するすべての権限を全員に与えます。ディレクトリの場合、特別なビットは4桁の数値形式を使用して完全にクリアされることはないため、実質的にchmod 0777chmod 777ただし、一部の特別なビットはそのままであるため、誤解を招きます。(この回答の以前のバージョンではこれが間違っていました。)ディレクトリの特別なビットをクリアするにはu-sg-sおよび/またはo-t明示的に使用するか、負の数値を指定する必要があるためchmod -7000、ディレクトリのすべての特別なビットをクリアします。

ではls -l、出力、suidsgidおよび「粘着性」の代わりに表示されxたエントリ:suidあるsSの代わりに、ユーザーのxsgidあるsか、S代わりのグループのx、および「粘着性」であるtTの代わりに、他者のx。小文字は、特殊ビットと実行可能ビットの両方が設定されていることを示します。大文字は、特別なビットのみが設定されていることを示します。

chmodのさまざまな形式

上記の動作のために、4桁すべてを使用chmodすると混乱する可能性があります(少なくとも、混乱していたことがわかります)。許可ビットだけでなく特別なビットも設定したい場合に便利です。それ以外の場合、ファイルを操作している場合はビットがクリアされ、ディレクトリを操作している場合は保持されます。したがってchmod 2750、少なくともsgid正確に取得できるようにしますu=rwx,g=rx,o=。しかし、chmod 0750必ずしも特別なビットをクリアするとは限りません。

テキストコマンド([ugo][=+-][rwxXst])の代わりに数値モードを使用することは、おそらく習慣の例であり、コマンドの目的です。数値モードの使用に慣れたら、多くの場合、そのようにフルモードを指定する方が簡単です。そして、他の多くのコマンドがそれらを使用できるため、数値モードを使用して許可を考えることができると便利です(installmknod...)。

あなたは、単にファイルを確認したい場合は、誰でも実行することができますいくつかのテキスト変異体は便利になることができますchmod a+xに関係なく、他の権限があるものの、それを行います。同様に+X、実行許可の1つがすでに設定されている場合、またはファイルがディレクトリである場合にのみ、実行許可を追加します。これは、ファイルとディレクトリの特殊なケースを必要とせずに、アクセス許可をグローバルに復元するのに便利です。したがって、これchmod -R ug=rX,u+w,o=chmod -R 750すべてのディレクトリと実行可能ファイル、およびchmod -R 640他のすべてのファイルに適用するのと同等です。


他の答えはかなり良かったですが、あなたは本当にこの質問に答えるためにいくらかの時間を費やしました。ありがとう。
ピーター・

* BSDディレクトリsgidでは、実際の値に関係なく、ビットが常に設定されているかのように動作します。FreeBSDでは、基礎となるファイルシステムがそれをサポートし、オプションでマウントされている場合、suidビットは同様に動作するように構成できますsgid(つまり、内部で作成されたファイルとサブディレクトリはディレクトリと同じ所有者になりsuiddirます)。
lcd047

+X実行権限のいずれかが場合にのみ実行権限を追加し、既に設定されているスティーブン・KITTが行方不明@ありがとうか、ファイルがディレクトリである」「は既に設定されている」ドキュメントは本当にループのための私を投げていました!
ライアンフィッシャー

39

そのため、Linuxでの許可は非常に重要です。簡単な説明をしようとします。

ファイルモードの断片

すべてのUnixファイルには、ファイルを読み取り、書き込み、または実行できるかどうかを決定する一連の権限があります。ls -lを実行すると、権限が表示されます。そのような表示の例を次に示します。

-rw-r--r-- 1 user somegroup 7041 Mar 26 19:34 somefile

ファイルモードの断片の画像を添付します。

ここに画像の説明を入力してください

タイプは異なる場合があります。例えば:

  • d(ディレクトリ)
  • c(キャラクターデバイス)
  • l(シンボリックリンク)
  • p(名前付きパイプ)
  • s(ソケット)
  • b(ブロックデバイス)
  • D(ドア、Linuxシステムでは一般的ではありませんが、移植されています)

すべてのディレクトリにいくつかのアクセス許可を設定する場合、R属性を使用できます。次に例を示します。

chmod -R 777 /some/directory/

chmod 777対0777の場合

chmodコマンドは、通常、入力8進数、先行ゼロであることが期待スティッキー/ SGID / SUIDビットトリプレットの値を指します。ただし、Cでは、(8進数)に777変換され01411、スティッキービット(chmod(2)manページを参照)、所有者の読み取り許可、グループなどの実行可能ビット(これはかなり奇妙な組み合わせ)に変換されるため、違いが生じます。。

編集1

Linuxの許可に関する他の写真を見つけたので、わかりやすく説明するために添付します。 UNIXファイルのアクセス許可


5
777対0777については間違っています。両方とも8進数です(この場合は10進数は意味がありません)が、4文字の形式では、最初の桁が特別なビット(sticky&setuid)を設定します。
オリオン

3
@orion時々それは実際に真です。たとえば、Cのようなコードでchmod(777)は実際には実行と同等ですchmod 1411(つまり、chmod引数付きのコマンド1411)。
ペテルフ

2
... syscall(またはそのラッパー)と同じ名前のバイナリの場合、少し混乱する可能性があります。
ペテルフ

3
Python Master Raceは、0で始まるすべての「数字」を禁止することでこの逆問題を解決し、ユーザーが10進数以外、たとえばhex:0x1FF、binary:0b111111111またはoctal:を明示するように強制しました0o777。パイソンパワー
ニックT

画像ソース?
ラグ

10

dこれはディレクトリであることを意味します。ファイルがある-場合はリンクであり、リンクがある場合はが見つかりますl。設定/設定解除はできません。

0777を許可として使用する場合、システムのすべてのユーザー/グループにフルコントロール(読み取り+書き込み+実行)を与えます。これは、ディレクトリ/ファイルにアクセスできないユーザー/グループがある場合に問題を解決するための怠zyな方法です。

たとえば、ディレクトリのコンテンツをリストし、これを取得する場合:

-rw-r--r-- 1 root root 42596 jun 7 2012 preloadable_libintl.so

preloadable_libintl.soは、ユーザールートとグループルートが所有するファイルです。所有者は読み取りと書き込みアクセスを、しているグループは、アクセス権を読み取り専用しており、任意の他のユーザーが読み取りアクセス権を持っています。これは644として翻訳できます。

777に変更すると、次のようになります。

-rwxrwxrwx 1 root root 42596 jun 7 2012 preloadable_libintl.so


7

ここで私の質問に答えてもらい、結果についていくつかの調査を行った後、私はそれをすべて非常によく説明している記事を見つけました。今後の参考のために、この記事の一部をここで共有したいと思います。

表示許可

chmodファイルまたはディレクトリのアクセス許可を変更するために使用するには、まず現在のアクセスモードが何であるかを知る必要があります。ターミナル内のディレクトリの内容を表示するには、cdそのディレクトリまでで、次を使用します。

$ ls -l

-lスイッチを使用しlsないと、ディレクトリ内のファイルまたはフォルダーの名前のみが表示されるため、スイッチは重要です。

以下は、ls -l私のホームディレクトリでの使用例です。

total 128
drwxr-xr-x 2 peter users  4096 Jul  5 21:03 Desktop
drwxr-xr-x 6 peter users  4096 Jul  5 17:37 Documents
drwxr-xr-x 2 peter users  4096 Jul  5 13:45 Downloads
drwxr-xr-x 2 peter users  4096 Jun 24 03:36 Movies
drwxr-xr-x 2 peter users  4096 Jun 24 03:38 Music
drwxr-xr-x 2 peter users  4096 Jun 26 00:09 Pictures
-rw-r--r-- 1 peter users   354 Jul  6 17:15 chmodtest

列の意味

最初の列は各ファイルのタイプです。

  • - は通常のファイルを示します。
  • d は、ディレクトリ、つまり他のファイルまたはフォルダを含むフォルダを示します。
  • p 名前付きパイプ(別名FIFO)を示します。
  • l シンボリックリンクを示します。

その後の文字は許可です。この最初の列は最も関心のあるものです。2番目の列はファイル内にあるリンクの数であり、無視しても問題ありません。3番目の列には2つの値/名前があります。最初の列(この例では「peter」)は、ファイルを所有するユーザーの名前です。2番目の値(この例では「ユーザー」)は、所有者が属するグループです(グループの詳細を参照)。

次の列は、ファイルまたはディレクトリのサイズ(バイト単位)です。その後の情報は、ファイルまたはディレクトリが最後に変更された日付と時刻、そしてもちろんファイルまたはディレクトリの名前です。

許可の意味

最初-またはの後の最初の3文字はd、所有者が持つ許可です。次の3文字は、グループに適用される権限です。最後の3文字は、他の全員に適用される権限です。

3つの文字の各セットは、で構成されてr wxrは常に最初の位置にあり、w常に2番目の位置にあり、x常に3番目の位置にあります。rは読み取り許可、w書き込み許可、x実行許可です。-これらの文字のいずれかの場所にハイフン()がある場合、許可が与えられていないことを意味し、その文字が存在する場合は許可されます。

フォルダー

フォルダの場合、モードビットは次のように解釈できます。

  • r (読み取り)は、指定されたディレクトリの目次を読み取る機能を表します。
  • w(書き込み)は、実行ビットが設定されている場合にのみ、指定されたディレクトリの目次を書き込む機能(新しいファイル、フォルダーの作成、既存のファイル、フォルダーの名前変更、削除)を表します。それ以外の場合、この許可は無意味です。
  • x (実行)は、コマンドcdを使用して特定のディレクトリに入り、そのディレクトリ内のファイル、フォルダにアクセスする機能を表します。

chmodコマンドを使用して権限を変更する

chmodLinuxおよびその他のUnixライクなオペレーティングシステムのコマンドです。ファイルまたはディレクトリのアクセス許可(またはアクセスモード)を変更できます。

次の2つの方法で権限を変更できます。-テキストベースchmod -番号ベースchmod

テキスト方式

ファイルの許可モードまたはアクセスモードを変更するには、ターミナルでchmodコマンドを使用します。以下は、コマンドの一般的な構造です。

chmod who=permissions filename

誰が手紙の範囲から任意であり、それぞれがあなたが誰に許可を与えるつもりであるかを示します。それらは次のとおりです。

u - The user that owns the file.
g - The group the file belongs to.
o - The other users i.e. everyone else.
a - all of the above - use this instead of having to type ugo.

既に説明したようにアクセス権が同じである(rwおよびx)。

chmodコマンドを使用すると、=の代わりに+または-を使用して、既存のセットに許可を追加および削除できます。これは、本質的に権限を再書き込み上記のコマンドとは異なっている(つまりから許可を変更するr--rw-あなたはまだ含める必要がある、rなどwの後=chmodコマンド。あなたは逃した場合はr、それが離れて取るrとしての権限をこれらは=で書き換えられています。+と-を使用すると、現在のアクセス許可のセットを追加または削除することでこれを回避できます。

番号方式

chmod 番号を使用して権限を設定することもできます。

番号を使用することも、3つの所有者、グループ、およびその他すべてのアクセス許可を同時に編集できる別の方法です。コードのこの基本構造は次のとおりです。

chmod xxx file/directory

ここで、xxxは3桁の数字で、各数字は1から7のいずれかになります。最初の数字は所有者の許可に、2番目の数字はグループの許可に、3番目の数字は他のすべての許可に適用されます。

この数値表記では、値r、w、およびxには独自の数値があります。

r=4
w=2
x=1

3桁の数字を作成するには、所有者、グループ、およびユーザーにどのアクセス許可を付与するかを検討し、それらの値を合計する必要があります。たとえば、ディレクトリの所有者に読み取り/書き込みおよび実行のアクセス許可を付与し、グループと他のすべてのユーザーに読み取りおよび実行のアクセス許可のみを付与したいとします。私はそのような数値を思い付くでしょう:

Owner: rwx = 4+2+1=7
Group: r-x = 4+0+1=5 (or just 4+1=5)
Other: r-x = 4+0+1=5 (or just 4+1=5)

Final number = 755

$ chmod 755 filename

これは、次を使用するのと同等です。

chmod u=rwx filename
chmod go=rx filename

ほとんどのフォルダ/ディレクトリは755に設定され、所有者への読み取りと書き込みおよび実行を許可しますが、他のすべてのユーザーへの書き込みを拒否し、ファイルは通常644が所有者の読み取りと書き込みを許可しますが、他の全員の読み取りのみを許可します。非実行可能ファイルにはx権限がないことに注意してください-ここでも同じです。


別の記事からテキストをコピーするだけでは、少なくとも失礼です。たぶん著作権侵害です。コピーするだけでなく、実際に小さな部品を使用した場合(公正使用のおかげで著作権に優しい)、少なくとも参照/引用している記事へのリンクを追加してください。
ラグ

0

dの質問について

これにより、Unixファイルの種類がわかります。デフォルトでは、Unixには3種類のファイルしかない。彼らです:

  • - -通常ファイル
  • d -ディレクトリファイル
  • 特別なファイル(5つのサブタイプ):
    • b -ブロックファイル
    • c -キャラクターデバイスファイル
    • p -名前付きパイプファイルまたは単にパイプファイル
    • l -シンボリックリンクファイル
    • s -ソケットファイル

詳細はこちら:Linux / Unixのファイルタイプの詳細な説明

0777777

スティッキービットが指定されているかどうか。ディレクトリのスティッキービットが設定されると、ファイルシステムはそのようなディレクトリ内のファイルを特別な方法で処理するため、ファイルの所有者、ディレクトリの所有者、またはルートユーザーのみがファイルの名前を変更または削除できます。スティッキービットを設定しないと、ディレクトリの書き込みおよび実行権限を持つユーザーは、ファイルの所有者に関係なく、含まれているファイルの名前を変更したり削除したりできます。

0777 777ファイル許可を設定し、スティッキービットを0に設定します-特別なモードはありません。

777 スティッキービットを変更せずに、777ファイルのアクセス許可を設定しています。

続きを読む:スティッキービットchmod


2
良い:しかし、他の答えがまだカバーしていないことはまだ何も提供していません
...- jasonwryan

1
(1)3つの基本的なファイルタイプがあります。プレーンファイル、ディレクトリ、その他すべてです。何?これはどこで入手できますか?すばらしいスキームでは、プレーンなファイルとディレクトリはかなり似ています。名前付きパイプとシンボリックリンクは、デバイスファイルやソケットよりもプレーンファイルやディレクトリに似ています。(2)chmod 777setuid、setgid、およびstickyビットをクリアしないと思いますか?それを試してみてください。
Gマン

Unixのではありません。3. 7つのファイルタイプ、持っている
wjandrea
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.