文章目录
前言
前面介绍了Ubuntu系统的目录结构以及路径(相对路径和绝对路径),但是我们知道服务器的Ubuntu经常是多个人同时使用,因此在Ubuntu系统中同一个的文件相对于不同的用户往往有不同的权限。下面讲简单介绍一下Linux服务器的用户与用户组的概念,然后介绍文件的属性和权限。
一、用户与用户组
在Linux系统中,每个文件都有相当多的属性与权限,其中最重要的概念就是文件的拥有者了。在介绍文件的属性和权限之前,必须要介绍用户、用户组以及其他人的概念,因为文件的属性和权限就是相对于这三个身份的人来设置的。
1.用户(文件拥有者)
由于Linux是个多人多任务的系统,因此可能常常会有多人同时使用这台主机来进行工作的情况发生,为了考虑每个人的隐私以及每个人喜好的工作环境,因此文件拥有者的身份就相当重要了。
比如你有一些保密的文件,存储在你自己的家目录下。你不想让其他人看到文件的内容,这时你就可以设置只有文件拥有者才能看和修改这个文件的内容,那么其他人就无法查看文件的内容,因为权限不够。
2.用户组
可以想象成用户组的概念类似于你的家人一样,组内的其他人就是你的家人,你们可以同时生活在家中,比如共同使用客厅和厕所等等,然后呢,你自己的卧室家人也可以进来,但是如果你不想让除了自己的其他人进入你的卧室,你也可以给自己的卧室上锁,这样就只有你能进入,而其他人就进不来。用户组的概念还有就是区别于其他人,你可以将其他人想象成家人之外的人。
用户组最有用的功能之一就是当你在团队进行协同工作的时候。比如有两个团队a和b在使用同一台Linux服务器,a组中有组员1、2、3,b组中有组员4、5、6。两组处于竞争关系,上司命令两组都要完成一个项目文件,完成的差的将被裁员。在写项目文件的时候,由于组内人员是一个团队,因此必须要组内人员都能查看并且修改项目文件,但是不能让另一个组的人访问并修改自己的项目文件。这时就可以设置项目文件的权限,通过设置的自己的文件只有自己的组内人员具有查看和修改的权限即可。这就是用户组的使用方式,a组和b组就是一个用户组,可以在组内设置自己的权限。
比如项目经理需要同时查看两组的进度,那么项目经理就需要同时拥有访问组a和组b的文件的权限,这时可以设置项目经理这个用户既属于组a也属于组b即可。因为在Linux中,每个账户都可以有多个用户组的支持。
可能读者又有疑惑了,怎么知道哪些人是一个组,哪些人不是一个组呢?这个问题我们放到后面的用户管理章节再介绍,在这里,我们着重讲的是文件的权限概念,因此我们目前只需要了解Linux系统中的用户、用户组和其他人的概念,并知道文件的权限都是相对于这三个身份的人设置的即可。
3.其他人
前面已经提到了,其他人就是用户组外的人,可以另外设置一层权限来毙掉用户组外的人访问文件的权限。在上面介绍的组a和组b中,组a的所有人相对于组b来说,都是其他人。反之亦然。
上面已经介绍了三种身份的用户,但是还有一个特殊的人物需要介绍一下,它就是“万能的天神”,root账户。root在Linux中具有至高无上的权限,它可以操作任何系统中的文件。因为使用root用户的时候需要当心。
二、Linux用户身份与用户组记录文件
1. /etc/passwd
默认情况下,所有的系统上的账号与一般身份的用户,还有天神root用户的相关信息,全部都记录在/etc/passwd这个文件中。
2. /etc/shadow
系统所有用户的个人密码都记录在/etc/shadow文件中,但是文件中的密码都是加密的,我们打开后并不能看到真正的密码。
3. /etc/group
系统中所有的组名以及id都记录在/etc/group这个文件中。
三、文件属性与权限
1. 查看文件属性的方法(ls)
通过ls
可以查看目录中的文件,仅仅输入ls
后面不加目录的时候,输出的是当前所在目录的文件,加上目录之后,则是输出的所加的目录下的文件内容。详细的使用方法如下所示:经常使用的两个参数是 -a
和-l
。-a
可以列出目录下的所有文件,包括隐藏的文件;-l
则是列出文件的详细信息,包括文件的属性、权限等等信息。如果同时使用 -a
和-l
,则是使用-al
,这样就可以同时显示两个参数的内容了,ls -al
这个命令也可以简写为 ll
。
[root@www ~]# ls [-aAdfFhilnrRSt] 目录名称
[root@www ~]# ls [--color={never,auto,always}] 目录名称
[root@www ~]# ls [--full-time] 目录名称
选项与参数:
-a :全部的文件,连同隐藏档( 开头为 . 的文件) 一起列出来(常用)
-A :全部的文件,连同隐藏档,但不包括 . 与 .. 这两个目录
-d :仅列出目录本身,而不是列出目录内的文件数据(常用)
-f :直接列出结果,而不进行排序 (ls 默认会以档名排序!)
-F :根据文件、目录等资讯,给予附加数据结构,例如:
*:代表可运行档; /:代表目录; =:代表 socket 文件; |:代表 FIFO 文件;
-h :将文件容量以人类较易读的方式(例如 GB, KB 等等)列出来;
-i :列出 inode 号码,inode 的意义下一章将会介绍;
-l :长数据串列出,包含文件的属性与权限等等数据;(常用)
-n :列出 UID 与 GID 而非使用者与群组的名称 (UID与GID会在帐号管理提到!)
-r :将排序结果反向输出,例如:原本档名由小到大,反向则为由大到小;
-R :连同子目录内容一起列出来,等於该目录下的所有文件都会显示出来;
-S :以文件容量大小排序,而不是用档名排序;
-t :依时间排序,而不是用档名。
--color=never :不要依据文件特性给予颜色显示;
--color=always :显示颜色
--color=auto :让系统自行依据配置来判断是否给予颜色
--full-time :以完整时间模式 (包含年、月、日、时、分) 输出
--time={atime,ctime} :输出 access 时间或改变权限属性时间 (ctime)
而非内容变更时间 (modification time)
2.文件属性详细介绍
在这里,以鸟哥的Linux私房菜中的代码段为例来介绍文件的属性。在书中,作者是使用 su - 切换身份成为root后, 使用“ ls -al ”看看,会看到下面的内容:
[dmtsai@study ~]$ su - # 先来切换一下身份看看
Password:
Last login: Tue Jun 2 19:32:31 CST 2015 on tty2
[root@study ~]# ls -al
total 48
dr-xr-x---. 5 root root 4096 May 29 16:08 .
dr-xr-xr-x. 17 root root 4096 May 4 17:56 ..
-rw-------. 1 root root 1816 May 4 17:57 anaconda-ks.cfg
-rw-------. 1 root root 927 Jun 2 11:27 .bash_history
-rw-r--r--. 1 root root 18 Dec 29 2013 .bash_logout
-rw-r--r--. 1 root root 176 Dec 29 2013 .bash_profile
-rw-r--r--. 1 root root 176 Dec 29 2013 .bashrc
drwxr-xr-x. 3 root root 17 May 6 00:14 .config <=范例说明处
drwx------. 3 root root 24 May 4 17:59 .dbus
-rw-r--r--. 1 root root 1864 May 4 18:01 initial-setup-ks.cfg <=范例说明处
[ 1 ][ 2 ][ 3 ][ 4 ][ 5 ][ 6 ] [ 7 ]
[ 权限 ][链接][拥有者][群组][文件大小][ 修改日期 ] [ 文件名 ]
在这里要介绍的就是列出的7
列内容,分别是1:权限 2链接 3文件拥有者 4文件所属群组 5文件大小 6修改日期 7文件名
下面讲对这些内容进行详细的介绍。
2.1 权限
权限的介绍以下图为例,权限这一栏一共有10个字符。
第一个字符代表的是这个文件的类型,例如目录、文件、链接文件等等
- 当为[ d ]则是目录
- 当为[ - ]则是文件
- 当为[ l ]则是链接文件(link file)
- 当为[ b ]则是设备文件里面的可供储存的周边设备(可随机存取的设备)
- 当为[ c ]则是设备文件里面的串行端口设备,例如键盘、鼠标(一次性读取设备)
接下来的字符中,以三个为一组且均为[rwx]的三个参数的组合。其中,[r]代表可读(read)
、[w]代表可写(write)
、[x]代表可执行(execute)
。要注意的是这三个权限的为止不会改变,如果没有某个权限则是用-
来代替。
- 第一组为文件拥有者可具备的权限
- 第二组为加入此用户组的账号的权限
- 第三组为非本人且没有加入本用户组的其他账户的权限
2.2 链接
链接表示有多少文件名链接到此节点(inode)。每个文件都会将它的权限与属性记录到文件系统inode中,不过,我们使用的目录树却是使用文件名来记录,因此每个文件名就会链接到一个inode,这个属性记录的就是有多少不同的文件名链接到相同的一个inode号码。
2.3 文件(或目录)的拥有者
表示这个文件属于的那个用户。
2.4 文件(或目录)所属用户组
表示文件所属的用户组。注意,这个用户组可以与文件拥有者没有关系。
2.5 文件的容量大小
容量的默认单位为Bytes
2.6 文件的创建日期或是最近的修改日期
这一栏的内容分别为日期(月/日)。如果这个文件修改的时间距离现在太久,那么时间部分会仅显示年份。如下面所示。
[root@study ~]# ll /etc/services /root/initial-setup-ks.cfg
-rw-r--r--. 1 root root 670293 Jun 7 2013 /etc/services
-rw-r--r--. 1 root root 1864 May 4 18:01 /root/initial-setup-ks.cfg
# 如上所示,/etc/services 为 2013 年所修改过的文件,离现在太远之故,所以只显示年份;
# 至于 /root/initial-setup-ks.cfg 是今年 (2015) 所创建的,所以就显示完整的时间了。
2.7 文件名
如果文件名之前多了一个点.
,则代表这个文件为隐藏文件。
3. 修改文件属性和权限
在这一节,我们将介绍几个常用于用户组、拥有者、各种身份的权限修改的命令。
chgrp:修改文件所属用户组
chown:修改文件拥有者
chmod:修改文件的权限,SUID,SGID,SBIT等特性
这三个命令都需要root权限才能执行,因此可以直接使用su -
来切换成root用户,也可以使用sudo
命令来启用root权限,但是这需要登陆的账号具有sudo
权限才行。要给用户添加权限一般是需要在/etc/sudoers
添加和root那行一致的内容,保存退出才可。
3.1 修改文件所属用户组(chgrp)
chgrp
就是change group
的缩写。修改命令的格式如下:
chgrp [-R] 所属组 文件名(目录名)
-R: 进行递归(recursive)修改,亦即连同子目录下的所有文件、目录都更新为属于这个用户组,常常用在修改某一目录内所有文件的情况下
下面以鸟哥的Linux的私房菜中的内容为例,详细看下使用方法,其中登录的是root账号,修改了initial-setup-ks.cfg
文件的所属用户用户组为users
。
[root@study ~]# chgrp users initial-setup-ks.cfg
[root@study ~]# ls -l
-rw-r--r--. 1 root users 1864 May 4 18:01 initial-setup-ks.cfg
[root@study ~]# chgrp testing initial-setup-ks.cfg
chgrp: invalid group: `testing' <== 发生错误讯息啰~找不到这个群组名~`
修改文件的所属组必须为已有的用户组,上面的当改文件的所属组为testing时,由于Linux中没有这个组,所以就会报错。
3.2 修改文件拥有者(chown)
chown
就是change owner
的缩写,使用者必须是已经存在系统中的账号,也就是在/etc/passwd这个文件中有记录的使用者名称才可以。chown的用途还挺多的,他还可以顺便直接修改群组的名称,修改命令的格式如下:
chown [-R] 帐号名称 文件或目录
chown [-R] 帐号名称:群组名称 文件或目录
-R: 进行递归(recursive)修改,亦即连同子目录下的所有文件、目录都更新为属于这个用户组,常常用在修改某一目录内所有文件的情况下
范例:
范例:将 initial-setup-ks.cfg 的拥有者改为bin这个帐号:
[root@study ~]# chown bin initial-setup-ks.cfg
[root@study ~]# ls -l
-rw-r--r--. 1 bin users 1864 May 4 18:01 initial-setup-ks.cfg
范例:将 initial-setup-ks.cfg 的拥有者与群组改回为root:
[root@study ~]# chown root:root initial-setup-ks.cfg
[root@study ~]# ls -l
-rw-r--r--. 1 root root 1864 May 4 18:01 initial-setup-ks.cfg
3.3 修改文件权限(chmod)
权限的设置方法有两种,分别是使用数字或者是符号来进行权限的变更。我觉得数字修改权限更方便,所以在这我只讲数字更改文件权限的方法。
Linux文件的基本权限就有9个,分别是拥有者(owner)、所属群组(group)、其他人(others)
三种身份各自自己的读(read)、写(write)、执行(execute)
权限。使用数字修改文件的权限,每个权限都可以由一个数字来代替,如下:
r: 4
w: 2
x: 1
每种身份拥有者(owner)、所属群组(group)、其他人(others)
的各自的三个权限读(read)、写(write)、执行(execute)
需要累加,,例如文件的权限为:[-rwxrwx---]
,该文件的权限数字为770,计算如下:
owner = rwx = 4+2+1 = 7
group = rwx = 4+2+1 = 7
others = --- = 0+0+0 = 0
修改文件权限的命令为:
chmod [-R] xxx 文件或目录
#xxx就是各个身份的权限数字
-R: 进行递归(recursive)修改,亦即连同子目录下的所有文件、目录都更新为属于这个用户组,常常用在修改某一目录内所有文件的情况下
举例来说,如果要将.bashrc这个文件所有的权限都设置启用,那么就需要设置数字权限777
:
范例:
[root@study ~]# ls -al .bashrc
-rw-r--r--. 1 root root 176 Dec 29 2013 .bashrc
[root@study ~]# chmod 777 .bashrc
[root@study ~]# ls -al .bashrc
-rwxrwxrwx. 1 root root 176 Dec 29 2013 .bashrc