2 回答

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超7個(gè)贊
值得注意的是,除了八進(jìn)制表示不匹配之外,字符串表示也不匹配:
"-rwsrwsrwt" != "ugtrwxrwxrwx"`
這不是由于 Go 實(shí)現(xiàn)的限制,而是它以與系統(tǒng)無(wú)關(guān)的方式實(shí)現(xiàn)的結(jié)果。
從文檔(強(qiáng)調(diào)我的):FileMode
FileMode 表示文件的模式和權(quán)限位。這些位在所有系統(tǒng)上都具有相同的定義,因此可以將有關(guān)文件的信息從一個(gè)系統(tǒng)移動(dòng)到另一個(gè)系統(tǒng)。并非所有位都適用于所有系統(tǒng)。
因?yàn)閷?shí)現(xiàn)并不是為了模仿特定系統(tǒng)的行為,所以不能保證輸出與給定環(huán)境中的本機(jī)工具相匹配。但是,所有相關(guān)數(shù)據(jù)都可以使用。
如果你想模仿你的輸出,stat你可以編寫(xiě)一些邏輯來(lái)做到這一點(diǎn)。
這是一個(gè)處理八進(jìn)制表示的快速示例:
package main
import (
"fmt"
"os"
)
func UnixPerm(m os.FileMode) (p uint32) {
p = uint32(m.Perm())
if m & os.ModeSetuid != 0 {
p |= 04000
}
if m & os.ModeSetgid != 0 {
p |= 02000
}
if m & os.ModeSticky != 0 {
p |= 01000
}
return p
}
func main() {
info, _ := os.Stat("example_file")
fmt.Printf("FileMode.Perm(): %04o\n", info.Mode().Perm())
fmt.Printf("UnixPerm(): %04o\n", UnixPerm(info.Mode()))
}
輸出:
$ go run fileperm.go
FileMode.Perm(): 0777
UnixPerm(): 7777
$ stat --printf "Permissions: %a\n" example_file
Permissions: 7777

TA貢獻(xiàn)1807條經(jīng)驗(yàn) 獲得超9個(gè)贊
我需要使用 golang 來(lái)獲取給定文件的文件權(quán)限(特別是 SUID 位)
好的,添加這個(gè):fmt.Printf("File has SUID bit set: %t\n", info.Mode()&os.ModeSetuid != 0)
golang 結(jié)果不一致,因?yàn)?ugtrwxrwxrwx != 0777
info.Mode()
和info.Mode().Perm()
是不同的東西,雖然相關(guān)。
info.Mode().Perm()
包含 的子集info.Mode()
。info.Mode().Perm()
只是一個(gè)簡(jiǎn)單的便利功能,可以使用常量 mask 進(jìn)行按位與0777
。
這是go的限制嗎?
不
- 2 回答
- 0 關(guān)注
- 129 瀏覽
添加回答
舉報(bào)