今天做作业碰到一个巨坑。给我为难的要死要活的。所以在此做个记录。
题目:给oldboy用户授权以root身份执行ls,touch,passwd命令,但是禁止修改root用户密码
一开始我的错误解答:
[root@Sloth ~]# visudo
oldboy ALL=(ALL) /bin/ls, /bin/touch, /usr/bin/passwd, !/usr/bin/passwd root
后来发现会被绕开:用sudo passwd 可以直接修改root密码
之后就上网上查了下正确的应该怎么写。网上给出了如下的答案。
oldboy ALL=(ALL) NOPASSWD:/usr/bin/passwd [a-zA-Z]*,!/usr/bin/passwd root
测试了一下可以。
但是语句有些不太理解。
/usr/bin/passwd [a-zA-Z]* 表示可以使用sudo passwd 用户名
!/usr/bin/passwd root 表示禁止对root用户使用passwd
疑问就在于/usr/bin/passwd [a-zA-Z]* 为什么不饿能写成 /usr/bin/passwd *?
/usr/bin/passwd [a-zA-Z]*一开始被我当作正则表达式,那么这个语句是匹配0或多个大小写字母。但是在我测试的是有一个用户名为alex-1的用户也可以被修改密码。我就想不明白 [a-zA-Z]*是怎么匹配特殊字符的。
后来经过高人指点visudo中 * 表示通配符,不是正则。那么 /usr/bin/passwd [a-zA-Z]*主要是过滤掉sudo passwd的情况,passwd后面一定要有空格和用户名。[]中可以放任意个字母,但是不能放特殊字符(测试了几个都不行例如空格 , )
PS:[a-zA-Z]可以改写成 [a-Z] 同样表示大小写字母。