【问题标题】:unable to obtain all permission bits无法获得所有权限位
【发布时间】:2016-07-15 17:47:28
【问题描述】:

在我的外壳上,我有一个文件,我用sudo chmod 4755 <file> 更改了这个文件的权限。在此文件上调用 lstat 后,我看到了有关其权限的正确信息,特别是它的权限模式为 4755。

在我的 golang 程序中,我没有获得正确的权限模式位是否有原因?难道我只是错误地格式化了我从 FileInfo().Mode().Perm() 得到的结果?会不会是高3位“特殊”?

感谢您的帮助!

【问题讨论】:

    标签: go


    【解决方案1】:

    简短回答: 高三位是特殊的,需要单独访问。

    详细回答:documentation 解释说,9 个(通常为 12 个)最低有效位被视为标准 Unix 权限。

    文档还定义了您正在调用的 Perm() 函数的行为:

    func (m FileMode) Perm() FileMode
    
    Perm returns the Unix permission bits in m.
    

    这意味着 perm 未定义为返回您正在寻找的任何其他位。

    此外,source code 表明Perm() 函数正在用0777 屏蔽从FileMode() 返回的值,导致忽略最初的三位。

    ModeSetuidModeSetgidModeSticky 位(分别为 4、2 和 1)必须分别作为 FileMode 类型的常量进行访问。通过执行您自己的掩码来做到这一点。

    为了确定是否设置了粘滞位,例如,执行 (FileInfo().Mode() & ModeSticky) != 0。这同样适用于ModeSetuidModSetgid

    【讨论】:

    • 你是说这些位被屏蔽了吗?我尝试做类似 (Perm() & ModeSticky) 的事情,但我认为这不是正确的做法......
    • 我用更具体的说明更新了我的答案。用任何东西掩盖Perm() 无济于事。您正在寻找的模式位已经被Perm() 返回的值屏蔽掉了。在值被屏蔽之前,您需要进一步访问该变量。
    • 非常感谢!我只需要稍微调整一下我的实现。
    猜你喜欢
    • 1970-01-01
    • 2015-11-12
    • 2016-01-21
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 2016-10-09
    • 2013-01-24
    • 1970-01-01
    相关资源
    最近更新 更多