Linux 学习与进阶之目录权限
后知后觉 暂无评论

Linux系統内文件有三种身份(拥有者、群组与其他人),都有三种权限(rwx)[读、写、执行]。那么文件的权限与目录(文件夹)的权限是否相同呢?结论是不同的。

文件的权限

文件是实际存放资料的地方,一般包括文本文件、库文件、二进制可执行文件等,因此权限对于文件来说,它的意义是这样的。

r (Read):可读取此文件的实际内容,如读取文本文件中的内容
w (Write):可编辑、修改该文件的内容(但不包含删除该文件)
x (eXecute):此文件具有可被系统执行的权限
小贴士:对于(w)权限来说,当你对一个文件有写入权限时,你可以具体写入/编辑/修改文件的[内容]的权限,但是并不具体删除文件本身的权限,对于文件的权限来说,你所有的权限都是针对[文件中的内容]而言。

注意:可执行权限在 Linux 中与 Windows 不同,Windows 中可执行一般是由后缀决定的 .exe .msi .bat ,但是 Linux 中文件后缀并不会影响文件的执行。

目录的权限

文件是实际存放资料的,那么目录可以理解为是记录文件的清单,目录的权限与文件的权限是不同的。

r (read contents in directory):可读取此目录结构的清单的权限,可查询此目录下的文件名,即可用 ls 等命令。
w (modify contents of directory):可改动此目录结构清单的权限,包括:
· 建立新文件及子目录;
· 删除已经存在的文件或目录(不论该文件的权限是什么);
· 将已有文件或目录改名;
· 移动此目录中的文件或子目录的位置。
x (access directory):目录不可被执行,目录的执行权限代表的是使用者能否进入该目录作为工作目录,所谓工作目录就是你所处目录,登录linux时默认路径为家目录,cd 命令可用来切换工作目录。

简单概括

类型存放读(r)写(w)执行(x)
文件详细内容读取文件内容修改文件内容(需要r配合)执行文件内容(需要r配合)
目录文件名读取其中内容(需要x配合)目录下创建、删除、修改文件名(需要x配合)进入该目录的权限

举个例子

例题:假设有个账号名为 dmtsai ,他的家目录在 /home/dmtsai/dmtsai 对此目录具有 [rwx] 权限,若在此目录下有个名为 the_root.data 的文件,该文件的权限如下:

-rwx------ 1 root  root  4365 Sep 19 23:20  the_root.data

请问 dmtsai 对此文件有何权限,能否删除此文件?

解答:如权限所示,对于dmtsai来说此文件是other身份,因为无法读写、执行,但是由于此文件在他家目录下,在此目录下具有完整[rwx]权限,因此可以删除此文件。


如何改变文件属性与权限

我们现在知道文件权限对于一个系统的安全重要性了,也知道文件的权限对于使用者与群组的相关性, 那么如何修改一个文件的属性与权限呢?又!有多少文件的权限我们可以修改呢? 其实一个文件的属性与权限有很多!我们先介绍几个常用于群组、拥有者、各种身份的权限之修改的指令,如下所示:

chgrp

改变文件所属群组,chgrp == change group 修改用户组需要指定为已存在(/etc/group)的用户组,否则会报错。

[root@www ~]# chgrp [-R] dirname/filename ...
选项与参数:
-R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件、目录
     都更新成为这个群组之意。常常用在变更某一目录内所有的文件之情况。

chown

改变文件拥有者, chown == change owner 用户必须是已经存在系统中的账号,也就是在(/etc/passwd)中存在的用户,否则会报错。

chown 还可以直接修改群组的名称,例如:

[root@www ~]# chown [-R] 账号名称 文件或目录
[root@www ~]# chown [-R] 账号名称:组名 文件或目录
选项与参数:
-R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件都变更

范例:将install.log的拥有者改为bin这个账号:
[root@www ~]# chown bin install.log
[root@www ~]# ls -l
-rw-r--r--  1 bin  users 68495 Jun 25 08:53 install.log

范例:将 install.log 的拥有者与群组改回为root:
[root@www ~]# chown root:root install.log
[root@www ~]# ls -l
-rw-r--r--  1 root root 68495 Jun 25 08:53 install.log
小贴士:事实上,chown也可以使用『chown user.group file』,亦即在拥有者与群组间加上小数点『.』也行! 不过很多朋友设定账号时,喜欢在账号当中加入小数点(例如vbird.tsai这样的账号格式),这就会造成系统的误判了! 所以我们比较建议使用冒号『:』来隔开拥有者与群组啦!此外,chown也能单纯的修改所属群组呢! 例如『chown .sshd install.log』就是修改群组~看到了吗?就是那个小数点的用途!

