Linux

Linux & NFS:文件所有權的原子比較和交換

  • July 17, 2018

我的 IT 部門犯了一個錯誤,並將文件系統上的每個文件都更改為root:OurGroup. 然後他們的自動備份(即.snapshop)系統創建了一個快照,所以我們不再有以前的權限的參考。

我正在嘗試與他們合作製作一個腳本,該腳本將設置 set-uid 位並由 root 擁有,使用者可以呼叫該腳本以根據需要將文件/目錄重新分配給他們。

我預計他們不會想要一個只會給他們 chown 任何東西的腳本,而是可能願意創建一個新使用者,為該使用者 chown 一切,然後有一個使用者可以呼叫的腳本,該腳本將擁有 chown 文件如果它由其他使用者擁有,則給他們。

但是,為了避免競爭條件,我想找到一種方法來 chown if-and-only-if 該文件由該使用者擁有。但是這裡有一個競爭條件:如果我在兩個單獨的呼叫中執行此操作並且兩個使用者同時在一個文件上執行此腳本,則可能會導致衝突。相反,我想在一次通話中“更改所有者,如果所有者是使用者”,而不是“如果所有者是使用者”,然後是“更改所有者”

是否有用於文件所有權的原子比較和交換原語?

但是,為了避免競爭條件,我想找到一種方法來 chown if-and-only-if 該文件由該使用者擁有。但是這裡有一個競爭條件:如果我在兩個單獨的呼叫中執行此操作並且兩個使用者同時在一個文件上執行此腳本,則可能會導致衝突。相反,我想在一次通話中“更改所有者,如果所有者是使用者”,而不是“如果所有者是使用者”,然後是“更改所有者”

您似乎暗示,一旦文件的所有權從更改root:OurGroup為更正常的東西,例如user1:department-name 第二個使用者不應該再次將所有權從更改user1:department-nameuser2:some-team.

但這並不是真正的問題……

問題不是兩個使用者同時執行腳本,或者chown一個接一個或同時執行命令,問題要困難得多:

當多個使用者聲稱擁有同一個文件或目錄的所有權時,你將如何解決衝突?

想像一下,執行您的腳本的第一個使用者只是選擇了每個文件和目錄……

當所有文件從root:OurGroupUID:GID 轉換為所有權時,您的問題是否得到解決,user1:department-name並且所有權將被正確恢復?並且是否應該拒絕

來自只想擁有的 user2 的後續執行?<path>/Department-Name/User1's files/*


正如@Lacek 所提到的 - 您最好的選擇是使用較舊的備份作為目前文件系統中仍然存在的任何文件的所有權的模板,並且只關注備份中不存在的新創建的文件。(第一級方法為這些文件提供與封閉目錄相同的所有者)。

chmod以及該命令chown支持一個--reference標誌。您可以從備份位置指向現有文件,chown並將使用該參考文件/目錄的所有者和組,而不必直接指定 OWNER:GROUP 值,即:

cd /old-backup-of-nfs-share/
find . -exec chmod -v --reference='{}' /current-nfs-mount/'{}' \;

引用自:https://serverfault.com/questions/922301