macOS中的文件权限

查看文件的权限

输入如下命令可以查看文件权限:

# 查看当前目录下的所有文件权限
ls -l

# 查看指定文件的权限
ls -l | grep 文件名
复制代码

文件权限展示的含义

当我们输入上面的命令后,可以看到如下的展示:

image.png

上面红框框出的区域依次是:权限、链接数、所有者、所有组、文件大小、最后修改日期、文件名称。

第一个红框内就是我们需要的权限内容,我们解读下这些字母表示的含义:

第一个字符表示的是文件的类型:

  • i: 符号链接文件
  • d: 文件夹
  • -: 普通文件

后面9个字母表示的是文件的权限:

  • r: 有读取的权限
  • w: 有写入的权限
  • x: 有执行的权限
  • -: 没有该权限

其实文件一共分为3个权限,分别是:[read][write][execute],这样说的话只要3个字母就行了,之所以要9个字母,是因为要对应的不同身份,一共分为3个身份:

  • [user]: 上面红框中的所有者
  • [group]: 上面红框中所属组的人员
  • [other]: 不是上面两种人员的其他人

每3个字母表示的对应身份对于该文件的权限,正好9个字母。

改变文件权限

改变文件权限的命令是chmod,一共有两种形式

数字类型

我们把各个权限设成一个数值:

  • r: 4
  • w: 2
  • x: 1

如果一个文件权限设为[–rwxr-xr-x],那么各个身份的权限值为:

  • User : 4+2+1 = 7
  • Group: 4+0+1 = 5
  • Other: 4+0+1 = 5

最后生成的命令为:

chmod 755 文件名
复制代码

符号类型

符号类型的命令为:

 chmod [u、g、o、a][+、-、=][r、w、x] 文件名称
复制代码

各个字符的意思:

  • u: 用户所有者User
  • g: 用户所在组Group
  • o: 其他类型角色Other
  • a: 所有角色All,就是上面三种角色的集合
  • +: 添加权限
  • -: 去掉权限
  • =: 设置权限
  • r: 读取权限
  • w: 写入权限
  • x: 执行权限

例如命令:

 chmod u+r 文件名称
复制代码

该命令是指给用户User添加读取权限

我们经常碰到如下命令:

chmod +x 文件名称
复制代码

这里没有看到用户角色,如果不设置用户角色,那么默认是All,所以这句话的意思是给所有角色添加执行权限。

文件的扩展属性权限

细心的话可以发现,我们前面展示权限的时候发现,有些文件的末尾有@符号,这些都代表着有扩展属性,我们可以用如下命令看看有哪些额外信息:

ls -l@
复制代码

我们看到这些带有@符号都有额外信息字段:

image.png

你可以把扩展属性看成一个[String: Data]的字典,红框框起来的就是key,后面的数字是Data的长度,具体操作扩展属性的命令是xattr,下面列举下该命令的用法:

# 显示一个文件的存在的扩展属性
xattr 文件名

# 显示一个文件存在的扩展属性及这个属性的值:
xattr -l 文件名

# 给一个文件添加 com.example.color 属性:
xattr -w com.example.color 文件名

# 清除一个文件的 com.example.color 属性:
xattr -d com.example.color 文件名

# 清除一个文件夹内所有文件的 com.example.color 属性:
xattr -d -r com.example.color 文件夹

# 清除一个文件的所有扩展属性:
xattr -c 文件名
复制代码

我们随便找一个文件试下:

image.png

我们看到com.apple.quarantine这个属性直接能看到他的值,com.apple.macl只能看到二进制数据,从边上的ASCII码也看不出啥。所以com.apple.quarantine的Data是ASCII码编码的,而com.apple.macl的数据我也不知道是啥。

我们也可以用我们熟悉的OC或者Swift代码获取扩展属性:

let manager = FileManager.default
let attr = try! manager.attributesOfItem(atPath: path)
let exten = attr[FileAttributeKey.init("NSFileExtendedAttributes")] as! [String: Data]
复制代码

有些数据是ASCII码,例如刚才的com.apple.quarantine属性,看下如何获取ASCII码属性值:

let str = String(data: value, encoding: .ascii)
复制代码

有些数据是plist文件格式的,例如com.apple.metadata起头的,看下如何获取plist的属性值:

var format = PropertyListSerialization.PropertyListFormat.binary
let custom = try? PropertyListSerialization.propertyList(from: value, options: PropertyListSerialization.ReadOptions(rawValue: 0), format: &format)
复制代码

当然肯定还有格式的数据,等待你自己慢慢尝试,这些格式都不是固定的。你也可以加入自定义的扩展属性,数据格式也可以自己规定,比如说utf8,这些就不展开说了。

值得说的一点,现在好多网上下载的应用,不受信任打不开,还有些应用第一打开,就会提示从某某地方的来源,你是否确认打开,都是扩展属性的问题。如果真的碰上打不开的应用,删除com.apple.quarantine属性,八成就能打开了。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享