AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 441434
Accepted
Rich
Rich
Asked: 2018-05-03 17:51:54 +0800 CST2018-05-03 17:51:54 +0800 CST 2018-05-03 17:51:54 +0800 CST

为什么 root 可以看到具有 400 权限的文件可以写入但用户只能读取?

  • 772

如果我以非特权用户的身份创建文件,并将权限模式更改为400,则该用户正确地将其视为只读:

$ touch somefile
$ chmod 400 somefile
$ [ -w somefile ] && echo rw || echo ro
ro

一切都很好。

但是随后出现了root:

# [ -w somefile ] && echo rw || echo ro
rw

有没有搞错?当然,root 可以写入只读文件,但它不应该养成这样的习惯:最佳实践倾向于规定我应该能够测试写权限位,如果不是,那么它被设置那样做是有原因的。

我想我想了解为什么会发生这种情况,以及在测试没有设置写入位的文件时如何获得错误的返回码?

permissions test
  • 3 3 个回答
  • 7626 Views

3 个回答

  • Voted
  1. Stephen Harris
    2018-05-03T18:04:28+08:002018-05-03T18:04:28+08:00

    我想你误解了什么-w。它不检查文件是否具有“写入权限”,而是检查文件是否可由调用用户写入。

    更具体地说,它调用access(2)或类似的。

    例如,如果脚本有,if [ -w /etc/shadow ]那么如果您strace在脚本上运行,您可能会看到类似于

    faccessat(AT_FDCWD, "/etc/shadow", W_OK)
    

    由于root可以写入文件,因此它返回 0。

    例如作为普通用户:

    faccessat(AT_FDCWD, "/etc/shadow", W_OK) = -1 EACCES (Permission denied)
    

    作为根

    faccessat(AT_FDCWD, "/etc/shadow", W_OK) = 0
    

    尽管在我的机器上获得了/etc/shadow许可,但这一点。000

    ---------- 1 root root 4599 Jan 29 20:08 /etc/shadow
    

    现在你想要做的事情变得有趣并且不是那么简单。

    如果要检查简单权限,请检查ls输出,或调用stat或类似的。但要意识到 ACL 可以覆盖这些权限。仅仅因为文件是权限 400 并不能阻止它可写......

    • 31
  2. Best Answer
    phemmer
    2018-05-03T18:04:01+08:002018-05-03T18:04:01+08:00

    test -waka[ -w不检查文件模式。它检查它是否可写。对于根,它是。

    $ help test | grep '\-w'
      -w FILE        True if the file is writable by you.
    

    我要测试的方法是对stat(1)(“%a 八进制访问权限”)的输出进行按位比较。

    (( 0$(stat -c %a somefile) & 0200 )) && echo rw || echo ro
    

    请注意,子shell$(...)需要一个0前缀,以便 的输出stat被解释为八进制(( ... ))。

    • 27
  3. vonbrand
    2018-05-04T03:35:16+08:002018-05-04T03:35:16+08:00

    root 用户可以为所欲为,“正常”文件权限没有限制。它不会在没有任何 eXecute 权限的情况下直接执行普通文件,只是为了防止脚部目标练习。

    • 2

相关问题

  • 组权限如何工作?

  • Redis日志文件权限错误,但是权限已经是777

  • 以 root 权限启动 zypper 命令

  • 以非特权用户身份运行时,meld 无法访问 /dev/fd/* 的可能原因是什么?

  • 另一个用户的非空子目录是否可以安全地从我的目录中删除?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve