Linux 基础 - 档案与权限(chgrp/chown/chmod)

参考资料: http://linux.vbird.org/linux_basic/0210filepermission.php#filepermission_perm

本文大纲:

当执行 ls -al 后,当前目录下所有档案的详情被列出

1
2
dr-xr-xr-x. 17 root root 4096 May 4 17:56 ..
-rw-------. 1 root root 1816 May 4 17:57 anaconda-ks.cfg
  • 第 1 列用一组字符组合来表示其类别和属性,该字符串的第一位标识该档案的类别,详情见后文,而后连续 9 个字符,每 3 个一组,表示该权限的拥有者同群组的其他用户其他用户对该档案的权限,例如 -rwxr-xr-- 表示一个档案的权限为:
    • 该档案为文件
    • 拥有者对其拥有读取,修改和执行权限
    • 同一群组中的其他用户对其拥有读取和执行权限
    • 其他用户对其仅有读取权限
  • 第 2 列表示有多少不同的档案名链接到该档案的 i-node,每个档案将会将它的权限与属性记录到档案系统的 i-node 中
  • 第 3 列表示档案的拥有者用户
  • 第 4 列表示该档案所属第群组
  • 第 5 列表示该档案所占用第磁盘空间,预设单位为 bytes
  • 第 6 列表示该档案的创建日期或修改日期
  • 第 7 列为档案名

修改档案属性及权限

更改群组

chgrp: 该指令为 change group 的缩写,目标群组必须在 /etc/group 中存在,使用 -R 指定递归改变父级目录下的群组:

1
$sudo chgrp <target-group> -R filename/directory

更改档案拥有者

chown 为 change owner 的缩写,目标用户必须在 /etc/passwd 中存在,可使用 -R 选项指定递归更改选项。

该命令还可以顺便修改群组,例如:

1
$sudo chown user1:group1 filename

可使用 . 或者 : 来隔开用户名和群组名,但如果在用户名中包含 . 字符,则容易造成混淆,所以一般建议使用 : 来隔开用户名和群组。

chown 也可通过 . 直接更改群组,如:

1
$sudo chown .group1 filename

更改群组一个常见的应用为,当通过 cp 复制一个档案时,也会同时复制命令执行者的属性与权限,此时更改属性和权限就显得尤其必要了

更改权限

chmod 为更改档案权限的指令,默认情况下,可使用字符来为三种角色指定权限,首先指定角色:

  • u: 代表拥有者,即 users
  • g: 代表拥有者群组,即 group
  • o: 代表其他,即 others
  • a: 代表所有,即 all

然后使用以下连字符修改权限:

  • =: 代表赋值,指定
  • +: 代表增加权限
  • -: 代表移除权限

例如 chmod u=rwx,go=r-x filename 表示设定档案的权限为 rwxr-xr-x,或 chmod g+w filename 在不知道原来权限的基础上增加群组的写入权限。

chmod 可以使用数字或字符来更改档案的权限,数字代表的含义为:

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

每种身份的权限由三者数字累加起来得到一个数字,例如 chmod 740 filename 表示拥有者具有 rwx 权限,同群组其他用户具有 r-- 权限,其他用户则具有 --- 权限。

权限的意义

权限分为三种:

  • r: 读取权限
    • 针对文件:读取文件的实际内容
    • 针对目录:读取目录结构清单,例如使用 ls 指令
  • w: 写入权限
    • 针对文件: 可编辑,新增或修改文件的内容,但不含删除操作
    • 针对目录: 具有对改动该目录结构的权限,包含:
      • 新建文件与目录
      • 删除已经存在的文件或目录(不受被删除文件和目录的权限限制)
      • 重命名文件或目录
      • 移动文件或目录
  • x: 执行权限
    • 针对文件: 执行文件(如果该文件可执行)
    • 针对目录: 指示用户能否进入该目录,如执行 cd 指令
      表格形式如下:
元件 内容 迭代物件 r w x
文件 详细资料 文件夹文件 读取文件内容 修改文件内容 执行文件内容
目录 目录名称 可分类抽屉 读取目录内容 修改目录结构 进入该目录

除了文件和目录两种档案之外,还有其他一些档案类型:

  • 常规文件(regular file),常规文件档案,权限的第一栏为 -,例如 -rwxrwxrwx,常规文件又可分为三类:
    • 文本文件: 可以直接读取的内如,几乎所有的配置型文件都属于这一类,可执行 cat <filename> 来查看文件内容
    • 二进制文件: Linux 系统仅认知且可执行二进制文件(binary file),script 脚本及批处理不算,例如,当执行 cat 指令时,cat 就是一个 binary file
    • 数据文件(data): 供不同的程序自己使用的特殊格式的文件,例如,当使用 Linux 登入时,系统会将登录日志记录在 /var/log/wtmp 文件内,但该文件是一个数据文件,只能通过 last 指令读出来,若使用 cat 读取该文件会显示乱码
  • 目录(directory): 目录档案,权限第一栏为 d,例如 drwxrwxrwx
  • 链接(link): 类似于 windows 系统的快捷方式,第一栏为 l,例如 lrwxrwxrwx
    • 软链接: 见 inode
    • 硬链接: 见 inode
  • 设备与装置档案: 系统周边及存储等相关的档案,通常集中在 /dev 目录下,他们又分为:
    • 区块(block)设备档案: 存储资料,提供系统随机存储的设备,硬盘与软盘都属于这类,第一栏为 b,可查阅 /dev/sda 下的内容。
    • 字符(character)设备档: 亦即外设,如键盘,鼠标等,这些设备的特点是「一次性读取」,不能截断输出,例如,不能让鼠标「跳跃到」另外一个地方,而是「连续滑动」到另一个地方。权限第一栏为 c
  • 数据接口档案(sockets): 主要用于网络数据通信,第一栏为 s,该类型通常位于 /run/tmp 这些目录中
  • 数据传输接口档案(FIFO, pipe): FIFO(first in first out)也是一种特殊的档案类型,它是为了解决多个解决同时存取一个文件所造成的错误问题。第一栏为 p

设备是系统文件,最好不好随意修改。

windows 系统中可执行文件通常带有 .exe .bat 等扩展名,而 Linux 系统中基本没有所谓的「扩展名」概念,一个 Linux 文件能否被执行与它的权限栏 10 个属性有关,与其文件名或扩展名没有任何关系,只要其权限中带有 x 属性,该文件就可以被执行。

为了保持可读性,通常还是会在文件末尾加上扩展名以让用户了解该文件是什么,常用的扩展名有:

  • *.sh: 脚本或批处理文件,因为这些文件基于 shell 写出,所以为其添加了 .sh 扩展名
  • *Z, *.tar, *.tar.gz, *.zip, *.tgz: 压缩包文件,由不同的压缩程序如 gunzip, tar 等输出,所以根据不同的程序命名不同的扩展名
  • *.html, *.php: php 语法写成的网页文件等

总之,Linux 的文件名仅仅是为了让用户了解其用途而已,能否执行取决于文件权限,如果 /bin/ls 文件的可执行权限被移除,那么 ls 便无法使用了。

关于档案的几点注意:

  • 单一文件或目录文件名长度不超过 256 字节
  • 名称中不得包含 * ? > < ; & ! [ ] | \ ‘ “ ` ( ) { } 等特殊字符
  • 第一个字符为 . 时,表示该档案为隐藏档案