
同じchmodを設定する必要がありますが、番号を取得する方法-rw-r--r--?
答え1
この数字は、で表されるバイナリ値を加えて計算されますr
。w
x
r = 100b = 4
w = 010b = 2
x = 001b = 1
すべてのグループで。あなたの場合は-rw-r--r--
そうです
6(r+w=4+2)4(r=4)4(r=4)
したがって、関連するコマンドは次のようになります。
chmod 644 path/to/file
答え2
stat
出力を確認してください。
# stat .xsession-errors
File: ‘.xsession-errors’
Size: 839123 Blocks: 1648 IO Block: 4096 regular file
Device: 816h/2070d Inode: 3539028 Links: 1
Access: (0600/-rw-------) Uid: ( 1000/ lik) Gid: ( 1000/ lik)
Access: 2012-05-30 23:11:48.053999289 +0300
Modify: 2012-05-31 07:53:26.912690288 +0300
Change: 2012-05-31 07:53:26.912690288 +0300
Birth: -
答え3
フル特権モード番号は4桁の8進数ですが、ほとんどの場合、最下位3桁のみを使用します。 r=4、w=2、x=1 を使用して、権限文字列に各グループを追加します。たとえば、
421421421
-rwxr-xr--
\_/ -- r+w+x = 4+2+1 = 7
\_/ -- r+_+x = 4+0+1 = 5
\_/ -- r+_+_ = 4+0+0 = 4 => 0754
今度は、次のような奇妙なパターン文字列が表示されます。
-rwsr-xr-T
4番目の数字はx
パターン文字列のビットにオーバーロードされます。ここ以外の文字が表示されると、これらのx
「特殊」の4番目の数字の1つが設定されていることを意味し、文字が小文字の場合はx
その位置も設定されます。したがって、これを翻訳すると次のようになります。
4 2 1
421421421
-rwsr-xr-T
+ + + -- s+_+T = 4+0+1 = 5
\_/ -- r+w+s = 4+2+1 = 7 (s is lowercase, so 1)
\_/ -- r+_+x = 4+0+1 = 5
\_/ -- r+_+T = 4+0+0 = 4 (T is uppercase, so 0) => 05754
数字を8進数で表示する標準のUNIX方式は、0から始まるものです。 GNUはとにかくユーザーが提供するモードを8進数と仮定しますchmod
が、前にゼロを追加するのが最も安全です。
最後に、+
パターン文字列の末尾にaが表示された場合:
-rwxr-xr-x+
chmod
これは、ファイルに拡張権限があり、まずビューとsetfacl
コマンドgetfacl
以上の権限が必要であることを意味します。
答え4
権限はバイナリの文字列表現にすぎません。
ほとんどは0
で表され、-
残りは文字です。
基本的な
基本権限の場合:
すべて-
大文字S
またはT
に変換し、0
残りはを表す必要があります1
。
このように構成された結果の2進数は、8進数で印刷する必要があります。
$ a=-rw-r--r--
$ b=${a//[ST-]/0}
$ b=${b//[!0]/1}
$ printf '%04o\n' $((2#$b))
0644
一行:
$ b=${a//[ST-]/0}; b=${b//[!0]/1}; printf '%04o\n' $((2#$b))
0644
他の3ビットを修正して検出したり、1000
より多くのコードが必要です。2000
4000
#!/bin/bash
Say (){ printf '%s\n' "$@"; }
SayError(){ a=$1; shift; printf '%s\n' "$@" >&2; exit "$a"; }
e1="Permission strings should have 10 characters or less"
e2="Assuming first character is the file type"
e3="Permission strings must have at least 9 characters"
e4="Permission strings could only contain 'rwxsStT-'"
a=$1
((${#a}>10)) && SayError 1 "$e1"
((${#a}==10)) && { Say "$e2"; a=${a#?}; }
((${#a}<9)) && SayError 2 "$e3"
a=${a//[^rwxsStT-]}
((${#a}<9)) && SayError 3 "e4"
b=${a//[ST-]/0}; b=${b//[!0]/1}; c=0
[[ $a =~ [sS]......$ ]] && c=$((c|4))
[[ $a =~ [sS]...$ ]] && c=$((c|2))
[[ $a =~ [tT]$ ]] && c=$((c|1))
printf '%04o\n' "$((2#$b|c<<9))"