Linux 基础 - 档案与权限(chgrp/chown/chmod)
参考资料: http://linux.vbird.org/linux_basic/0210filepermission.php#filepermission_perm
本文大纲:
当执行 ls -al
后,当前目录下所有档案的详情被列出
1 | dr-xr-xr-x. 17 root root 4096 May 4 17:56 .. |
- 第 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
: 代表拥有者,即 usersg
: 代表拥有者群组,即 groupo
: 代表其他,即 othersa
: 代表所有,即 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
- 区块(block)设备档案: 存储资料,提供系统随机存储的设备,硬盘与软盘都属于这类,第一栏为
- 数据接口档案(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 字节
- 名称中不得包含 * ? > < ; & ! [ ] | \ ‘ “ ` ( ) { } 等特殊字符
- 第一个字符为
.
时,表示该档案为隐藏档案