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
    • 最新
    • 标签
主页 / server / 问题 / 960189
Accepted
MateuszL
MateuszL
Asked: 2019-03-28 00:05:26 +0800 CST2019-03-28 00:05:26 +0800 CST 2019-03-28 00:05:26 +0800 CST

为什么其他用户即使拥有 o+rw 权限也不能删除 /dev/shm/xxx?

  • 772

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

$ 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 LTS

脚本代码为:

#!/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()
linux
  • 2 2 个回答
  • 1190 Views

2 个回答

  • Voted
  1. Best Answer
    Gerald Schneider
    2019-03-28T00:38:54+08:002019-03-28T00:38:54+08:00

    您的目录设置/dev/shm/了粘性位t:

    $ ll /dev/shm -d 
    drwxrwxrwt 2 root root 60 mar 27 08:36 /dev/shm/
    

    引用askubuntu.com 上的这个答案:

    那么粘性位是什么?

    粘性位是在目录上设置的权限位,它只允许该目录中的文件所有者、目录所有者或 root 用户删除或重命名文件。没有其他用户具有删除其他用户创建的文件所需的权限。

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

    有关更多详细信息,请参阅答案。

    • 3
  2. AnFi
    2019-03-28T00:39:31+08:002019-03-28T00:39:31+08:00

    /dev/shm目录设置了“粘性位”(尾随 't') -man chmod有关详细信息/后果,请参阅。

    建议修复:在/dev/shm没有设置粘性位的情况下创建子目录并将其用于您的信号量文件。


    man chmod

    字母 rwxXst 选择文件模式位 […] 限制删除标志或粘性位 (t)。
    […]受限删除标志或粘滞
    位
    受限删除标志或粘滞位是单个位,其解释取决于文件类型。对于目录,它防止非特权用户删除或重命名目录中的文件,除非他们拥有该文件或目录;这称为目录的受限删除标志,通常在像 /tmp 这样的全局可写目录中找到。[…]

    • 1

相关问题

  • Linux 主机到主机迁移

  • 如何在 Linux 机器上找到有关硬件的详细信息?

  • 如何在 Linux 下监控每个进程的网络 I/O 使用情况?

  • 在 RHEL4 上修改 CUPS 中的现有打印机设置

  • 为本地网络中的名称解析添加自定义 dns 条目

Sidebar

Stats

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

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

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

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve