OSX:以编程方式检测"受限"文件系统标志

Ruz*_*ard 2 macos swift

从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
Run Code Online (Sandbox Code Playgroud)

我对"限制"标志感兴趣.如何在不执行终端命令的情况下使用Swift找到它?

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

可以通过此处URLResourceKey的 "isHidden"属性检测"隐藏"标志.然而,没有什么关于"受限制".

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

Cha*_*tka 5

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

输出中的"受限制"标志ls对应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
}
Run Code Online (Sandbox Code Playgroud)