【问题标题】:Why can't this user delete this file?为什么这个用户不能删除这个文件?
【发布时间】:2015-08-04 13:32:52
【问题描述】:

如果我这样做:

ls -al /usr/local/bin/kill-all-sales-apps

我明白了:

-r-xr-xr--  1 jenkins root   68 Aug  4 12:10 kill-all-sales-apps

如果我 sudo 到 root,然后 su 到 jenkins,我应该可以删除它,是吗?

目录及其父目录的其他相关信息:

drwxr-xr-x  2 root    root 4096 Aug  4 12:11 .
drwxr-xr-x 10 root    root 4096 May  7 17:20 ..

如果我这样做:

groups jenkins

然后我看到用户“jenkins”已添加到“root”组:

jenkins : jenkins root run-server-software

但如果我:

 rm /usr/local/bin/kill-all-sales-apps

我明白了:

rm: remove write-protected regular file ‘/usr/local/bin/kill-all-sales-apps’? y
rm: cannot remove ‘/usr/local/bin/kill-all-sales-apps’: Permission denied

为什么权限被拒绝?

【问题讨论】:

  • 可能是在您无法访问的目录中?
  • 如果我 su 成为用户 jenkins,然后我开始输入“kill-all-sa”,然后我按 TAB 按钮自动完成,shell 正确地自动完成命令名称。这应该是不可能的,除非用户 jenkins 可以访问 shell 脚本 kill-all-sales-apps 所在的目录。
  • 当然,jenkins 有权浏览该文件夹,但他或她是否有权写入该文件夹?创建和删除文件的权限遵循目录,而不是文件。

标签: linux permissions


【解决方案1】:

至于 为什么 jenkins 用户无法删除,jenkins 用户需要对您要删除的文件的父文件夹具有写权限。这是因为您实际上是从父文件夹中删除目录条目。

通常,在大多数文件系统上,删除文件需要写入 父目录的权限(和执行权限,按顺序 首先进入目录)。 (请注意,令人困惑 对于初学者来说,文件本身的权限是无关紧要的。然而, GNU rm 要求确认是否要写保护文件 删除,除非使用了 -f 选项。)

Source: Wikipedia - Rm_(Unix)

所以尝试运行...

ls -ld /usr/local/bin

并确保 jenkins 用户对 /usr/local/bin 有写权限

另一种方法是修改 sudoers 以通过 sudo 仅授予 jenkins 用户 sudo 对该文件的 rm 权限。这是一个示例,为用户 joe 提供了从他没有写入权限的目录中 sudo rm 文件/usr/local/src/noperms/hi.txt 的显式权限。但限制他删除该目录中的任何其他内容。

例如:

[root@joeyoung.io ~]# mkdir -p /usr/local/src/noperms
[root@joeyoung.io ~]# chmod -R 455 /usr/local/src/noperms
[root@joeyoung.io ~]# touch /usr/local/src/noperms/hi.txt
[root@joeyoung.io ~]# echo "hi" >> /usr/local/src/noperms/hi.txt
[root@joeyoung.io ~]# chmod 455 /usr/local/src/noperms/hi.txt
[root@joeyoung.io ~]# su - joe
[joe@joeyoung.io ~]$ cat /usr/local/src/noperms/hi.txt
hi
[joe@joeyoung.io ~]$ rm /usr/local/src/noperms/hi.txt
rm: remove write-protected regular file `/usr/local/src/noperms/hi.txt'? y
rm: cannot remove `/usr/local/src/noperms/hi.txt': Permission denied
[joe@joeyoung.io ~]$ exit
[root@joeyoung.io ~]# visudo
[root@joeyoung.io ~]# diff -Nur /tmp/sudoers.orig /etc/sudoers
--- /tmp/sudoers.orig   2015-08-04 17:17:24.020781442 +0200
+++ /etc/sudoers        2015-08-04 17:24:21.258274163 +0200
@@ -101,6 +101,7 @@
 ##
 ## Allow root to run any commands anywhere
 root            ALL=(ALL)       ALL
+joe        ALL=(root)      NOPASSWD: /bin/rm /usr/local/src/noperms/hi.txt

 ## Allows members of the 'sys' group to run networking, software,
 ## service management apps and more.
[root@joeyoung.io ~]# su - joe
[joe@joeyoung.io ~]$ sudo /bin/rm /usr/local/src/noperms/hi.txt
[joe@joeyoung.io ~]$ exit
[root@joeyoung.io ~]# ls -al /usr/local/src/noperms/hi.txt
ls: cannot access /usr/local/src/noperms/hi.txt: No such file or directory
[root@joeyoung.io ~]# ls -al /usr/local/src/noperms/

【讨论】:

  • 虽然您可以授予 jenkins 对 /usr/local/bin 的写入权限,但这似乎是个坏主意。
  • @Joshua 我同意。添加了通过 sudo 执行此操作的替代方法,但将 jenkins 用户的访问权限限制为仅删除一个文件。
猜你喜欢
  • 1970-01-01
  • 2012-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
相关资源
最近更新 更多