無法刪除組中的文件
我正在嘗試清理崩潰後服務留下的一些垃圾共享記憶體文件。該服務以系統使用者和特定組的身份執行。我是該組的成員,但無法刪除共享記憶體。
$ 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
. 對於某些舊系統上的正常文件,該位將程序的文本圖像保存在交換設備上,以便在執行時更快地載入;這稱為粘性位。