今回は知っているようで意外と奥が深い Linux の umask コマンドについて調べてみました。
何のためのコマンドなのか?
CentOS7 の環境で「man umask」と入力しました。
すると、BASH_BUILTINS のページが表示されました。
つまり、umask は bash のビルトインコマンドです。
BASH_BUILTINS(1) General Commands Manual BASH_BUILTINS(1) NAME BASH BUILTIN COMMANDS 特に明記されていないかぎり、このセクションでは、オプションの終わりを示すために – accepts – の前にacceptingオプションとして記述された各組み込みコマンドを使用します。 |
bash のビルトインコマンドとは?
ビルトインコマンドはあらかじめシェルに組み込まれている(ビルトインしている)コマンドです。
そのため、説明上は「umask」コマンドの実体(ファイル)は Linux 上には存在しないという前提です。
しかし「CentOS6」と「CentOS7」で「which」コマンドを実行してみると・・・
「CentOS6」の場合
[root@cent06 ~]# which umask ↑ CentOS6上ではファイルが存在しません。 |
「CentOS7」の場合
[test@cnt07 ~]$ which umask |
この実体について調べてみますと・・・
[test@cnt07 ~]$ ls -l /usr/bin/umask |
若干混乱しますが、CentOS7 の場合も「umask」コマンドは「ビルトインコマンド」でした。
このシェルを解説しますと、以下のようになります。
#!/bin/sh |
- 「builtin」コマンドで「umask」コマンドを実行しています。
- 「umask」コマンドは引数に「”$@”」を指定しています。
※ちなみに $@(ダブルクオーテーションで囲まない) と “$@”(ダブルクオーテーションで囲む)は動作が異なります。
試しにスクリプトを作ってみました。
[root@cnt07 script]# vi test.sh |
sub.shを作成します。
[root@cnt07 script]# vi sub.sh ← 同ディレクトリに「sub.sh」を作成します。 |
このスクリプトを実行します。
[root@cnt07 script]# ./test.sh 0022 ← 通常の umask コマンドを想定しています。 |
ただ、umask コマンドの場合は引数は「0022」とか「022」などで、スペースが入る余地がないのですが、”$@”は「そのままの状態(パラメーターの構成や引数の数)」を引き渡しますので、より不測の事態が起こりにくくなると言えるでしょう。
ここまで話をしてきて今更ですが、「type」コマンドでも「ビルトインコマンド」か「外部コマンド」かを確認することができます。
「CentOS6」の場合
[root@cent06 ~]# type -a umask |
「CentOS7」の場合
[root@cnt07 script]# type -a umask [root@cnt07 script]# cat /bin/umask [root@cnt07 script]# cat /usr/bin/umask
[root@cnt07 script]# ls -l /bin/umask |
3桁のパターンと、4桁のパターンで何が違うのか?
umaskコマンドについて調べると、「0022」と4桁で設定するパターンと「022」と3桁で設定するパターンがあります。
ためしに umask コマンドの検証をしてみます。
※「CentOS7」の場合
[test@cnt07 ~]$ umask ← 現在の設定を確認します。 |
結論から言えば、3桁でも4桁でも正しく設定はできます。(エラーも出ません)
3桁で umask コマンドを実行すると先頭に0が入っている想定になる
3桁か4桁かどちらが正解か、どちらが正統派なのかは置いておいて、「umask 002」のように3桁の数字の引数を与えた場合、先頭にゼロが入って「umask 0002」としてコマンドが実行されます。
つまりゼロ(0)が省略されていると解釈します。
もし4桁目が存在している場合は「setuid ビット」、「setgidビット」および「スティッキービット(sticky bit)」が設定されているものとして解釈をします。
数値の場合は
1 スティッキービット
2 setgid
4 setuid
になります。
umask コマンドはシンボルで表示ができる
umaskコマンドは「シンボル」で表示が可能です。
シンボルとは「rwx」などのことを言います。
[test@cnt07 ~]$ umask 0022 |
umask はログイン時に設定される
大体 umask の設定がログイン後の「環境変数」設定ファイルで設定されます。
特にユーザーごとに「.bash_profile」などで設定されていない場合は「/etc/profile」の「umask」の設定が適応されます。
[test@cnt07 ~]$ cat /etc/profile # System wide environment and startup programs, for login setup # It’s NOT a good idea to change this file unless you know what you pathmunge () {
if [ -x /usr/bin/id ]; then # Path manipulation HOSTNAME=`/usr/bin/hostname 2>/dev/null` export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL # By default, we want umask to get set. This sets it for login shell for i in /etc/profile.d/*.sh ; do unset i |
具体的に何をチェックしているのかと言いますと、
[ $UID -gt 199 ] ← UIDが199より上であるか?
とチェックをしています。
test アカウントの uid は 1000 なので 199 より上です。
[test@cnt07 ~]$ cat /etc/passwd | grep test |
次に
「/usr/bin/id -gn」コマンドは グループ名を表示するコマンドです。
「-gn」オプションでグループ名を表示します。
[test@cnt07 ~]$ /usr/bin/id -gn |
次に
「/usr/bin/id -un」コマンドはユーザー名を表示するコマンドです。
「-un」オプションでユーザー名を表示します。
[test@cnt07 ~]$ /usr/bin/id -un |
つまり、
- UIDが199以上で「ユーザー名」と「グループ名」が同じ場合 → 「umask 0002」で設定される
- UIDが199以上で「ユーザー名」と「グループ名」が異なる場合 → 「umask 0022」で設定される
です。
その理由は、
- 「ユーザー名」と「グループ名」が一緒 → 所有者とグループを一緒の権限にしても問題なし
- 「ユーザー名」と「グループ名」が異なる → グループには他のユーザーも含まれる可能性があるから、所有者にのみ全権限(読み書き実行)を与える
ということです。
まとめ
umaskコマンド1つ取っても、なかなか奥が深かったです。
設定も単純そうですが実は様々な環境や要素がからんでいます。
コメント