ls -l コマンドで表示される第一フィールドの値で確認。
-rwxr-xr--
2-3 桁目 所有ユーザのアクセス権限 (rwx)
4-6 桁目 所有グループのアクセス権限 (r-x)
7-10桁目 その他ユーザのアクセス権限 (r--)
-rwsr-sr-t
SUID: 3桁目(s) * 実行時にユーザ権限で実行
SGID: 6桁目(s) * 実行時にグループ権限で実行
Sticky bit:10桁目(t) * 全ユーザー書込権(所有者のみ削除権)
アクセス権限(rwx)を8進数で表示すると
r(読取権限):4 , w(書込権限):2 , x(実行権限):1 となる。
組み合わせると以下のようになる。
r-x : 5 (4+1)
rwx : 7 (4+2+1)
rwxrwxrwx : 777 / 0777
rwxr-xr-- : 754 / 0754
* 8進数1桁目部分を記述
-rwsrwxrwx: 4755 (SUID)
-rwxrwsrwx: 2755 (SGID)
-rwxrwxrwt: 1755 ( Sticy bit)
アクセス権限を8進数に変換する awk
mod_cnv.sh "-rwsr-xr--"
----------------------------------------------------------------------
1桁目(SUID/GUID/S-Bit)の計算
MOD=$1
echo $MOD | awk '{x=0}{for(i=4;i<=10;i+=3){{n=substr($1,i,1)}
{if(i==4&&n=="s"){x+=4}}
{if(i==7&&n=="s"){x+=2}}
{if(i==10&&n=="t"){x+=1}}
}{printf x}}'
まず変数(8進数の値) x を初期化する。
for文で 4,7,10桁目を処理対象とし、
substrで各桁(4,7,10)の1文字を取り出し、変数 n に代入する。
変数 n が (4桁目)=s であれば 4を
(7桁目)=s であれば 2を
(10桁目)=t であれば 1を x に加算する。
for文終了後に x の値を表示する。
2-10桁目の計算
echo $MOD | awk '{for(i=2;i<=10;i+=3){
{x=0;n=substr($1,i,3)}
{if(n~/r/){x+=4}}
{if(n~/w/){x+=2}}
{if(n~/[xst]/){x+=1}}
{printf x}}}'
for文で 2,5,7桁目を処理対象とし、
変数(8進数の値) x を初期化する。
substrで各桁(2,5,7)の開始位置から3文字を取り出し、変数 n に代入する。
変数 n に r(読取)が含まれている場合 4 を
w(書込)が含まれている場合 2 を
xst(実行)が含まれている場合 1 を x に加算する。
for文内で x の値を表示する。これを3回繰り返す
----------------------------------------------------------------------
出力結果
4750