web-dev-qa-db-ja.com

umask 555がファイルmodを「111」ではなく「222」に設定しているのはなぜですか?

そんなこと知ってる:

  1. ファイルのデフォルトmodは666です
  2. umask値はデフォルトのmodから削除されます。

それで、なぜ「umask」を555に設定しても、新しく作成されたファイルのパーミッションが111に設定されないのはなぜですか?代わりに、222に設定しています

1
Ravexina

簡潔な答え:

5を使用すると、read (4)ビットとexecutable (1)ビットを削除するため、write (2)のみになります。


説明:

555では、デフォルトの実行可能ビットをオンに設定していません。

It's wrong          =>          (6 - 5 = 1)

これらのmodを入手しました。

  • 4 =読み取り
  • 2 =書き込み
  • 1 =実行可能

5を作成できる唯一の方法は4 + 1からであるため、5は実際には次のことを意味します。

   4 (Read) + 1  (Executable)   =    5

これは、実行可能ファイルを「削除」し、設定されている場合はmodを読み取ることを意味します。

言い換えると、umask 555を使用すると、デフォルトのファイルモード(6)から読み取り(4)および実行可能(1)ビットを削除し、6には4と削除するには2(1ではありません):

6  =  4   +   2

削除するのは4だけなので、ファイルは222で終わります。

バイナリで

バイナリで考えてください:

1 -> 001
2 -> 010
3 -> 011
4 -> 100
5 -> 101
6 -> 110
7 -> 111

ファイルのデフォルトモードは666(110 110 110)であり、umask値は555(101 101 101)です。

  Decimal title  ->         421 421 421
  666 in binary  ->         110 110 110
- 555 in binary  ->       - 101 101 101
                           _____________
                            010 010 010
                             2   2   2
                            -w- -w- -w-

見る?最終的に-w-w-w-、または222になりました。

3
Ravexina

結果のumask値はmask&0777bit wise and

マスクが0555の場合
Than0555&0777結果with0222

nixCraft Understanding-linux-unix-umask-value-usage

タスク:ファイルの最終的な許可の計算

次のように、ベースパーミッションからumaskを差し引くだけで、ファイルの最終パーミッションを決定できます。

666 – 022 = 644

File base permissions : 666
umask value : 022
subtract to get permissions of new file (666-022) : 644 (rw-r–r–)

タスク:ディレクトリの最終的な許可の計算

次のように、ディレクトリの最終的な許可を決定するために、基本許可からumaskを単純に差し引くことができます。

777 – 022 = 755

Directory base permissions : 777
umask value : 022
Subtract to get permissions of new directory (777-022) : 755 (rwxr-xr-x)

touch filemkdir dirの違いの原因:

注:このように指定する nix Q&A

許可ビットが標準ユーティリティにどのようにハードコードされているか。 touch(1)mkdir(1)の両方のソースコードを含むcoreutilsパッケージの2つのファイルからの関連する行を次に示します。

mkdir.c

if (specified_mode)
   {   
     struct mode_change *change = mode_compile (specified_mode);
     if (!change)
       error (EXIT_FAILURE, 0, _("invalid mode %s"),
              quote (specified_mode));
     options.mode = mode_adjust (S_IRWXUGO, true, umask_value, change,
                                  &options.mode_bits);
     free (change);
   }   
  else
    options.mode = S_IRWXUGO & ~umask_value;
}   

つまり、モードが指定されていない場合は、S_IRWXUGOによって変更されたumask_value(読み取り:0777)に設定します。

touch.cはさらに明確です:

int default_permissions =
  S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;

つまり、すべてのユーザーに読み取りおよび書き込み権限を付与します(読み取り:0666)。これは、もちろんファイル作成時にプロセスumaskによって変更されます。

これはプログラムでしか回避できない可能性があります。つまり、システムコールを直接行うCプログラム内から、または低レベルのシステムコールを行うことができる言語内からファイルを作成しているときです(たとえば、Perlのsysopenperldoc -f sysopen)。

man umask

umask()は、呼び出しプロセスのファイルモード作成マスク(umask)をmask&0777に設定します(つまり、maskのファイル許可ビットのみが使用されます)。マスクの前の値を返します。

2
Yaron