동일한 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
네 번째 숫자는 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
이는 파일에 확장된 권한이 있으며 우선 보기 setfacl
및 getfacl
명령 이상의 권한이 필요하다는 것을 의미합니다 .
답변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
더 많은 코드가 필요합니다.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))"