文字列から許可番号を取得する方法:-rw-r--r--

文字列から許可番号を取得する方法:-rw-r--r--

同じchmodを設定する必要がありますが、番号を取得する方法-rw-r--r--

答え1

この数字は、で表されるバイナリ値を加えて計算されますrwx

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より多くのコードが必要です。20004000

#!/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))"

関連情報