那么什么时候要使用chown或chgrp呢?或许你会觉得奇怪吧? 是的,确实有时候需要变更文件的拥有者的,最常见的例子就是在复制文件给你之外的其他人时, 我们使用最简单的cp指令来说明好了:

[root@www ~]# cp 来源文件 目标文件
假设你今天要将.bashrc这个文件拷贝成为.bashrc_test档名,且是要给bin这个人,你可以这样做:

[root@www ~]# cp .bashrc .bashrc_test
[root@www ~]# ls -al .bashrc*
-rw-r--r--  1 root root 395 Jul  4 11:45 .bashrc
-rw-r--r--  1 root root 395 Jul 13 11:31 .bashrc_test  <==新文件的属性没变

由于复制行为(cp)会复制执行者的属性与权限,所以!怎么办?.bashrc_test还是属于root所拥有, 如此一来,即使你将文件拿给别人这个使用者了,那他仍然无法修改的(看属性/权限就知道了吧), 所以就必须要将这个文件的拥有者与群组修改一下。

chmod

文件权限的改变使用的是chmod这个指令,但是,权限的设定方法有两种, 分别可以使用数字或者是符号来进行权限的变更。

数字类型改变文件权限

Linux文件的基本权限就有九个,分别是owner/group/others三种身份各有自己的read/write/execute权限, 先复习一下刚刚上面提到的数据:文件的权限字符为:『-rwxrwxrwx』, 这九个权限是三个三个一组的!其中,我们可以使用数字来代表各个权限,各权限的分数对照表如下:

r:4
w:2
x:1

每种身份(owner/group/others)各自的三个权限(r/w/x)分数是需要累加的,例如当权限为: [-rwxrwx---] 分数则是:

owner = rwx = 4+2+1 = 7
group = rwx = 4+2+1 = 7
others= --- = 0+0+0 = 0

所以等一下我们设定权限的变更时,该文件的权限数字就是770啦!变更权限的指令chmod的语法是这样的:

[root@www ~]# chmod [-R] xyz 文件或目录
选项与参数:
xyz : 就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加。
-R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件都会变更
举例来说,如果要将.bashrc这个文件所有的权限都设定启用,那么就下达: 
[root@www ~]# ls -al .bashrc
-rw-r--r--  1 root root 395 Jul  4 11:45 .bashrc
[root@www ~]# chmod 777 .bashrc
[root@www ~]# ls -al .bashrc
-rwxrwxrwx  1 root root 395 Jul  4 11:45 .bashrc

符号类型改变文件权限

还有一个改变权限的方法,九个权限分别是(1)user (2)group (3)others三种身份!那么就可以藉由u, g, o来代表三种身份的权限!此外, a 则代表 all 亦即全部的身份!那么读写的权限就可以写成r, w, x!也就是可以使用底下的方式来看:

命令操作权限目标
chmodu+加入r文件或目录
g-去除w
o=设定x
a

来实作一下吧!假如我们要『设定』一个文件的权限成为『-rwxr-xr-x』时,基本上就是:

所以就是:

[root@www ~]# chmod  u=rwx,go=rx  .bashrc
# 注意 u=rwx,go=rx 是连在一起的,中间并没有任何空格!
[root@www ~]# ls -al .bashrc
-rwxr-xr-x  1 root root 395 Jul  4 11:45 .bashrc
那么假如是『 -rwxr-xr-- 』这样的权限呢?可以使用『 chmod u=rwx,g=rx,o=r filename 』来设定。此外,如果我不知道原先的文件属性,而我只想要增加.bashrc这个文件的每个人均可写入的权限, 那么我就可以使用:
[root@www ~]# ls -al .bashrc
-rwxr-xr-x  1 root root 395 Jul  4 11:45 .bashrc
[root@www ~]# chmod  a+w  .bashrc
[root@www ~]# ls -al .bashrc
-rwxrwxrwx  1 root root 395 Jul  4 11:45 .bashrc
而如果是要将权限去掉而不更动其他已存在的权限呢?例如要拿掉全部人的可执行权限,则:
[root@www ~]# chmod  a-x  .bashrc
[root@www ~]# ls -al .bashrc
-rw-rw-rw-  1 root root 395 Jul  4 11:45 .bashrc

参考链接

本文撰写于一年前,如出现图片失效或有任何问题,请在下方留言。博主看到后将及时修正,谢谢!
禁用 / 当前已拒绝评论,仅可查看「历史评论」。