言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

Linux & Mac & Bashコマンド辞典

  1. トップページ
  2. Linux & Mac & Bashコマンド辞典
  3. umask

umask

対応: 全Linux
macOS(2001 Cheetah)
Bash 1.0(1989)

umask(ユーマスク)はファイルやディレクトリを新規作成するときのデフォルトパーミッションを制御する仕組みです。umask の値は「許可したくないビット」を表しており、ベースのパーミッション(ファイルは 666、ディレクトリは 777)から umask の値を AND NOT(ビット除去)で除いたものが実際のパーミッションになります。

よく使う値(022 / 077 / 002)

umaskファイルディレクトリ用途・説明
022644 (rw-r--r--)755 (rwxr-xr-x)デフォルト。所有者は読み書き可、グループ・その他は読み取りのみ。一般的なサーバー設定。
077600 (rw-------)700 (rwx------)所有者のみアクセス可。秘密鍵や機密ファイルを扱う環境に適する。
002664 (rw-rw-r--)775 (rwxrwxr-x)グループの書き込みを許可。複数人で同一グループとして作業する開発環境向け。
000666 (rw-rw-rw-)777 (rwxrwxrwx)全員に読み書き(実行)を許可。セキュリティリスクが高く、通常は使わない。

umask の仕組み(ビットマスク)

umask は「引き算」ではなくビットマスク(AND NOT)で動作します。ベースのパーミッションと umask の各ビットを比較し、umask にビットが立っている位置のパーミッションを除去します。

実際のパーミッション = ベースパーミッション AND NOT umask

ファイルのベースは 666(rw-rw-rw-)、ディレクトリのベースは 777(rwxrwxrwx)です。よく使われる umask 022 の場合、計算は次のようになります。

# ファイルの場合
  666  (rw-rw-rw-)
- 022  (----w--w-)   ← umask(引き算ではなくビット除去)
-----
  644  (rw-r--r--)   ← 実際のパーミッション

# ディレクトリの場合
  777  (rwxrwxrwx)
- 022  (----w--w-)
-----
  755  (rwxr-xr-x)

ファイルのベースが 777 ではなく 666 なのは、新規ファイルに最初から実行ビット(x)を付けないようにするためです。テキストファイルや設定ファイルに誤って実行権が付くのを防ぎます。スクリプトに実行権を与えたい場合は作成後に chmod +x で明示的に付けます。

umask コマンド(表示 / 設定)

引数なしで実行すると現在の umask 値を表示します。

umask
0022

数値を引数に渡すとその値に変更します。変更はカレントシェルのセッション中のみ有効です。

umask 077

変更後に確認します。

umask
0077

umask -S(シンボリック表示)

umask -S を使うと、許可する権限をシンボリック形式(rwx 形式)で表示します。数値の見方に慣れていない場合に直感的に確認できます。

umask 022
umask -S
u=rwx,g=rx,o=rx

umask 077 の場合はグループ・その他の全権限を除去するため次のようになります。

umask 077
umask -S
u=rwx,g=,o=

シンボリック形式を直接 umask に渡すこともできます。

umask u=rwx,g=rx,o=rx

サンプルコード

現在の umask を確認し、ファイルとディレクトリを作成してパーミッションを確認する例です。

umask
0022
touch cursed_objects.txt
mkdir mission_briefing
ls -l
-rw-r--r--  1 gojo  staff    0 Apr  9 21:00 cursed_objects.txt
drwxr-xr-x  2 gojo  staff   64 Apr  9 21:00 mission_briefing

umask を 077 に変更してから作成すると、所有者のみアクセス可になります。

umask 077
umask
0077
touch technique_archive.dat
mkdir barrier_config
ls -l
-rw-------  1 gojo  staff    0 Apr  9 21:01 technique_archive.dat
drwx------  2 gojo  staff   64 Apr  9 21:01 barrier_config

