내 문제는 다음과 비슷합니다또 다른, 새로 생성된 파일에 대해 묻는 것 외에도
내 Unix 상자에서 사용자는앨리스,단발그리고수코양이그룹에서수코양이.
Tomcat 서버의 구성 파일은 사용자 tomcat과 그룹 tomcat이 소유합니다.
alice와 bob이 파일을 편집할 수 있도록 이 파일에 대한 권한을 그룹별로 읽기-쓰기로 변경했습니다.
그러나 편집 후에는 해당 파일을 마지막으로 편집한 사용자가 소유하게 되는 것을 확인했습니다.
묻다:Alice와 Bob이 소유권을 변경하지 않고 파일을 편집할 수 있도록 권한을 변경할 수 있습니까?
파일을 편집하면 소유권이 어떻게 변경되나요?
답변1
결과 사용자파일의 내용은 편집자의 역할에 따라 다릅니다. 일부 편집자는 파일을 자르고 덮어써서(inode를 변경하지 않고) 파일을 저장합니다. 일부 편집자는 파일 이름을 다른 이름(일반적 file
으로 file~
)으로 바꾸고 원래 이름으로 새 파일을 만듭니다. 소유자가 변경되지 않도록 원본 파일을 수정하고, 생성 프로세스의 UID가 새 파일을 소유하도록 새 파일을 만듭니다.
내가 데비안에서 사용하는 편집기, nano
및 joe
, 그리고 nvi
( vim
최소 버전에서는 vim-tiny
) 내부 재정의가 있는 것 같습니다. vim
Emacs의 기능을 구성할 수 있다고 생각합니다 .
스티븐은 다음과 같이 논평합니다.원자적 업데이트. 내부 재생성의 문제점은 파일이 0 길이로 잘린 다음 작성된다는 것입니다. 모든 데이터를 쓰기 전에 다른 프로세스가 이를 열고 읽을 수 있습니다.
file.new
예를 들어 새 버전을 생성한 다음 이름을 file.new
으로 변경 하면 원자 업데이트가 수행됩니다 . 이렇게 하면 생성 하고 연결할 file
수 있는 백업 파일이 남고 으로 이름이 변경됩니다 . 이름으로 파일에 액세스하는 모든 프로세스는 이전 버전이나 새 버전을 가져오며 그 사이에는 아무것도 가져오지 않기 때문에 이름 바꾸기는 원자적입니다. 물론 열려 있는 파일 핸들은 열려 있는 파일을 가리키며 파일에 대한 일관된 보기를 제공합니다.file.new
file
file~
file.new
file
~에서파일 권한관점에서 볼 때 동일한 파일(inode)을 저장하려면 파일 자체(디렉토리 아님)에 대한 쓰기 액세스가 필요하고, 새 파일의 이름을 바꾸고 생성하려면 디렉터리(원본 파일이 아님)에 대한 쓰기 액세스가 필요합니다.
(누군가 공유 디렉터리에서 파일을 생성하거나 수정하고 그룹에 쓰기 액세스 권한을 부여하는 것을 잊어버린 경우 이름 바꾸기 및 다시 생성은 파일 권한을 수정하는 방법이기도 합니다.)
답변2
~처럼설명했다통과이르카초, 사용 중인 편집기가 저장할 때 새 파일을 생성하는지 여부는 제어할 수 없습니다.소유자파일. 하지만 당신이 정말로 관심을 갖는 것은 Tomcat이 여전히 파일을 읽을 수 있는지 확인하는 것입니다. 해당 그룹이 있는지 확인하고 tomcat
(그리고 해당 그룹이 읽을 수 있는지 확인하고) setgid
이를 상위 파일 비트에 설정 하면 됩니다. 새 파일을 강제로 실행하려면목차:
chmod g+s .
따라서 bob
파일을 다시 생성하는 편집기를 사용하여 파일을 편집하면 편집된 파일은 결국 Tomcat의 소유가 되며 bob:tomcat
Tomcat은 여전히 해당 파일을 읽을 수 있습니다(적어도 일반적으로 umask
). 그룹이 상위 디렉터리에 쓸 수 있는 한 tomcat
그룹의 모든 사용자는 해당 디렉터리의 파일을 편집할 수 있습니다(파일을 다시 만드는 경우에만).
그러나 프로세스 변경을 고려하는 것이 좋습니다. Tomcat이 읽는 위치에서 파일을 직접 편집하면 안 됩니다. 이상적으로 이러한 파일은 일종의 VCS에서 유지 관리되고 별도의 프로세스(아마도 자동화)를 통해 배포됩니다. 이렇게 하면 모든 소유권 문제를 피할 수 있습니다...