为什么其他用户无法删除/dev/shm/xxx,即使有o+rw权限?

分享于 

3分钟阅读

互联网

  繁體 雙語

问题:

我有 python 脚本创建具有权限的共享信号量 /dev/shm/sem.serialize_ld


$ ll/dev/shm/sem.serialize_ld 


-rw-rw-rw- 1 buildbot buildbot 32 mar 27 08:36/dev/shm/sem.serialize_ld



实际上,它总是由用户buildbot创建的,但它不是设计假设。 有时问题发生- 脚本被 SIGKILL 杀死,并且不释放信号量。 启动时新的调用死锁。 要手动修复这种情况,我想删除文件并重新开始。 但是只有buildbot和 root 用户可以这样做。

为什么不同的用户无法删除这里文件?


$ rm/dev/shm/sem.serialize_ld 


rm: cannot remove '/dev/shm/sem.serialize_ld': Operation not permitted



系统是 Ubuntu 18.04.2

脚本代码是:


#!/usr/bin/env python3 


# -*- coding: utf-8 -*- 



import posix_ipc 


import subprocess 


import sys 


import signal 



SEM_NAME = '/serialize_ld' 


MAX_CONCURRENT = 2 


PROGRAM = '/usr/bin/ld' 



def main(): 


 import os 


 os.umask(0) 


 sem = posix_ipc.Semaphore(SEM_NAME, posix_ipc.O_CREAT, mode=0o666, initial_value=MAX_CONCURRENT) 


 sem.acquire() 



 def release_semaphore(signum, frame): 


 print("exiting due to signal" + str(signum)) 


 sem.release() 


 sem.close() 


 sys.exit(1) 


 signal.signal(signal.SIGTERM | signal.SIGINT, release_semaphore) 



 try: 


 subprocess.call([PROGRAM, *sys.argv[1:]]) 


 finally:


 sem.release()


 sem.close()



if __name__ =="__main__":


 main()




回答 1:

你的目录 /dev/shm/ 有 sticky t set:


$ ll/dev/shm -d 


drwxrwxrwt 2 root root 60 mar 27 08:36/dev/shm/



在 askubuntu.com 上的引用:

,那是什么

一个粘附位是在目录中设置的权限位,只允许该目录的所有者或者 root 用户删除或者重命名文件。 没有其他用户拥有删除由其他用户创建的文件所需的特权。

为了避免删除关键文件夹及其内容( 子目录和文件),这是一种安全措施,但其他用户拥有完全权限。

有关更多详细信息,请参见


回答 2:

/dev/shm 目录具有"置顶位"设置( 尾部'') - 有关详细信息/结果,请参见 man chmod

建议修复:在 /dev/shm 中创建没有sticky位集的子目录,并将它的用于信号量文件。

man chmod

字母rwxXst选择文件模式位 [...] 限制删除标志或者粘滞位( t ) 。
[... ]
限制删除标志或者STICKY位
限制删除标志或者粘滞位是单个位,它的解释取决于文件类型。 对于目录,除非他们拥有文件或者目录,否则不会在目录中使用/tmp. [... ] 。



USE  用户  CAN  permission  
相关文章