
내 질문은 다음과 비슷합니다이 다른 것, 새로 생성된 파일에 대해 묻는 경우는 제외됩니다.
내 Unix 상자에서 사용자는앨리스,단발그리고수코양이그룹에 있습니다수코양이.
Tomcat 서버의 구성 파일은 사용자 tomcat이 소유하고 tomcat 그룹에 속합니다.
alice와 bob이 파일을 편집할 수 있도록 이 파일의 권한을 그룹별로 읽고 쓸 수 있도록 변경했습니다.
그러나 편집 후에는 파일을 편집한 마지막 사용자가 파일을 소유하게 되는 것을 확인했습니다.
큐:Alice와 Bob이 소유권을 변경하지 않고도 파일을 편집할 수 있도록 권한을 변경할 수 있습니까?
어쨌든 파일을 편집하면 소유권이 어떻게 변경되나요?
답변1
결과 사용자파일의 내용은 편집자가 수행하는 작업에 따라 다릅니다. 일부 편집자는 파일을 자르고 (inode를 변경하지 않고) 파일 위에 덮어쓰는 방식으로 파일을 저장합니다. 그리고 일부 편집자는 파일 이름을 다른 이름( 일반적 file
으로 to file~
)으로 바꾸고 원본 이름으로 새 파일을 만듭니다. 원본 파일을 수정하면 소유자가 동일하게 유지되고 새 파일을 생성하면 생성 프로세스의 UID가 새 파일을 소유하게 됩니다.
내가 Debian에 있는 편집기 중 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에 유지 관리되고 별도의 프로세스(자동화 가능)를 통해 배포됩니다. 그렇게 하면 이러한 모든 소유권 문제를 피할 수 있습니다.