2016-09-30 55 views
1

Here我认为使用“chgrp -R”会重置我的二进制文件中的setuid位;这对我们的应用程序造成了很大的伤害。操作getfacl输出的最佳方法是什么?

不过,我必须运行两个命令来确保所有的东西都属于某个用户;并且所有的东西都有“g + w”。

我认为“最有控制的”要实现这个方式:

  1. 运行getfacl的说明书和创建的当前设置
  2. 返工文件
  3. 一个“文本快照”与setfacl的应用

所以,我需要处理一个这样的文件:

# group: root 

应该变成

# group: whatever 

和线条像

group::?-? 

应该成为

group::?w? 

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

实施例:

group::r-- 

得到

group::rw- 

group::--x 

变得

group::-wx 

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

(我已经想通了第一部分

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

但其余挣扎)

+0

你能更具体吗?例如,你是否总是需要将'? - ?'转换为'?w?'? – GMichael

+0

查看我的更新。 – GhostCat

+0

'group ::? - ?'不是以'#'开始的? – Inian

回答

3

您可以使用sed类似于下面的例子:

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

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

我已经把一个不太直接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。请注意,当group::xxx中的xxx部分包含3个以上的字符时,这将不起作用。
相关问题