亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

是否有查找完整文件權限的功能?

是否有查找完整文件權限的功能?

Go
慕哥6287543 2022-05-18 14:42:00
我需要使用 Go 來獲取給定文件的文件權限(特別是 SUID 位)。以下是示例文件的權限。$ touch example_file.test$ chmod 7777 example_file.test$ ls -ltra example_file.test    -rwsrwsrwt 1 luke users 0 Feb 25 21:53 example_file.test$ stat -c "%a %n" example_file.test     7777 example_file.test這是一個說明問題的小程序。func main() {    info, _ := os.Stat("example_file.test")        fmt.Println(info.Mode().String())                        // ugtrwxrwxrwx        fmt.Println(info.Mode().Perm().String())                 // -rwxrwxrwx        fmt.Printf("permissions: %#o\n", info.Mode().Perm())     // permissions: 0777}Go 結果不一致,因為ugtrwxrwxrwx != 0777.文檔中的以下引用表明這可能是一個跨平臺兼容性問題。FileMode 表示文件的模式和權限位。這些位在所有系統上都具有相同的定義,因此可以將有關文件的信息從一個系統移動到另一個系統。并非所有位都適用于所有系統。唯一需要的位是目錄的 ModeDir。type FileMode uint32 定義的文件模式位是 FileMode 的最高有效位。九個最低有效位是標準的 Unix rwxrwxrwx 權限。這些位的值應該被認為是公共 API 的一部分,并且可以用于有線協議或磁盤表示:它們不能更改,盡管可能會添加新的位。這是 Go 的限制嗎?
查看完整描述

2 回答

?
慕姐4208626

TA貢獻1852條經驗 獲得超7個贊

值得注意的是,除了八進制表示不匹配之外,字符串表示也不匹配:


"-rwsrwsrwt" != "ugtrwxrwxrwx"`

這不是由于 Go 實現的限制,而是它以與系統無關的方式實現的結果。


從文檔(強調我的):FileMode


FileMode 表示文件的模式和權限位。這些位在所有系統上都具有相同的定義,因此可以將有關文件的信息從一個系統移動到另一個系統。并非所有位都適用于所有系統。


因為實現并不是為了模仿特定系統的行為,所以不能保證輸出與給定環境中的本機工具相匹配。但是,所有相關數據都可以使用。


如果你想模仿你的輸出,stat你可以編寫一些邏輯來做到這一點。


這是一個處理八進制表示的快速示例:


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



查看完整回答
反對 回復 2022-05-18
?
函數式編程

TA貢獻1807條經驗 獲得超9個贊

我需要使用 golang 來獲取給定文件的文件權限(特別是 SUID 位)

好的,添加這個:fmt.Printf("File has SUID bit set: %t\n", info.Mode()&os.ModeSetuid != 0)

golang 結果不一致,因為 ugtrwxrwxrwx != 0777

info.Mode()info.Mode().Perm()是不同的東西,雖然相關。

info.Mode().Perm()包含 的子集info.Mode()。info.Mode().Perm()只是一個簡單的便利功能,可以使用常量 mask 進行按位與0777。

這是go的限制嗎?


查看完整回答
反對 回復 2022-05-18
  • 2 回答
  • 0 關注
  • 132 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號