如果我以非特权用户的身份创建文件,并将权限模式更改为400
,则该用户正确地将其视为只读:
$ touch somefile
$ chmod 400 somefile
$ [ -w somefile ] && echo rw || echo ro
ro
一切都很好。
但是随后出现了root:
# [ -w somefile ] && echo rw || echo ro
rw
有没有搞错?当然,root 可以写入只读文件,但它不应该养成这样的习惯:最佳实践倾向于规定我应该能够测试写权限位,如果不是,那么它被设置那样做是有原因的。
我想我想了解为什么会发生这种情况,以及在测试没有设置写入位的文件时如何获得错误的返回码?
我想你误解了什么
-w
。它不检查文件是否具有“写入权限”,而是检查文件是否可由调用用户写入。更具体地说,它调用
access(2)
或类似的。例如,如果脚本有,
if [ -w /etc/shadow ]
那么如果您strace
在脚本上运行,您可能会看到类似于由于
root
可以写入文件,因此它返回 0。例如作为普通用户:
作为根
尽管在我的机器上获得了
/etc/shadow
许可,但这一点。000
现在你想要做的事情变得有趣并且不是那么简单。
如果要检查简单权限,请检查
ls
输出,或调用stat
或类似的。但要意识到 ACL 可以覆盖这些权限。仅仅因为文件是权限 400 并不能阻止它可写......test -w
aka[ -w
不检查文件模式。它检查它是否可写。对于根,它是。我要测试的方法是对
stat(1)
(“%a
八进制访问权限”)的输出进行按位比较。请注意,子shell
$(...)
需要一个0
前缀,以便 的输出stat
被解释为八进制(( ... ))
。root 用户可以为所欲为,“正常”文件权限没有限制。它不会在没有任何 eXecute 权限的情况下直接执行普通文件,只是为了防止脚部目标练习。