操纵getfacl输出的最佳方法是什么?

时间:2016-09-30 12:14:04

标签: linux bash awk

Here我认为使用" chgrp -R"重置我的二进制文件上的setuid位;这对我们的申请造成了相当大的担忧。

但是,我必须运行两个命令来确保所有东西都属于某个用户;并且所有事情都有" g + w"在他们。

我认为"最受控制的"达到这个目标的方式:

  1. 运行getfacl并创建一个"文本快照"目前的设置
  2. 返回该文件
  3. 使用setfacl
  4. 所以,我需要处理这样的文件:

    # group: root
    

    应该变成

    # group: whatever
    

    之类的行
    group::?-?
    

    应该成为

    group::?w?
    

    保留实际的通配符'内容:我的意思是:我只想"启用"瓦;我不想改变那条线上的任何其他东西。

    示例:

    group::r--
    

    group::rw-
    

    group::--x
    

    变为

    group::-wx
    

    现在我需要把它变成一些bash / sed / awk的东西。有人可以帮忙吗?

    (我已经想到了第一部分

    sed s/'^# group: root'/'#group: nobody'/g
    

    但与其他人挣扎)

2 个答案:

答案 0 :(得分:3)

您可以使用sed,类似于以下示例:

echo 'group::?-?' | sed 's/\(^group::.\).\(.\)/\1w\2/'  # gives  group::?w?

echo '#group:root' | sed 's/\(^#group:\).*/\1whatever/' # gives  #group:whatever

答案 1 :(得分:2)

我已经整理了一个不太直接的awk逻辑,但它适用于所有情况。

awk -F"[:]+" -vOFS="::" '{if ($2 == ": root") $2=" whatever"; if (substr($2,2,1) == "-") $2=substr($2,1,1)"w"substr($2,3)}1' file

输入文件

# group: root
group::?-?
group::--x
group::y--

该命令产生输出

$ awk -F"[:]+" -vOFS="::" '{if ($2 == ": root") $2=" whatever"; if (substr($2,2,1) == "-") $2=substr($2,1,1)"w"substr($2,3)}1' file
# group: whatever
group::?w?
group::-wx
group::yw-

几个有用的注释: -

  • -F"[:]+"适用于限制器:的一个或多个实例,-vOFS="::"用于输出字段分隔。
  • 条件if (substr($2,2,1) == "-") $2=substr($2,1,1)"w"substr($2,3)只是如果中间字符包含-,则将其替换为w。请注意,如果xxx中的group::xxx部分包含超过3个字符,则此功能无效。