
我的問題類似於另一個,除了詢問新建立的文件。
在我的 Unix 盒子裡,用戶愛麗絲,鮑伯和雄貓在群組中雄貓。
Tomcat 伺服器的設定檔由使用者 tomcat 和群組 tomcat 擁有。
我已將此文件的權限變更為按群組可讀可寫,以便 alice 和 bob 可以編輯文件。
但是,我注意到編輯後,該文件將歸最後編輯它的用戶所有。
問:是否可以更改權限,以便 Alice 和 Bob 可以編輯文件,而不更改其擁有權?
編輯文件如何改變其所有權?
答案1
由此產生的用戶文件的內容取決於編輯器的作用。一些編輯器透過截斷檔案並覆蓋檔案(不更改索引節點)來保存檔案。有些編輯器將檔案重新命名為另一個名稱(通常是file
to file~
),並使用原始名稱建立一個新檔案。修改原始檔案使擁有者保持不變,建立新檔案使新檔案由建立進程的 UID 擁有。
我在 Debian 上使用的編輯器中,nano
和joe
,以及nvi
(vim
中的最小版本vim-tiny
)似乎就地覆蓋。儘管我認為vim
Emacs 的功能可能是可設定的。
史蒂芬評論關於原子更新。就地重新建立的問題是檔案被截斷為零長度,然後寫入。另一個進程可以在寫入所有資料之前打開並讀取它。
原子更新將透過建立新版本來完成,例如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 中維護,並透過單獨的流程(可能是自動化的)進行部署。這樣你就可以避免所有這些所有權問題...