2017-10-20 150 views
4

我需要得到Access rights inhuman readable的文件或文件夹格式与symbolic符号这样u=rwx,g=srwx,o-rwx(可能粘位)UNIX权限转换器在象征性的符号(包括粘滞位)

  • 使用stat --format '%a',我获得结果与格式2770,八进制格式
  • 使用stat --format '%A',我获得具有格式drwxrws---结果,人类可读

我需要一个命令,获取格式像u=rwx,g=srwx,o-rwx(与chmod symbolic modes兼容)

  • [u|g|o]:为user/group/othera所有
  • [=]:是理所当然的权利
  • [rwxst] :授予的权利列表无重要性
  • [-rwx]:右撤销(如果没有权利授予)

我曾经尝试这样做(但它不能处理所有的情况下,specialy粘位):

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 

我寻找一个更优雅的方式。

例如输入==>输出

  • drwxrws--- ==>u=rwx,g=srwx,o-rwx(由d ==>目录开始)
  • drwxrwxrwx ==>u=rwx,g=rwx,o=rwxugo=rwxa=rwx
  • -r-xrw-r-- ==>u=rx,g=rw,o=r (开始 - ==>常规文件)
  • -rwx--S--- ==>u=rwx,g=s,o-rwx(S大写)
  • ------s--t ==>u=-srwx,g=sx,o=xt(粘滞位)

输入格式==>像命令statls -al
输出格式==>必须与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 
+1

为什么downvote?请解释。 – Indent

+1

因为你要求别人写你的代码而不费吹灰之力。 – 123

+2

好的,我已经更新了我的临时解决方案(我没有发布这个不影响答案) – Indent

回答

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操作与您所描述的输出不符(您显示sx而不是xs,表示具有组执行权限的SGID)。有些人会用分号分隔表达式,将所有这些选项变成一个-e选项。我更喜欢使用-e来分隔不同的选项。有时候-f script.sed选项从文件中读取脚本是明智的。我不认为这个脚本已经达到了这个门槛,但是不要忘记这个选项存在。

美丽是在旁观者的眼中。我不相信权限的替代表示比正常的更好,但也许我刚刚使用Unix太久了。

+0

感谢您的建议,我已经知道sed的语法已经不同了。我已经使用'多个'命令来添加简单的评论。对于'xs'vs'sx',顺序并不重要。对于替代格式的选择,我认为当我们使用粘性位时,'符号'语法更加清晰,大写'S'和'T'对's'和't'对我来说是一种破解,因为最初unix不管理粘性位。我会完成我的问题来详细说明存在的理由。 – Indent

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('', 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('', 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