私が知ったように、umaskを使用する場合、ファイルに与えることができる最も高い権限は666です。これはumask 0000
によって行われます。それは、私が知っているすべてのシステムで666のように見える、デフォルトのファイル作成許可のためです。
内容を表示するために実行権限が必要なファイルは知っています。
しかし、なぜデフォルトのファイル作成許可を666に制限するのですか?
私の知る限り、これは標準ユーティリティにハードコーディングされています。 strace
dは、touch
で新しいファイルを作成し、mkdir
で新しいディレクトリを作成します。
touch
トレースはこれを生成しました:
_open("newfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3
_
mkdir
トレースはこれを生成しました:
_mkdir("newdir", 0777) = 0
_
Cでのファイル/ディレクトリ作成プロセスのコーディングが不足しているため、デフォルトの権限を変更する方法がわかりません。ただし、デフォルトではファイルを実行可能にしないことが理にかなっているように思えます。ランダムなテキストを誤ってシェルコマンドと誤解したくない場合です。
更新
アクセス許可ビットが標準ユーティリティにハードコードされる方法の例を示すため。 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
_(read:0777)に設定します。
_touch.c
_はさらに明確です:
_int default_permissions =
S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
_
つまり、すべてのユーザーに読み取りと書き込みのアクセス許可(読み取り:0666)を付与します。これはもちろん、ファイルの作成時にumask
プロセスによって変更されます。
プログラムでのみこれを回避できる場合があります。つまり、システムコールを直接実行するCプログラム内から、または低レベルのsyscallを実行できる言語内からファイルを作成するとき(たとえば、Perlのsysopen
を参照) _perldoc -f sysopen
_)の下にあります。
まず、グローバルなデフォルトはありません。権限は、ファイルを作成するアプリケーションによって異なります。たとえば、次の小さなCプログラムは、umaskが0000の場合、パーミッション0777のファイル「/ tmp/foo」を作成します(いずれの場合も、パーミッションは0777&〜umaskになります):
int main()
{
creat("/tmp/foo", 0777);
return 0;
}
そうは言っても、多くのアプリケーションは0666の権限でファイルを作成します。これには2つの理由があります。