和6年能登半島地震により亡くなられた方々のご冥福をお祈りするとともに、被害に遭われた皆さまに対し、心よりお見舞い申し上げます。一日も早く被災地の安全が確保され、復旧が進む事を心よりお祈り申し上げます。

chmod、umask めも

パーミッション

環境:CentOS Linux release 8.1.1911 (Core)

ファイルやディレクトリのパーミッションはchmodコマンドで変更するょ。

シンボリックモード

◎文字、記号で設定する。

パーミッション
r 読み取り
w 書き込み
実行
ユーザ
u 所有者
g グループ
o その他
a 全てのユーザ
設定
+ 許可
許可削除
= 許可設定
$ chmod u+rwx,a+rx smp.txt
$ ls -l
-rwxrwxr-x 1 yumidon     yumidon     78 Sep  7 16:53 smp.txt

オクタルモード

◎8進数の数値を用いて変更する。

ユーザ グループ その他
rwx rw- r–
4+2+1 4+2+0 4+0+0
7 6 4
パーミッション 数値
読み取り(r) 4
書き込み(w) 2
実行権(x) 1
権限無し 0
$ chmod 775 test3.txt
$ ls -l
-rwxrwxr-x. 1 hoge hoge 43  9月 26 11:25 test3.txt

デフォルトのパーミッション

ユーザがファイルやディレクトリを作成する時のデフォルトアクセス権の値は、マスク値で決まる!

現在のマスク値を確認する。

rootで実行

▼シンボリックモードで表示

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

▼オクタルモードで表示

# umask -p
umask 0022

ユーザで実行

$ umask -S
u=rwx,g=rwx,o=rx
$ umask -p
umask 0002

 ↑ 設定値を4桁で表示する。

※2~4桁目が「所有者」「グループ」「その他」のパーミッション!

※1桁目→0(ゼロ)ファイル、ディレクトリ、2→SGID、4→SUID

umask 002の場合

  ファイル ディレクトリ
初期パーミッション 666  rw-  rw-  rw- 777  rwx  rwx rwx
umask値 002  —  —  -w- 002  —  —  -w-
デフォルトパーミッション 664  rw-  rw-  r– 775  rwx  rwx r-x

初期のパーミッションからumask値を削除したのがデフォルトのパーミッションになる(*^^*)

例えば、umask を027に変更したらどうなる?

$ umask 027
$ umask -p
umask 0027

ファイルを作ってみる。

$ touch test.txt
$ ls -l
-rw-r----- 1 hoge hoge  0 Sep 27 15:31 test.txt

ディレクトリを作ってみる。

$ mkdir smpdir
$ ls -l
drwxr-x--- 2 hoge hoge 4096 Sep 27 15:43 smpdir

umask 027の場合

  ファイル ディレクトリ
初期パーミッション 666  rw-  rw-  rw- 777  rwx  rwx rwx
umask値 027  —  -w-  rwx 027  —  -w-  rwx
デフォルトパーミッション 640  rw-  r–  — 750  rwx  r-x  —

ファイルの場合、umask 026でもデフォルトパーミンションは、640になる(^-^;

$ umask 026
$ umask -p
umask 0026
$ touch test2.txt
$ ls -l
-rw-r----- 1 hoge hoge    0 Sep 27 16:07 test2.txt
-rw-r----- 1 hoge hoge    0 Sep 27 15:31 test.txt

※umaskコマンドで変更した値は、変更したシェルと、その子プロセスのみ有効!ログインしなおすともとの値に戻ります。

umaskの設定ファイルは?

/etc/profile

# cat /etc/profile

# By default, we want umask to get set. This sets it for login shell
# Current threshold for system reserved uid/gids is 200
# You could check uidgid reservation validity in
# /usr/share/doc/setup-*/uidgid file
if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then
    umask 002
else
    umask 022
fi

for i in /etc/profile.d/*.sh /etc/profile.d/sh.local ; do
    if [ -r "$i" ]; then
        if [ "${-#*i}" != "$-" ]; then
            . "$i"
        else
            . "$i" >/dev/null
        fi
    fi
done

/etc/bashrc

   # By default, we want umask to get set. This sets it for non-login shell.
    # Current threshold for system reserved uid/gids is 200
    # You could check uidgid reservation validity in
    # /usr/share/doc/setup-*/uidgid file
    if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then
       umask 002
    else
       umask 022
    fi

    SHELL=/bin/bash
    # Only display echos from profile.d scripts if we are no login shell
    # and interactive - otherwise just process them to set envvars
    for i in /etc/profile.d/*.sh; do
        if [ -r "$i" ]; then
            if [ "$PS1" ]; then
                . "$i"
            else
                . "$i" >/dev/null
            fi
        fi
    done

    unset i
    unset -f pathmunge
  fi

fi
# vim:ts=4:sw=4

/etc/csh.cshrc

# /etc/cshrc
#
# csh configuration for all shell invocations.

# By default, we want this to get set.
# Even for non-interactive, non-login shells.
# Current threshold for system reserved uid/gids is 200
# You could check uidgid reservation validity in
# /usr/share/doc/setup-*/uidgid file
if ($uid > 199 && "`id -gn`" == "`id -un`") then
    umask 002
else
    umask 022
endif

if ($?prompt) then
  if ($?tcsh) then
    set promptchars='$#'
    set prompt='[%n@%m %c]%# '
    # make completion work better by default
    set autolist
  else
    set prompt=\[$user@`hostname -s`\]\$\
  endif
endif