Files

無法刪除組中的文件

  • June 20, 2019

我正在嘗試清理崩潰後服務留下的一些垃圾共享記憶體文件。該服務以系統使用者和特定組的身份執行。我是該組的成員,但無法刪除共享記憶體。

$ ls -la /dev/shm
drwxrwxrwt  2 root   root        600 Jun 20 11:18 .
drwxr-xr-x 22 root   root       3680 Jun 19 12:43 ..
-rw-rw-rw-  1 simbot simusers 500032 Jun 20 10:35 Sim_SharedMem_SLM__data_0

$ groups | grep simusers -q && echo member || echo not member
member

$ rm -f /dev/shm/Sim_SharedMem_SLM__data_0 
rm: cannot remove '/dev/shm/Sim_SharedMem_SLM__data_0': Operation not permitted

我以root身份刪除文件沒有問題。如果我是執行(並導致崩潰)程序的人(我是擁有文件的使用者),我刪除文件也沒有問題。

複製

我認為展示問題的最簡單方法是以我自己的身份執行該程序,然後更改一些垃圾文件,就好像它們屬於其他使用者一樣。

$ /usr/local/bin/badProcess
^C

$ ls -la /dev/shm
drwxrwxrwt  2 root root     640 Jun 20 11:31 .
drwxr-xr-x 22 root root    3680 Jun 19 12:43 ..
-rw-rw-rw-  1 stew stew  500032 Jun 20 11:31 Sim_SharedMem_SLM__data_0
-rw-rw-rw-  1 stew stew  500032 Jun 20 11:31 Sim_SharedMem_SLM__data_1
-rw-rw-rw-  1 stew stew  500032 Jun 20 11:31 Sim_SharedMem_SLM__data_2
-rw-rw-rw-  1 stew stew  500032 Jun 20 11:31 Sim_SharedMem_SLM__data_3

$ sudo chown simbot          Sim_SharedMem_SLM__data_1
$ sudo chown       :simusers Sim_SharedMem_SLM__data_2
$ sudo chown simbot:simusers Sim_SharedMem_SLM__data_3

$ ls -la /dev/shm
drwxrwxrwt  2 root   root         640 Jun 20 11:31 .
drwxr-xr-x 22 root   root        3680 Jun 19 12:43 ..
-rw-rw-rw-  1 stew   stew      500032 Jun 20 11:31 Sim_SharedMem_SLM__data_0
-rw-rw-rw-  1 simbot stew      500032 Jun 20 11:31 Sim_SharedMem_SLM__data_1
-rw-rw-rw-  1 stew   simusers  500032 Jun 20 11:31 Sim_SharedMem_SLM__data_2
-rw-rw-rw-  1 simbot simusers  500032 Jun 20 11:31 Sim_SharedMem_SLM__data_3

$ rm /dev/shm/*
rm: cannot remove 'Sim_SharedMem_SLM__data_1`': Operation not permitted
rm: cannot remove 'Sim_SharedMem_SLM__data_3`': Operation not permitted

lsattr

一些解決方案建議使用 lsattr 檢查 +a 或 +i 屬性。

$ lsattr Sim_SharedMem_SLM__data_0
lsattr: Inappropriate ioctl for device While reading flags on Sim_SharedMem_SLM__data_0

發生這種情況是因為 tmpfs 不支持這些屬性(這就是這個目錄)

$ mount | grep /dev/shm
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)

ACL

我查看了 ACL,看看父目錄或文件本身是否有什麼有趣的地方。我沒有看到我們沒有從中學到ls對父目錄有寫權限

$ getfacl /dev/shm
getfacl: Removing leading '/' from absolute path names
# file: dev/shm
# owner: root
# group: root
# flags: --t
user::rwx
group::rwx
other::rwx

$ getfacl /dev/shm/Sim_SharedMem_SLM__data_0 
getfacl: Removing leading '/' from absolute path names
# file: dev/shm/Sim_SharedMem_SLM__data_0
# owner: simbot
# group: simusers
user::rw-
group::rw-
other::rw-

刪除文件時感興趣的不是文件權限,而是文件所在目錄的權限。

在您的情況下,每個人都在目錄中具有寫權限,但該目錄還設置了“粘性位”(t權限字元串末尾的)。

在這樣的目錄中刪除文件的工作方式不同,您必須是文件的所有者,或者粘性目錄的所有者,或者是 root,才能刪除文件。

這是來自sticky(8)OpenBSD 系統的手冊:

粘性目錄

設置了 ‘sticky bit’ 的目錄對文件刪除施加了限制:如果使用者對目錄具有寫權限並且使用者是文件的所有者,則使用者只能刪除或重命名粘性目錄中的文件,目錄的所有者,或超級使用者。此功能適用於目錄,例如/tmp必須可公開寫入但應拒絕使用者任意刪除或重命名彼此文件的許可。

在 Ubuntu 上,該chmod(1)手冊具有等效資訊:

限制刪除標誌或粘滯位

限制刪除標誌或粘滯位是單個位,其解釋取決於文件​​類型。 對於目錄,它阻止非特權使用者刪除或重命名目錄中的文件,除非他們擁有該文件或目錄;這稱為目錄的受限刪除標誌,通常在世界可寫目錄中找到,例如/tmp. 對於某些舊系統上的正常文件,該位將程序的文本圖像保存在交換設備上,以便在執行時更快地載入;這稱為粘性位。

引用自:https://unix.stackexchange.com/questions/526004