Linux 将文件可存取的身份分为三个类别,分别为owner/group/others,且三种身份各有 read/write/execute 等权限

拥有者、群组

举例说明,前提:王家有三兄弟,王大毛、王二毛、王三毛,都有自己的房间,共同拥有一个客厅

  • 使用者: 王家三人有各自的房间,王二毛虽然可以进王三毛的房间,但是王二毛不能翻王三毛的抽屉,因为抽屉里可能有王三毛的私人物品
  • 群组: 由于共同拥有客厅,王家三兄弟可以在客厅看电视,看报纸,只要是客厅的东西,三兄弟都可以随便使用
  • 其他人: 张小猪,与王家没有关系。除非王家认识张小猪,然后邀请张小猪,否则张小猪永远无法进入王家
  • root: 可以查看所有

默认情况下,系统上的账号与一般身份使用者都记录在 /etc/passwd 文件内,个人密码都记录在 /etc/shadow 文件内,所有的组名都记录在 /etc/group 文件内

文件属性

主要通过 ls -al 命令查看文件属性

-rwx--x--x   1 bi  staff  12101116  9  9 09:57 dep

[档案类型权限][连结数][档案拥有者][档案所属群组][档案容量][档案修改日期][档案名称]
  • 第一栏代表文件的类型与权限

第一个字符代表这个文件是:目录、文件或者链接文件等

  1. d 则是目录
  2. - 则是文件
  3. l 则是连结档(link file)
  4. b 可供存储的接口设备
  5. c 串行端口设备

接下来的字符中,以三个为一组,且均为 rwx 三个参数组合,r 代表为 readw 代表为 writex 代表为 execute

  1. 第一组为 文件拥有者的权限
  2. 第二组为 同群组的权限
  3. 第三组为 其他非本群组的权限

rwx 所在的位置是不会改变的,有该权限就会显示字符,没有该权限就变成减号(-)就是了

  • 第二栏代表有多少档名连结到此节点

每个文件都会将他的权限与属性记录到文件系统的 i-node 中,不过我们使用目录树却使用文件名来记录,因此每个档名就会连结到一个 i-node。

这个属性记录的就是有多少不同的档名连结到相同的 i-node

  • 第三栏代表这个文件的拥有者

  • 第四栏代表这个文件所属的群组

  • 第五栏代表文件的容量大小,默认单位为 bytes

  • 第六栏代表文件的建档日期或者最近修改日期

这一栏的内容分别为日期(月/日)及时间,如果时间久远,则时间部分会显示年份

  • 第七栏代表文件名

改变文件的属性和权限

  • chgrp 改变文件所属群组
  • chown 改变文件所有者
  • chmod 改变文件的权限,SUID,SGID,SBIT 等特性

chgrp

chgrp 改变文件的群组,是 change group 的缩写,要被改变的组名

$ chgrp [-R] dirname/filename

# [-R] 递归,连同次目录下的所有文件、目录都更新成为这个群组

$ chgrp users install.log

chown

chown 即为 change owner 缩写,改变所有者。还可以顺便直接修改群组的名称

$ chown [-R] 账号名称 文件或目录
$ chown [-R] 账号名称:组名 文件或目录

# -R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件都变更

$ chown bin install.log
$ chown root:root install.log

chmod

chmod 文件权限的修改,权限有两种设定方法,分别为数字或者符号进行权限变更

数字类型改变文件权限

文件基本权限就有 9 个,分别是 owner/group/others 三种身份各自有自己的 read/write/execute 权限,文件的权限字符为 -rwxrwxrwx,可以使用数字代表各个权限

r:4w:2x:1

每种身份各自权限分数需要累加,例如 -rwxrwx--- 的分数为

  • owner: rwx = 4 + 2 + 1 = 7
  • group: rwx = 4 + 2 + 1 = 7
  • other: --- = 0 + 0 + 0 = 0

所以该文件的权限数字就是 770

$ chmod [-R] xyz 文件或目录

xyz : 就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加。
-R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件都会变更

如果要权限要变成 -rwxr-xr-- 则权限数字为 [4+2+1][4+0+1][4+0+0]=754,所以命令为 chmod 754 filename 即可

符号类型改变文件权限

基本上就有 9 个权限为user、group、others 三种身份,则可以使用 u、g、o 来代表三种身份的权限,a 代表 all 即全部身份

$ chmod `u|g|o|a` `+|-|=` `r|w|x` 文件|目录

例如,设定一个文件的权限为 -rwxr-xr-x

  • user 具有可读、可写、可执行的权限
  • group、others 具有可读与执行的权限
$ chmod u=rwx,go=rx .bashrc

# 那个 u=rwx,go=rx 是连在一起的,中间并没有任何空格

如果不知道原先的文件属性,想增加文件每个人均有写入权限

$ chmod  a+w  .bashrc

参考资源