서비스가 중단된 후 남겨진 일부 정크 공유 메모리 파일을 정리하려고 합니다. 서비스는 시스템 사용자 및 특정 그룹으로 실행됩니다. 나는 그룹의 구성원이지만 공유 메모리를 삭제할 수 없습니다.
$ 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
루트로 파일을 삭제하는 데 문제가 없습니다. 내가 프로세스를 실행(및 충돌)하는 경우(파일을 소유한 사용자) 파일을 삭제하는 데 문제가 없습니다.
낳다
문제를 입증하는 가장 쉬운 방법은 프로세스를 직접 실행하고 일부 정크 파일을 다른 사용자가 소유한 것처럼 변경하는 것입니다.
$ /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
몇 가지 솔루션+a 또는 +i 속성을 확인하려면 lsattr을 사용하는 것이 좋습니다.
$ 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-
답변1
파일을 삭제할 때 중요한 것은 파일 권한이 아니라 파일이 위치한 디렉터리의 권한입니다.
귀하의 경우에는 모든 사람이 디렉토리에 대한 쓰기 권한을 가지고 있지만 디렉토리에는 "고정 비트" 세트( t
권한 문자열 끝에)도 있습니다.
이러한 디렉토리에서 파일 삭제는 다르게 작동하므로 다음과 같이 해야 합니다.소유자파일의 소유자, 고정 디렉터리의 소유자 또는 파일을 삭제할 수 있는 루트입니다.
sticky(8)
다음은 OpenBSD 시스템의 매뉴얼 입니다 :
끈적한 디렉토리
"고정 비트"가 설정된 디렉터리는 파일 삭제에 제한을 둡니다.사용자는 디렉터리에 대한 쓰기 권한이 있고 파일 소유자, 디렉터리 소유자 또는 수퍼유저인 경우에만 고정 디렉터리의 파일을 삭제하거나 이름을 바꿀 수 있습니다.. 이 기능은
/tmp
공개적으로 쓰기 가능해야 하지만 사용자가 서로의 파일을 임의로 삭제하거나 이름을 바꾸는 권한을 거부해야 하는 디렉터리에 효과적으로 적용될 수 있습니다 .
Ubuntu에서 chmod(1)
매뉴얼에는 동일한 정보가 있습니다.
제한 제거 플래그 또는 고정 비트
제한된 제거 플래그 또는 고정 비트는 파일 형식에 따라 해석이 달라지는 단일 비트입니다. 디렉터리의 경우 권한이 없는 사용자가 파일이나 디렉터리를 소유하지 않는 한 디렉터리의 파일을 삭제하거나 이름을 바꾸는 것을 방지합니다.;이를 디렉토리에 대한 제한된 삭제 플래그라고 하며 일반적으로 전역적으로 쓰기 가능한 디렉토리(예:
/tmp
일부 이전 시스템의 일반 파일)에서 발견됩니다. 이 비트는 프로그램의 텍스트 이미지를 스왑 장치에 저장하여 런타임에 더 빠르게 로드합니다. 끈끈한 비트라고 불렀습니다.