我需要在脚本中使用 sed 撤销对用户的 sudo 访问权限。
我只想在该行包含 /bin/su - root 时才评论用户
让我们考虑如下文件,其中我必须仅评论第一行。
mindadmin ALL = NOPASSWD: /bin/su - root
mindadmin ALL = NOPASSWD: /bin/ifconfig
我使用过的sed
命令如下:
sed -e 's/minadmin[\s]+ALL[\s]+=[\s]+NOPASSWD:[\s]+/bin/su - root/#mindadmin ALL = NOPASSWD: /bin/su - root/g' /etc/sudoers
但它不起作用。其中有语法错误吗?
答案1
有两个问题,第一是你的sudoers
hasmindadmin
和你的模式minadmin
(没有d
)。
第二个问题是在/
的 s中/bin/su
,您必须在正则表达式中转义这些:
sed -e 's/mindadmin[\s]+ALL[\s]+=[\s]+NOPASSWD:[\s]+\/bin\/su - root/#mindadmin ALL = NOPASSWD: \/bin\/su - root/g' /etc/sudoers
否则他们就会结束该模式。
您还可以选择另一个分隔符来代替/
,只要文件中没有出现这种情况,您就不必转义它。
答案2
sed '/\/bin\/su - root/ s/^/#/' filename
它找到文件名中包含 的行/bin/su - root
,并在行的开头添加注释 (#) (^)。
在 sed 中添加-i
选项以影响文件。
答案3
如果您想注释掉/bin/su - root
行尾包含的所有行,那么您可以简化 sed 表达式:
sed 's/.*\/bin\/su - root$/#&/'
或者,更简单
sed 's,.*/bin/su - root$,#&,'
要注释掉包含/bin/su - root
行中任意位置的所有行:
sed 's,.*/bin/su - root,#&,'
答案4
由于&
替换为整个匹配模式,这里有另一个解决方案:
sed -i 's,.*/bin/su\s\+-\s+root,#&,' /etc/sudoers
/
被不同的分隔符替换,因此您不需要转义它。如果 su 命令后的间距不同,则该模式也更加灵活。
如果它只改变最小d管理员用户:
sed -i 's,^mindadmin\s.*/bin/su\s+-\+root,#&,' /etc/sudoers
标志 -i 直接将更改应用于文件。