权限管理的重要性
linux是多用户多任务分时系统,不是单单创建多个用户、多个群组就可以了。还需要对一个文件的所有权进行定义才能让各个用户相互独立。而最根本的就是对文件以及目录的权限管理了。
目录与文件
既然权限管理最主要的就是管理目录与文件的权限,那么我们首先就先讲讲linux的目录与文件。
linux下文件和目录的命名规则如下:
- 除了反斜杠外,所有字符都可以使用但是一些特殊的字符应该避免使用。
- 目录名和文件名长度限制在255个字符内
- 在linux中目录和文件名是区分大小写的
- 与windows不同,文件的扩展名对于linux没有特殊的含义,虽然也使用扩展名来指代类型,但是其打开以及运行等不依赖扩展名。
- 在linxu中万物皆为文进,包括硬件设备等,在后续的学习中会学到
目录与文件相关命令
cd切换目录
cd [相对路径或绝对路径]
changeDirectory 用于切换工作目录
其中有一些特殊的符号:
特殊符号 | 作用 |
---|---|
~ | 代表当前登陆用户的主目录 |
~用户名 | 表示切换至指定用户的主目录 |
- | 代表上次所在的目录 |
. | 代表当前目录 |
.. | 代表上级目录 |
这里补充一个知识点,我们在使用命令行的时候有一个命令提示符其会提示我们所在的目录:
[root@localhost ~]#
root代表当前用户的用户名
@是分隔符
localhost是当前系统主机名的简写
~就是一个路径表示,代表当前用户的家目录对于root就是/root表示该用户是root用户,而$表示该用户是普通用户
pwd答应工作目录
pwd
PrintWorkingDirectory 打印工作目录
ls列出目录下目录及文件
ls [选项] [目录路径]
list 作用是列出目录路径下的所有目录和文件,如果不加路径则默认为当前路径
| 选项 | 功能 |
| -a | 显示全部文件,包含隐藏文件(以.开头的文件) |
| -h | 以人们易读的方式显示文件和目录大小即1KB 23MB等 |
| -i | 显示inode节点信息 |
| -l | 使用长格式列出文件和目录信息 |
| -R | 连同子目录内容一起列出来 |
| --color=never/always/auto | 以颜色区分文件,never表示不显示颜色,always表示显示颜色,auto表示让系统依据配置来判断是否显示颜色以及什么文件显示什么颜色 |
该命令可以说是linux下用的最多的命令,通常我们会使用ls -al 来列出目录下文件的详细信息。
大部分发行版用不同的颜色来区分不同种类的文件。
[hncjygd@bogon tmp]$ ls -al
总用量 4
drwxr-xr-x. 3 hncjygd wheel 31 11月 4 16:54 .
drwx------. 21 hncjygd wheel 4096 11月 3 23:24 ..
drwxr-xr-x. 3 hncjygd wheel 18 11月 4 16:54 test
-rw-r--r--. 1 hncjygd wheel 0 11月 4 16:54 test1
上面就是列出的文件的信息信息,默认包含七列:
- 第一列:规定了不同用户对文件所拥有的权限
- 第二列:引用计数,代表该文件的硬连接个数,对于目录则代表该目录有多少个一级子目录
- 第三列:文件的所有者
- 第四列:文件所属组
- 第五列:大小,默认单位字节,可以添加-h选项来增加可读性
- 第六列:文件修改时间,状态或数据修改都会更改这个时间
- 第七列:文件名或目录名
mkdir创建目录
mkdir [-mp] 目录名
-m 用于手动配置所创建的目录的权限,而不是使用默认权限 mkdir -m 711 test1
-p 递归创建所有目录 mkdir test2/test3
rmdir删除空目录
rmdir [-p] 目录名
-p 递归删除空目录
这个命令不常用,因为只能删除空目录,通常我们都是使用rm命令来删除目录。
但是当你只想删除空目录的时候可以使用mkdir来确保非空目录不被删除
touch 创建新文件或修改文件时间戳
Linux系统下,每个文件主要拥有三个时间参数(可以通过stat命令进行查看),分别是文件的访问时间、数据修改时间以及状态修改时间:
- 访问时间:(AccessTime atime) 只要文件的内容被读取,访问时间就会更新(cat vim等操作都会改变这个时间)
- 数据修改时间:(Modify Time mtime) 当文件的内容数据发生变化,修改时间就会更新
- 状态修改时间:(Change Time ctime) 但文件的状态发生变化,该时间就会更新(比如文件权限改变等,mtime更新ctime一定也随之更新,反之则不一定)
touch [选项] 文件名
如果文件名的文件不存在则创建一个空文件。
选项 | 含义 |
---|---|
-a | 只修改文件的访问时间 |
-c | 仅修改文件时间参数,如果文件不存在则不建立新文件(与其他参数配合使用) |
-d | 后面跟想要修订的日期(可以不用当前的日期),他会将atime mtime时间都改为指定的时间 |
-m | 只修改文件的数据修改时间 |
-t | 命令后面可以跟想要修改的日期,时间格式为[[CC]YY]MMDDhhmm[.SS] |
说明:
- 其中的 a m 参数只能将文件修改为当前时间
- 如果想要修改为其他时间需要加t参数后跟时间 其中MMDDhhmm是必须的,其他可选
- 状态修改时间无法被改变,因为理论上修改时间也会导致状态的变化
ln建立链接(软链接 硬链接)
要想知道什么是链接,首先需要知道linux的ext文件系统是如何工作的。ext文件系统会把分区主要分为两个部分:小部分用于保存inode信息,大部分用于保存block信息。
inode的默认大小是128Byte或256Byte,其记录了以下内容:
- 文件的字节数
- 文件拥有者的UID
- 文件的GID
- 文件的权限
- 文件的时间戳:atime mtime ctime
- 链接数:即有多少个文件名指向这个inode
- 文件数据block的位置
我们可以通过stat命令来查看某个文件的inode信息,可以看到除了文件名外基本上文件的所有信息都保存在inode中了(文件名是记录在父目录的block中的)。在Linux系统内部并不使用文件名,而是使用文件的inode号码来识别文件的,对于系统来说文件名只是inode号码便于识别的一个别称。用户通过文件名打开文件的具体步骤为:首先系统找到这个文件名对应的inode号码,其次通过inode号码获取inode信息,最后根据inode信息找到文件数据所在的block,读出数据。
现在我们来说明什么是硬链接和软链接:
硬连接:一般情况下,文件名和inode号码是一一对应关系,每个inode号码对应一个文件名。但是Linux系统允许多个文件名指向同一个inode号码。即可以用不同的文件名来访问同样的内容,对文件内容的修改会影响所有文件,而且删除任意一个文件名,不影响另一个文件名过的访问。这里面顺便顺便说一下目录文件的链接数,创建文件的时候默认会生成.和..两个特殊的目录代表当前文件夹以及父文件夹,其实际上就是当前文件的硬链接以及父文件的硬链接。所以任何一个目录的硬链接总数总是等于2加上它的子目录总数。
软链接:软链接类似于windows的快捷方式。在linux中的作用机制是:文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径,读取文件A时,系统会自动访问文件B,这个时候称文件A是文件B的软链接或者叫符号链接。当我们删除A的时候并不影响B文件,但是当我们删除B的是时候再打开文件A就会报错。这就意味着文件A依赖于文件B而存在。并且因为文件A指向文件B的文件名,而不是文件B的inode号码,所以创建文件B的软链接,文件B的inode链接数不会因此发生变化。
创建链接:
ln [选项] 源文件 目标文件
-s:建立软链接,不加任何选项为建立硬链接
-f:强制,如果目标文件已经存在,则删除目标文件后再建立链接文件
硬链接的特点:
- 不论是修改源文件,还是修改硬链接文件,另一个文件中的数据都会发生改变
- 不论是删除源文件,还是删除硬链接文件,只要还有一个文件存在,这个文件都可以被访问
- 硬链接不会建立新的inode信息
- 硬链接不能跨分区建立,因为在不同的文件系统中,inode号是重新计算的。
- 硬链接不能链接目录,因为如果给目录建立硬链接,那么不仅目录本身需要重新建立,目录下所有的文件也需要建立硬链接,这太过复杂。
而软链接除了在删除源文件时会导致软链接失效外,其可以跨分区建立,可以建立目录的软链接等优点,所以在实际应用中,软链接使用的较多。
cp复制文件和目录
cp [选项] 源文件 目标文件
选项 | 含义 |
---|---|
-d | 如果源文件为软链接,则复制出的目标文件也为软链接 |
-p | 复制后目标文件保留源文件的属性(包括UID GID 权限和时间) |
-r | 递归复制,用于复制目录 |
-a | 相当于-dpr的集合 |
-i | 如果目标存在则会询问是否覆盖 |
-l | 把目标文件建立为源文件的硬链接文件,而不是复制源文件 |
-s | 把目标文件建立为源文件的软链接文件,而不是复制源文件 |
需要注意的问题:
- 源文件可以有多个,这种情况下,目标文件必须时目录才可以
- 复制可以是文件,也可以是目录,要复制目录需要加-r
rm 删除文件或目录
rm [选项] 文件或目录
选项 | 含义 |
---|---|
-f | 强制删除,系统不会询问而是直接删除 |
-i | 与-f相反,在删除前,系统提示是否删除 |
-r | 递归删除,主要用于删除目录 |
注意:
- rm命令是一个具有破坏性的命令,其会永久删除文件或目录
- 删除成功后系统不会给出提示,这是linux 的一个重要思想,没有提示就意味着成功
mv移动文件或改名
mv [选项] 源文件 目标文件
选项 | 含义 |
---|---|
-f | 强制覆盖,即使目标文件已经存在,不询问直接覆盖 |
-i | 与上面相反,如果目标文件存在,询问是否覆盖 |
-n | 如果目标文件已经存在,不覆盖也不询问 |
-v | 显示文件或目录的移动过程 |
-u | 若目标文件已经存在,但两者相比,源文件更新,则会对目标文件进行升级 |
注意:
- mv命令可以移动目录,而且不需要加-r的递归
权限
linux 多用户权限控制的本质,就是让不同的用户能够访问的文件不同。而root可以访问任何文件,所以就拥有至高无上的权力。而如何规定一个用户能够访问那些文件,而不能访问那些文件,这些都由文件自己说的算,这就是文件的权限。
使用ls -l可以查看文件的长属性:
drwxrwxr-x. 5 hncjygd wheel 46 11月 1 20:31 study
-rw-rw-r--. 1 hncjygd wheel 23 11月 3 21:12 test
-rw-r--r--. 1 hncjygd grouptest 0 11月 2 22:00 test2
-rw-rw-r--. 1 hncjygd wheel 0 11月 2 22:01 test3
其中最重要的参数就是第一个,代表了文件类型和权限。
drwxrwxr-w
其中分为四个部分:
首字母-文件类型
后面9个字符分为三组分别代表:拥有者、所属用户组、其他
其中首字母由以下取值:
- d 代表目录
- - 代表文件
- l 代表一个软链接(硬链接还是-与文件无异)
- b 代表块设备如磁盘等
- c 代表字符设备如鼠标、键盘等需要连续串行读写的设备
- s 代表套接字文件
- p 代表命名管道文件
后面的由rwx组成的分别代表拥有者、所属组、其他用户的权限:
- r - 代表读
- w - 代表可写
- x - 代表可运行
- - 代表不具有某个权限
rwx权限 | 对文件的作用 |
---|---|
r-读权限 | 表示可读取文件中的实际内容,即可以对文件执行cat more less head tail等文件查看操作 |
w-写权限 | 表示可以编辑文件中的内容,即可以执行vim echo等文件数据修改命令 |
x-执行权限 | 表示该文件可以运行,当然具体是否能够正确运行,还需要看代码 |
rwx权限 | 对目录的作用 |
---|---|
r-读权限 | 表示具有读取目录结构列表的权限,即执行ls |
w-写权限 | 对于目录来书w权限是最高的权限,拥有w权限就可以在目录中:建立新的文件或目录,删除已经存在的目录和文件(无论文件或目录的权限是如何),对已存在的文件或目录移动或重命名。 |
x-执行权限 | 代表用户可以进入该目录,即执行cd命令 |
权限修改
chgrp修改文件和目录的所属组
chgrp [-R] 所属组 文件名/目录名
chgrp - change group
-R用于更改目录的所属组,表示更改连同目录中所有文件的所属组信息
chown修改文件和目录的所有者和所属组
chown [-R] 所有者[:所属组] 文件或目录
chown - change owner
-R 表示连同目录中的所有文件也更改
chown可以同时更改所有者和所属组,其中使用分号隔开,也可以单独更改所有者。
也可以使用 chown -R :所属组 文件或目录 来单独更改所属组,但是通常还是使用chgrp命令为好
chmod修改文件或目录的权限
我们知道linux中,文件的基本权限由9个字符组成,而chmod就是可以修改则9个字符的命令。其修改方式有2中:数字和符号,其中又以数字修改最常用。
使用数字修改:
chmod [-R] 权限值 文件名/目录名
-R用于目录,表示连同目录中的文件一同修改
权重值:其中 r=>4 w=>2 x=>1 其实就是二进制数 rwx就是7 r-x就是5 -wx就是3 等
chmod 755 example 就是将example文件权限设置为 rwxr-xr-x
使用字符修改文件权限:
既然文本的基本权限是三个用户身份(所有者 所属组 其他人) 搭配三种权限(rwx)。所以可以使用u g o来代表三个用户身份 a表示全部,rwx来表示三种权限,以此来更改权限
chmod u=rwx,go=rx example 等同于 chmod 755 example
从上面的对比可知,数字修该更加方便。
umask修改新建文件文件夹的默认权限
在新建文件或文件夹的时候,系统会给与默认的权限.(可以直接运行umask来查看但前用户的默认权限),通常情况下 root的默认权限是0022,普通用户的是0002.
0022对应的就是----w--w-,实际上系统并不直接使用umask默认权限为文件或目录的初始权限,而是进行了操作:
文件/目录的初始权限: 文件/目录的最大默认权限-umask权限
文件的默认最大权限是666,因为x权限是文件的最高权限,必须手动赋予
目录的默认权限是777
对于root用户:文件默认权限666-022=644即rw-r--r-- 目录的默认权限777-022=755即rwxr-xr-x
对于普通用户:文件默认权限666-002=664即rw-rw-r-- 目录的默认权限777-002=775即rwxrwxr-x
可以通过umask命令来直接修改默认权限:
umask 033
注意:这种修改只是临时有效,关闭终端后就不再生效了,如果想要永久生效,需要更改配置文件 /etc/profile.这个配置文件是一个sh脚本文件,是用来配置环境变量的,其会在一个用户登陆系统时执行。其中有一段是用来定义umask的。
# /etc/profile
# Set our umask
umask 022