.bashrc での umask 設定と、設定後の動作確認を行うスクリプト例です。

barrier_config.sh
#!/bin/bash
# umask の設定と確認スクリプト

# 秘密情報用: 所有者のみアクセス可
umask 077

echo "現在の umask: $(umask)"
echo "シンボリック表示: $(umask -S)"

# ファイルとディレクトリを作成して確認
touch technique_archive.dat
mkdir -p barrier_config/restricted

echo "--- 作成後のパーミッション ---"
ls -ld technique_archive.dat barrier_config/restricted

実行するコマンドは次の通りです。

bash barrier_config.sh
現在の umask: 0077
シンボリック表示: u=rwx,g=,o=
--- 作成後のパーミッション ---
-rw-------  1 gojo  staff   0 Apr  9 21:02 technique_archive.dat
drwx------  2 gojo  staff  64 Apr  9 21:02 barrier_config/restricted

概要

umask はシェルプロセスに紐づいた設定です。変更はカレントシェルのセッション中のみ有効で、新たに起動したシェルや別ターミナルには引き継がれません。永続的に設定したい場合は ~/.bashrc~/.profile に記述します。

~/.bashrc
# ~/.bashrc または ~/.profile に追記
umask 022

ログインシェルには ~/.profile または ~/.bash_profile、インタラクティブシェルには ~/.bashrc が読み込まれます。両方に適用したい場合は ~/.bashrc に書き、~/.bash_profile から ~/.bashrc を読み込む構成がよく使われます。

システム全体のデフォルト umask は /etc/profile/etc/login.defsUMASK 変数)で設定されています。一般ユーザー向けは 022、機密情報を扱うサービスアカウントには 077 が採用されることが多いです。

よくあるミス

よくあるミス1: umask は「引き算」ではなくビットマスク(AND NOT)

「666 から 022 を引くと 644」という理解は多くの場合たまたま正しい結果になりますが、厳密には間違いです。umask はビット単位の AND NOT 演算です。引き算で計算できないケースの例を示します。

umask 033 を例に確認します。引き算なら 666 − 033 = 633 になるはずですが、実際は 644 です。

umask 033
touch cursed_objects.txt
ls -l cursed_objects.txt
-rw-r--r--  1 gojo  staff  0 Apr  9 21:03 cursed_objects.txt

8進数を2進数に展開して確認してみます。

  110 110 110   (666 を2進数で表現)
AND NOT
  000 011 011   (033 を2進数で表現)
= 110 100 100 = 644

引き算で計算すると 633 になりますが、実際は 644 です。umask とベースのパーミッションにビット重複がない場合(例: 022)は引き算と同じ結果になるため、誤解が生まれやすい箇所です。

よくあるミス2: umask 000 によるセキュリティリスク

umask 000 を設定すると、作成されるファイルのパーミッションは 666(rw-rw-rw-)、ディレクトリは 777(rwxrwxrwx)になります。全ユーザーが読み書き(ディレクトリは実行)できる状態です。

umask 000
umask
0000
touch mission_briefing.txt
mkdir cursed_archive
ls -l
-rw-rw-rw-  1 gojo  staff    0 Apr  9 21:04 mission_briefing.txt
drwxrwxrwx  2 gojo  staff   64 Apr  9 21:04 cursed_archive

umask 000 の状態では、同じサーバー上の別ユーザーがファイルを上書きしたり、ディレクトリ内のファイルを削除したりできます。スクリプト内で一時的に umask を変更する場合は、処理終了後に元の値に戻すことが重要です。

#!/bin/bash
# 元の umask を保存してから変更し、処理後に復元する

OLD_UMASK=$(umask)
umask 000

# 全員が読み書きできる共有ファイルを作成
touch /tmp/shared_mission_briefing.txt

# 元の umask に戻す
umask "$OLD_UMASK"

echo "umask を ${OLD_UMASK} に戻しました"

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。