【问题标题】:OSX: detect 'restricted' filesystem flag programmaticallyOSX:以编程方式检测“受限”文件系统标志
【发布时间】:2018-12-12 00:54:31
【问题描述】:

从 El Capitan 开始,系统获得了系统完整性保护,它不允许某些文件夹和文件的某些活动。使用终端“ls lO”命令,您可以查看特定文件或文件夹具有的标志。

drwxr-xr-x@   3 root  wheel  hidden                96 Aug 12  2014 opt
drwxr-xr-x    6 root  wheel  sunlnk,hidden        192 Nov 28 15:14 private
drwxr-xr-x@  64 root  wheel  restricted,hidden   2048 Nov 29 13:48 sbin
lrwxr-xr-x@   1 root  wheel  restricted,hidden     11 Nov 28 15:13 tmp -> private/tmp
drwxr-xr-x@  10 root  wheel  restricted,hidden    320 Nov 28 15:21 usr
lrwxr-xr-x@   1 root  wheel  restricted,hidden     11 Nov 28 15:13 var -> private/var

我对“受限”标志感兴趣。在不执行终端命令的情况下,如何使用 Swift 找到它?

我想强调的是,在代码中执行 Process() 并不是一种适合需求的方法。

“隐藏”标志可以通过此处URLResourceKey 的“isHidden”属性检测到。但是,没有任何关于“限制”的内容。

有人能指出正确的方向吗?

【问题讨论】:

    标签: swift macos


    【解决方案1】:

    ls 工具上的-O 选项列出的内容是文件标志。这些可以通过 BSD 层中的stat() 函数读取,并在结果结构的st_flags 字段中找到。

    ls 的输出中的“restricted”标志对应于SF_RESTRICTED,因此您可以通过执行以下操作来读取它:

    func isRestricted(at url: URL) throws -> Bool {
        let flags: UInt32 = try url.withUnsafeFileSystemRepresentation { fsRep in
            var info = stat()
    
            if stat(fsRep, &info) != 0 {
                guard let code = POSIXError.Code(rawValue: errno) else {
                    throw CocoaError(.fileReadUnknown)
                }
    
                throw POSIXError(code)
            }
    
            return info.st_flags
        }
    
        return flags & UInt32(bitPattern: SF_RESTRICTED) != 0
    }
    

    【讨论】:

      猜你喜欢
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      • 2010-12-28
      • 2017-06-24
      • 2017-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多