編輯後如何維護文件的所有權?

編輯後如何維護文件的所有權?

我的問題類似於另一個,除了詢問新建立的文件。

在我的 Unix 盒子裡,用戶愛麗絲,鮑伯雄貓在群組中雄貓

Tomcat 伺服器的設定檔由使用者 tomcat 和群組 tomcat 擁有。

我已將此文件的權限變更為按群組可讀可寫,以便 alice 和 bob 可以編輯文件。

但是,我注意到編輯後,該文件將歸最後編輯它的用戶所有。

問:是否可以更改權限,以便 Alice 和 Bob 可以編輯文件,而不更改其擁有權?

編輯文件如何改變其所有權?

答案1

由此產生的用戶文件的內容取決於編輯器的作用。一些編輯器透過截斷檔案並覆蓋檔案(不更改索引節點)來保存檔案。有些編輯器將檔案重新命名為另一個名稱(通常是fileto file~),並使用原始名稱建立一個新檔案。修改原始檔案使擁有者保持不變,建立新檔案使新檔案由建立進程的 UID 擁有。

我在 Debian 上使用的編輯器中,nanojoe,以及nvivim中的最小版本vim-tiny)似乎就地覆蓋。儘管我認為vimEmacs 的功能可能是可設定的。


史蒂芬評論關於原子更新。就地重新建立的問題是檔案被截斷為零長度,然後寫入。另一個進程可以在寫入所有資料之前打開並讀取它。

原子更新將透過建立新版本來完成,例如file.new,然後重新命名file.newfile.留下備份文件,可以建立file.new、連結filefile~,然後重新命名file.newfile。重命名是原子的,因為任何按名稱存取檔案的程序都會取得舊版本或新版本,而不是兩者之間的任何版本。當然,任何開啟的文件句柄都會指向保持開啟的文件,從而提供文件的一致視圖。


來自文件權限從觀點來看,保存相同文件(inode)需要對文件本身(但不是目錄)進行寫入訪問,重命名並創建新文件需要對目錄(但不是原始文件)進行寫入訪問。

(重新命名和重新建立也是修復文件權限的一種方法,以防有人在共用目錄中建立或修改文件,但忘記授予群組對其的寫入存取權。)

答案2

作為解釋了經過伊爾卡丘,如果正在使用的編輯器在儲存時建立了一個新文件,則無法控制擁有者文件的。不過,您可能真正關心的是確保 Tomcat 仍然可以讀取檔案;您可以透過確保他們的群組是tomcat(並且他們可以被他們的群組讀取)來做到這一點,並且可以透過setgid在父檔案上設定該位元來對新檔案強制執行目錄

chmod g+s .

因此,如果bob使用重新建立文件的編輯器編輯文件,則編輯後的文件最終將歸 Tomcat 所有bob:tomcat,並且 Tomcat 仍然能夠讀取它(至少是典型的umask)。只要該tomcat群組可以寫入父目錄,該群組中的任何使用者都可以編輯該目錄中的檔案(如果只能透過重新建立它們)。

然而,我建議考慮改變你的流程;您可能不應該直接在 Tomcat 讀取檔案的位置編輯檔案。理想情況下,這些文件將在某種 VCS 中維護,並透過單獨的流程(可能是自動化的)進行部署。這樣你就可以避免所有這些所有權問題...

相關內容