Linux文件与目录管理(9)
上一节我们讲到了文件的权限,Linux针对不同的用户都分别设置了三个权限:可读、可写、可执行。当然,Linux下一切皆文件,对于目录也采用相同方式来管理目录的权限。我们都知道可读、可写这两个权限管控是针对文件内容的,那么对于目录来说,权限有什么作用呢?在上一节的/attribute目录下我们来看下面的例子:
打开四个终端,分别以root、james、eric、jason用户登录,然后我们逐个测试。
先在root身份下,还原welcome.sh文件的属性:
[root@studyclub attribute]# cd /attribute/
[root@studyclub attribute]# chmod 644 welcome.sh # 请思考,这是什么意思?
james身份登录系统的终端:
[james@studyclub attribute]$ ll
total 8
-rw-r--r-- 1 james jasonhome 39 May 12 15:04 welcome.sh
[james@studyclub attribute]$ rm -rf welcome.sh
rm: cannot remove ‘welcome.sh’: Permission denied
上面删除welcome.sh文件时,提示没有权限。james是welcome.sh文件的拥有者,有读和写文件的权限,为什么就是不能删除文件呢?能不能创建一个文件呢?我们来看:
[james@studyclub attribute]$ touch file-test
touch: cannot touch ‘file-test’: Permission denied
还是提示没有权限。
其实,文件是不是能够被当前用户删除掉,当前用户有没有权限删除文件,并不取决于当前用户对这个文件是否有可写的权限,而是取决于当前用户对于文件所在目录是否有可写的权限,我们来看:
# 切换到root用户登录的终端
[root@studyclub attribute]# ll -d /attribute/
drwxr-xr-x 2 root root 46 May 12 15:18 /attribute/
我们发现,当前所在的/attribute目录是属于root用户,所属的用户组是root用户组,对于/attribute这个目录来说,james用户(属于jasonhome用户组)属于其他用户的范畴。/attribute目录给其他用户的权限只有可读和可执行,并没有写权限。如果我们给这个目录的其他用户加上写权限再在目录下进行文件删除的操作:
# 给/attribute目录的其他用户加上写的权限
[root@studyclub attribute]# chmod o+w /attribute/
[root@studyclub attribute]# ll -d /attribute/
drwxr-xrwx 2 root root 46 May 12 15:18 /attribute/
# 现在我们切换到james用户登录的终端
# 对于/attribute目录来说,james属于其他用户,所以现在james对/attribute目录有写权限了
[james@studyclub attribute]$ rm -rf welcome.sh # 删除成功
[james@studyclub attribute]$ touch file-test # 命令执行后,没有任何提示,说明创建文件成功
小窍门:在Linux下执行命令,如果命令执行后没有任何提示信息,那么恭喜你,命令执行成功。这就是业内经常说的:没有提示信息就是最好的提示信息。
通过上面的实战我们知道了:当前用户想要删除文件,那么这个用户就需要对文件所在的目录有写权限。这是为什么呢?这需要从文件和目录的保存方式说起(简单讲解):对文件的读和写权限,其实都是赋予用户对文件block(存放文件内容)的读和写的操作。文件名是保存在目录的block里的(即文件和子目录是其所在的目录的内容),删除文件就相当于对目录的block的内容进行操作,所以想要删除文件的人(用户)需要对文件所在的目录有写权限。
好了,了解目录和文件的关系,我们来看看目录的读、写、执行权限的作用:
读权限(r):表示可以浏览目录下面文件和子目录,例如,可以执行ls dir命令查看目录下的内容。
写权限(w):表示可以在目录下新建文件、删除文件、重命名文件、修改文件权限。
执行权限(x):表示可以进入目录,即cd dir。如果没有这个执行权限,cd dir会报错。
下面我们实际操作一下:
修改目录的拥有者为james,修改用户组为jasonhome。
[root@studyclub ~]# chown james.jasonhome /attribute/
[root@studyclub ~]# ll -d /attribute/
drwxr-xrwx 2 james jasonhome 45 May 12 15:34 /attribute/
下面以james用户身份登录后进行测试(单独开一个终端):
james用户对/attribute目录(rwxr-xrwx)具有可读、可写、可执行的权限。
# 可执行
[james@studyclub root]$ cd /attribute/
# 可读
[james@studyclub attribute]$ ls
file-test welcome.sh.bak
# 可写
[james@studyclub attribute]$ touch file1
[james@studyclub attribute]$ rm -f file1
[james@studyclub attribute]$ mv file-test file-tmp
下面以eric用户身份登录后进行测试(单独开一个终端):
eric用户属于jasonhome用户组,那么eric对/attribute目录(rwxr-xrwx)具有可读、可执行的权限,没有写的权限:
# 可执行
[eric@studyclub ~]$ cd /attribute/
# 可读
[eric@studyclub attribute]$ ls
file-tmp welcome.sh.bak
# 不可写
[eric@studyclub attribute]$ touch eric-file
touch: cannot touch ‘eric-file’: Permission denied
[eric@studyclub attribute]$ rm -rf file-tmp
rm: cannot remove ‘file-tmp’: Permission denied
[eric@studyclub attribute]$ mv file-tmp eric-file
mv: cannot move ‘file-tmp’ to ‘eric-file’: Permission denied
下面以jason用户身份登录后进行测试(单独开一个终端):
jason用户对于/attribute目录(rwxr-xrwx)来说属于其他用户,那么它对/attribute目录具有可读、可写、可执行的权限:
# 可执行
[jason@studyclub ~]$ cd /attribute/
# 可读
[jason@studyclub attribute]$ ls
file-tmp welcome.sh.bak
# 可写
[jason@studyclub attribute]$ touch jason-file
[jason@studyclub attribute]$ mv file-tmp file-tmp2
[jason@studyclub attribute]$ rm -f file-tmp2
#即时思考、复习:上面的touch、mv、rm三个命令执行后为什么没有任何反馈信息?
好了,现在我们看到,无论是文件拥有者、用户组的用户还是其他用户,都有x权限,如果某个用户没有x权限会发生什么?
去掉用户组用户的x权限:
# 以james用户身份登录Linux系统
[james@studyclub /]$ cd /
[james@studyclub /]$ chmod g-x attribute/ # 去掉用户组中用户的x权限,只保留读(r)权限
[james@studyclub /]$ ll -d attribute/
drwxr--rwx 2 james jasonhome 46 May 13 10:28 attribute/
# 我们用和james同一个组的eric登录系统(eric和james同属于jasonhome用户组)
[eric@studyclub ~]$ cd /attribute/
bash: cd: /attribute/: Permission denied
[eric@studyclub ~]$ ls /attribute/ # 直接“读”目录,提示没有权限,只能看到文件名
ls: cannot access /attribute/welcome.sh.bak: Permission denied
ls: cannot access /attribute/jason-file: Permission denied
jason-file welcome.sh.bak
[eric@studyclub ~]$ ls /attribute/ -l # 查看详细信息,提示没有权限并且只能看到文件名,属性列是问号
ls: cannot access /attribute/welcome.sh.bak: Permission denied
ls: cannot access /attribute/jason-file: Permission denied
total 0
-????????? ? ? ? ? ? jason-file
-????????? ? ? ? ? ? welcome.sh.bak
我们总结一下目录的权限情况:
Linux目录的读、写、执行权限说明:
可读r:表示具有浏览目录下面的文件及子目录的权限
1) 如果没有x权限,不能进到目录里,即无法cd dir
2) 如果没有x权限,ls列表时可以看到所有的文件名,但是会提示无权访问目录下的文件
3) 如果ls -l列表,所有的属性都会带有问号,也会提示无权访问目录下的文件。
可写w:表示具有增加、删除或修改目录内的文件名(一般指文件名)的权限(需要x权限配合) 可执行x:表示具有进入目录的权限。即cd dir 但是没有r权限无法列出文件及目录,没有w权限无法新建和删除。 特别提示:删除文件(修改文件名等)的权限是受父目录的权限控制,和文件本身权限无关。因为当前文件的inode存放在当前目录的block里(即目录里的文件、目录是作为上一级目录的内容存在的),如果需要删除文件等类似操作,需要用户对当前目录有可写权限才可以操作。 所以,为了方便使用同时保证安全性,一般正常的目录权限一般默认是rwxr-xr-x,即对于目录,都会给与x权限。
实战练习:
对于文中的attribute目录,去掉attribute目录其他用户的x权限,然后测试目录的可读性、可写性(创建、删除文件)、可执行性(cd dir)。 对于文中的attribute目录,去掉attribute目录拥有者的w权限,只保留读(r)和执行(x)权限,测试目录的可读性、可写性(创建、删除文件)、可执行性(cd dir) 把attribute目录的权限改为355,测试文件拥有者、用户组的用户、其他用户的读(r)、写(w)、执行(权限) 请总结:目录的权限的作用,并自行练习
权限修改(chmod)
上面练习文件属性、目录属性的过程中我们用到了权限修改的命令,比如:
chmod g-x attribute/
chmod就是用来修改文件权限的命令,那个“g-x”的意思就是group去掉x权限,即用户组里的用户去掉可执行权限的意思。我们总结一下chmod可用的符号:
u:user,用户
g:group,用户组
o:other,其他用户
a:all,所有用户,如果给所有用户添加w权限那就是写成“a+w”或“+w”,即这个a字母在写的时候可以省略不写
-:即数学里的减号,去掉某个权限的意思
+:即数学里的加号,添加某个权限的意思
下面我们看看怎么使用上面的符号:
[james@studyclub attribute]$ touch tmp2
[james@studyclub attribute]$ ll tmp2
-rw-r--r-- 1 james jasonhome 0 May 13 13:42 tmp2
# 同时为用户添加执行权限,用户组添加写权限,其他用户添加执行权限,每个部分用逗号隔开
[james@studyclub attribute]$ chmod u+x,g+w,o+x tmp2
# 去掉用户组的写权限
[james@studyclub attribute]$ chmod g-w tmp2
# 给所有用户添加x权限,下面的两种方式都可以
[james@studyclub attribute]$ chmod a+x tmp2 # 方式1
[james@studyclub attribute]$ chmod +x tmp2 # 方式2
从上面的练习中我们可以发现,文件的属性是类似rwxr--r--这种形式的,9个字符代表三种用户角色的权限,但是在实际中我们如果同时修改三类用户的权限,全用字母表示法就比较麻烦,于是就有了第二种表示法:数字表示法。
前面我们提到过,读权限r可以用数字4表示,写权限w可以用数字2表示,执行权限x可以用数字1表示,没有对应的权限(-)用数字0表示。数字表示法就是每个类型的用户的权限用一个数字表示,这个数字是读、写、执行权限用对应数字表示后的和。例如:对于一个文件是rw-r-xr--,用数字表示法就是:
文件拥有者的权限是rw-,那么文件拥有者的权限就是6,即【4(r)+2(w)+0(-)=6】
文件用户组里的用户权限是r-x,那么用户组里的用户的权限是5,即【4(r)+0(-)+1(x)=5】
其他用户的用户权限是r--,那么其他用户的权限是4,即【4(r)+0(-)+0(-)=4】
我们再来看看上面的几个例子怎么用数字实现:
[james@studyclub attribute]$ touch tmp3
[james@studyclub attribute]$ ll tmp3
-rw-r--r-- 1 james jasonhome 0 May 13 13:54 tmp3
# 为用户添加执行权限,用户组添加写权限,其他用户添加执行权限,修改后的权限为:
# 用户:可读(4)、可写(2)、可执行(1),数字之和为7
# 用户组:可读(4)、可写(2)、不可执行(0),数字之和为6
# 其他用户:可读(4)、不可写(0)、可执行(1),数字之和为5
[james@studyclub attribute]$ chmod 765 tmp3
[james@studyclub attribute]$ ll tmp3 # 查看修改后的效果
-rwxrw-r-x 1 james jasonhome 0 May 13 13:54 tmp3
# 去掉用户组的写权限,那么用户的权限还是7,用户组的权限变为4(6-2),其他用户的权限还是5
[james@studyclub attribute]$ chmod 745 tmp3
[james@studyclub attribute]$ ll tmp3
-rwxr--r-x 1 james jasonhome 0 May 13 13:54 tmp3
# 在上面的基础上,给tmp3每个类型的用户加上可执行权限
# rwxr--r-x:文件拥有者已经有了可执行权限,用户组还没有可执行权限,其他用户已经有了可执行权限,所以我们只要算出原有权限,然后给没有执行权限的用户角色加上1即可。现有权限是745,接下来就给用户组加上可执行权限即可,最终变成755.
[root@studyclub attribute]# chmod 755 tmp3
[root@studyclub attribute]# ll tmp3
-rwxr-xr-x 1 james jasonhome 0 May 13 13:54 tmp3
修改用户及用户组(chown)
上面练习文件属性、目录属性的过程中我们用到了修改文件所属用户、用户组的命令,比如:
chown james.jasonhome /attribute/
chown就是用来修改文件所有者、所属用户组的命令。chown命令的格式有两种:
chown [-R] username[:groupname] 文件名或目录名
chown [-R] username[.groupname] 文件名或目录名
上面两种方式的区别就是用户名和组名之间的分隔符,可以用冒号,也可以用点号。中括号内的部分可以不写,系统会默认一个用户组。
再来说说-R选项的意思,-R的作用就是不仅修改指定目录的所有者、所属用户组,他还会把指定目录下的文件及子目录下的文件的所有者、所属用户组一并修改。
[root@studyclub attribute]# ll tmp3 # 查看当前tmp3的拥有者
-rwxr-xr-x 1 james jasonhome 0 May 13 13:54 tmp3
[root@studyclub attribute]# chown eric:jasonhome tmp3 # 修改文件的拥有者为eric
[root@studyclub attribute]# ll tmp3 # 查看修改结果
-rwxr-xr-x 1 eric jasonhome 0 May 13 13:54 tmp3
我们再来看看-R的作用:
先准备环境:
[root@studyclub attribute]# mkdir -p dir1/2/3
[root@studyclub attribute]# touch dir1/file1
[root@studyclub attribute]# touch dir1/2/file2
[root@studyclub attribute]# touch dir1/2/3/file3
确认当前的文件的用户情况:
[root@studyclub attribute]# ll -d dir1/
drwxr-xr-x 3 root root 28 May 14 10:13 dir1/
[root@studyclub attribute]# ll -d dir1/file1
-rw-r--r-- 1 root root 0 May 14 10:13 dir1/file1
[root@studyclub attribute]# ll -d dir1/2/
3/ file2
[root@studyclub attribute]# ll dir1/2/
total 0
drwxr-xr-x 2 root root 19 May 14 10:13 3
-rw-r--r-- 1 root root 0 May 14 10:13 file2
[root@studyclub attribute]# ll dir1/2/3
total 0
-rw-r--r-- 1 root root 0 May 14 10:13 file3
从上面的结果我们可以看出来,我们创建的这些目录和文件的拥有者和所属的用户组都是root,下面我们来看看修改一下所属的用户和用户组:
[root@studyclub attribute]# chown james:jasonhome dir1 # 修改所属的用户和用户组
[root@studyclub attribute]# ll -d dir1/ # 查看修改结果,发现dir1目录的所属的用户和用户组发生了变化
drwxr-xr-x 3 james jasonhome 28 May 14 10:13 dir1/
[root@studyclub attribute]# ll dir1/ # 我们查看dir1下面的文件和子目录的权限,发现用户、所属用户组还是root
total 0
drwxr-xr-x 3 root root 28 May 14 10:13 2
-rw-r--r-- 1 root root 0 May 14 10:13 file1
下面我们用-R选项,一次性改变dir1目录及其下文件、子目录及其下文件的拥有者、所属用户组:
[root@studyclub attribute]# chown -R james:jasonhome dir1 # 自动遍历修改dir1目录下的文件、子目录及其文件的用户、用户组
[root@studyclub attribute]# ll dir1/
total 0
drwxr-xr-x 3 james jasonhome 28 May 14 10:13 2
-rw-r--r-- 1 james jasonhome 0 May 14 10:13 file1
[root@studyclub attribute]# ll dir1/2
total 0
drwxr-xr-x 2 james jasonhome 19 May 14 10:13 3
-rw-r--r-- 1 james jasonhome 0 May 14 10:13 file2
好了,这节就到这吧,下篇文章我们学习文件及目录的默认权限与隐藏权限。
实战练习:
若某个文件的所有者具有文件的读、写权限,用户组有读和执行权限,其余人仅有读权限,那么用数字表示法应该是什么? 若某文件的权限用数字表示法是644,那么用字母表示法应该怎么样? 文件的权限有哪几种表示法 创建一个文件,请用两种方法把这个文件的权限改为rwxrwxrwx 请把本节的例子认真练习并自己创建相应的文件练习几遍,做到熟能生巧 思考并实际验证:如果只想改变用户组,我们应该怎么操作?(提示:命令格式不能变,逗号或冒号不能少。另外,还有chgrp命令,请自行练习,该命令了解即可)
微信号|bjdream-1
Cloud研习社 ·