문자열을 통해 허가 번호를 얻는 방법: -rw-r--r--

문자열을 통해 허가 번호를 얻는 방법: -rw-r--r--

동일한 chmod를 설정해야 하는데, 번호를 얻는 방법-rw-r--r--?

답변1

이 숫자는 로 표시되는 이진 값을 더하여 계산 됩니다 r.wx

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

네 번째 숫자는 x패턴 문자열의 비트에 오버로드됩니다. 여기 이외의 문자가 표시되면 x이러한 "특수" 네 번째 숫자 중 하나가 설정되었음을 의미하고 문자가 소문자인 경우 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하지만 앞에 0을 추가하는 것이 가장 안전합니다.

마지막으로 +패턴 문자열 끝에 a가 표시되는 경우:

-rwxr-xr-x+

chmod이는 파일에 확장된 권한이 있으며 우선 보기 setfaclgetfacl명령 이상의 권한이 필요하다는 것을 의미합니다 .

답변4

권한은 이진수의 문자열 표현일 뿐입니다.
대부분은 0로 표시되고 -나머지는 문자입니다.

기초적인

기본 권한의 경우:

모두 -대문자 S또는 T로 변환하고 0나머지는 를 나타내야 합니다 1.
이렇게 구성된 결과 이진수는 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))"

관련 정보