我需要设置相同的 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 位八进制数,但大多数时候,您只使用 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
显示数字是八进制的标准 UNIX 方法是以零开头。无论如何,GNUchmod
都会假设你给它的模式是八进制,但在前面添加零是最安全的。
最后,如果您+
在模式字符串末尾看到 a:
-rwxr-xr-x+
那么这意味着该文件具有扩展权限,并且您将需要超过chmod
.对于初学者来说,请查看setfacl
和getfacl
命令。
答案4
权限只是二进制数的字符串表示形式。
大部分0
由 表示-
,其余为字母。
基本的
对于基本权限:
将全部-
和大写S
或转换T
为0
,其余应代表1
。
如此构造的结果二进制数应打印为八进制:
$ 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))"