我需要获得Access rights in
更多 human readable
格式的文件或文件夹,其格式为u=rwx,g=srwx,o-rwx
,如stat --format '%a'
(可能是粘贴位)
2770
,我获得格式为stat --format '%A'
,八进制格式drwxrws---
,我获得格式为u=rwx,g=srwx,o-rwx
,人类可读我需要一个命令来获取chmod symbolic modes
等格式(与[u|g|o]
兼容)
user
:适用于所有<{1}} / group
/ other
或a
[=]
:授予权利[rwxst]
:未授予订单权限的权利列表[-rwx]
:对于右撤销(如果没有授予权利)我试过这个(但它并没有处理所有情况,特别是粘性位):
stat --format '%A' temp |
sed -E 's/^.(...)(...)(...)/u=\1,g=\2,o=\3/g' | # split by triplet
sed 's/=---/-rwx/g' | # revoker grants
sed 's/rws/srwx/g' | # setgid with x ...
sed 's/--S/s/g' | # setgid without x ...
sed ... nead more transormation... # manage sticky bit setuid setgid
我搜索的方式更优雅。
示例输入==&gt;输出
drwxrws---
==&gt; u=rwx,g=srwx,o-rwx
(以d ==&gt;目录开头)drwxrwxrwx
==&gt; u=rwx,g=rwx,o=rwx
或ugo=rwx
或a=rwx
-r-xrw-r--
==&gt; u=rx,g=rw,o=r
(以 - ==&gt;常规文件开头)-rwx--S---
==&gt; u=rwx,g=s,o-rwx
(S大写)------s--t
==&gt; u=-srwx,g=sx,o=xt
(Stickybit)输入格式==&gt;如命令stat
或ls -al
输出格式==&gt;必须与chmod
这个完整版似乎有效,但我确信我们可以简化它,(即没有多个sed)
stat --format '%A' a |
sed -E 's/^.(...)(...)(...)/u=\1,g=\2,o=\3/g' | # split by triplet
sed -E 's/s/xs/g' | # setgid ou setuid with x ...
sed -E 's/t/xt/g' | # sticky bit with x ...
sed -E 's/S/s/g' | # setgid ou setuid without x ...
sed -E 's/T/t/g' | # sticky bit alone
sed -E 's/-//g' | # remove -
sed -E 's/=(,|$)/-rwx\1/g' # revoker grants
答案 0 :(得分:2)
sed
命令需要多个-e 'sed-command'
选项,因此修复代码以便它使用sed
的一次调用是微不足道的:
stat --format '%A' a |
sed -E -e 's/^.(...)(...)(...)/u=\1,g=\2,o=\3/g' \
-e 's/s/xs/g' \
-e 's/t/xt/g' \
-e 's/S/s/g' \
-e 's/T/t/g' \
-e 's/-//g' \
-e 's/=(,|$)/-rwx\1/g'
您不能使用尾随评论,但这与您展示的内容相同。您的s/s/xs/g
操作与您所描述的输出不匹配(对于具有组执行权限的SGID,您显示sx
而不显示xs
。有些人将所有这些选项都刷成一个-e
选项,用分号分隔表达式。我更喜欢使用-e
来分隔不同的选项。有时,从文件中读取脚本的-f script.sed
选项是明智的。我不认为这个脚本已经达到了这个阈值,但是不要忘记该选项存在。
美丽是旁观者的眼睛。我不相信权限的替代表示比正常表示要好得多,但也许我只是在使用Unix太久了。
答案 1 :(得分:2)
最后,我发现的更简洁的命令是:
stat --format '%A' myFile | sed -E -e 's/(...)(...)(...)$/u=\1,g=\2,o=\3/;s/(s|t)/x\1/g;s/(S|T)/\l\1/g;s/-//g;s/(u|g)=,/\1-rwxs,/g;s/o=$/o-rwxt/g'
我宁愿找一个原生命令
为了确保我写了一个详尽的bash来测试所有权利组合(8 * 8 * 8 * 8 = 4096个案例!)
test_file=/tmp/a
return_code=0
echo -e "from itertools import product;\nfor mod in product('01234567', repeat=4) : print ''.join(mod)" | python | shuf |
while read octalMod
do
chmod $octalMod $test_file # apply octal mod
# get symbolic mod
symbolicMod=$(stat --format '%A' $test_file | sed -E -e 's/(...)(...)(...)$/u=\1,g=\2,o=\3/;s/(s|t)/x\1/g;s/(S|T)/\l\1/g;s/-//g;s/(u|g)=,/\1-rwxs,/g;s/o=$/o-rwxt/g')
chmod 0000 $test_file # reset mod
chmod $symbolicMod $test_file # apply symbolic mod
modActual=$(stat --format '%a' $test_file) # get actual mod in octal format to compare it with the original
if [ $octalMod -ne $modActual ]
then
echo "$octalMod ($symbolicMod) !!! octalMod=$octalMod <> modActual=$modActual" >&2
return_code=255
else
echo "$octalMod ($symbolicMod) octalMod=$octalMod == modActual=$modActual" >&1
fi
done
exit $return_code
完整清单:
test_file=/tmp/a
echo -e "octalMod\thumanMod\tsymbolicMod"
echo -e "from itertools import product;\nfor mod in product('01234567', repeat=4) : print ''.join(mod)" | python |
while read octalMod
do
chmod $octalMod $test_file # apply octal mod
# get symbolic mod
symbolicMod=$(stat --format '%A' $test_file | sed -E -e 's/(...)(...)(...)$/u=\1,g=\2,o=\3/;s/(s|t)/x\1/g;s/(S|T)/\l\1/g;s/-//g;s/(u|g)=,/\1-rwxs,/g;s/o=$/o-rwxt/g')
humanMod=$(stat --format '%A' $test_file)
echo -e "$octalMod\t$humanMod\t$symbolicMod"
done
echo -e "octalMod\thumanMod\tsymbolicMod"
样本结果:
octalMod humanMod symbolicMod
0001 ---------x u-rwxs,g-rwxs,o=x
0354 --wxr-xr-- u=wx,g=rx,o=r
1210 --w---x--T u=w,g=x,o=t
3337 --wx-wsrwt u=wx,g=wxs,o=rwxt
3566 -r-xrwSrwT u=rx,g=rws,o=rwt
3734 -rwx-wsr-T u=rwx,g=wxs,o=rt
6734 -rws-wsr-- u=rwxs,g=wxs,o=r
7121 ---s-wS--t u=xs,g=ws,o=xt
7430 -r-S-ws--T u=rs,g=wxs,o=t
7611 -rwS--s--t u=rws,g=xs,o=xt