1 回答

TA貢獻1858條經驗 獲得超8個贊
首先,正如Burak Serdar 在評論中指出的那樣,確保這確實是一個新文件,因為操作系統通常會在覆蓋現有文件時保留現有權限(盡管細節是特定于操作系統的,尤其是某些 Unix -ish 操作系統在此處清除 setuid/setgid)。
Unix/Linux 文件權限通過讓操作系統從程序請求被授予的權限中清除用戶請求被刪除的任何權限來工作。
也就是說,當調用創建新文件的文件系統操作時,您在代碼中提供了一種模式。在這種情況下,您提供0777的確實是rwxrwxrwx.
然而,與此同時,用戶的操作環境1包含另一種稱為umask的八進制模式。在這種情況下,它大概是022或----w--w-。這些權限將從您提供的權限中刪除0777 & (^022): is 0755which is rwxr-xr-x. 所以新創建的文件有模式rwxr-xr-x,或者0755,即使你的程序要求0777。
出于這個原因,大多數 Unix 程序在文件創建操作期間應該使用兩種模式之一:0777用于目錄和可執行文件,以及0666用于非可執行文件。用戶的 umask 將刪除不需要的權限:想要隱私的用戶可以將他們的 umask 設置為對于組和其他都077將刪除,只留下或酌情留下。rwx07000600
此規則的一個例外是,任何想要確保額外隱私的程序ssh(例如 -相關代碼,當它創建密鑰對時)都應該提供其模式,0600以便在第一個中沒有設置組和其他用戶權限位地方。
請注意,chmod呼叫沒有應用用戶的 umask 設置。如果您需要發現用戶的 umask 來計算chmod調用的正確值,請使用新的golang.org/sys/x/unixUmask函數或舊的syscallUmask函數。不幸的是,您必須提供一個新的umask 才能發現原來的umask。這將取代每個進程的 umask,直到您重新安裝原始值。因此,您可能希望在 init 函數中執行此操作,并將結果存儲在變量中以便妥善保管,同時恢復原始結果:
var Umask int
func init() {
Umask = unix.Umask(0777)
unix.Umask(Umask)
}
例如(假設新樣式;舊樣式syscall.Umask用法相同;都不返回任何錯誤)。但是,這使您的程序特定于 Unix。
- 1 回答
- 0 關注
- 292 瀏覽
添加回答
舉報