符号表示法中的unix权限转换器(包括粘滞位)

时间:2017-10-20 10:21:22

标签: linux bash unix permissions stat

我需要获得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 / othera
  • [=]:授予权利
  • [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=rwxugo=rwxa=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;如命令statls -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

2 个答案:

答案 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