给用户降低执行权限 chmod u+x a.txt
给用户所属组降低写权限,其他用户删掉读权限 chmod g+w,o-r a.txt
给用户所属组降低读写执行权限 chmod g=rwx a.txt
最近和几个同事开发项目,期间使用了一台服务器跑模型,这台服务器是多人公用的,很多人都在里面有自己的帐号,互不干涉内政,一切看起来非常井然有序。近期,这个服务器上刚挂载了一块新硬碟,是一位同学使用 root 账号挂载的,然后将c盘映射到某个文件夹下。然而挂载好了以后发觉使用普通帐号没有权限在文件夹下操作,无法创建文件,于是他干脆就直接把文件夹权限改成 777 了。我心想,这还了得,改成 777 了,其他人在里面乱改咋整?会出人命的!所以,我就这件事详尽梳理了一下 Linux 下的用户、用户组、文件权限等基本知识,看完这种,以后不要动不动就把文件夹改成 777 权限了。
基本操作
首选我们梳理一下 Linux 下的用户、用户组、文件权限等基本知识,然后旁边通过一个案例来实际演示一下权限设置的一些操作。
首先 Linux 系统中,是有用户和用户组的概念的,用户就是身分的象征,我们必须以某一个用户身分来操作一个系统,实际上这就对应着我们登入系统时的帐号。而用户组就是一些用户的集合,我们可以通过用户组来界定和统一管理个别用户。
比如我要在陌陌发一条朋友圈,我只想给我的亲人们看,难道我发的时侯还要一个个去勾选所有的人?这未免太麻烦了。为了解决这问题,微信上面就有了标签的概念,我们可以提早给好友以标签的方法分类,发的时侯直接勾选某个标签就好了,简单高效。实际上这就是用户组的概念linux 查用户 组的权限,我们可以将个别人进行分组和归类,到时候只须要指定类别或组别就可以了,而不用一个个人去对号入座,从而节约了大量时间。
在 Linux 中,一个用户是可以属于多个组的,一个组也是可以包含多个用户的,下面我以一台 Ubuntu Linux 为例来演示一下相关的命令和操作。
用户和用户组
首先查看所有用户,命令如下:
cut-d':'-f1/etc/passwd
结果:
root
daemon
bin
sys
...
ubuntu
mysql
这里一行就是一个用户名,由于太多,部分就省略了,实际上这个命令就是从密码文件中把用户名单独列下来了。
然后查看所有用户组linux培训学校,命令也是类似的:
cut-d':'-f1/etc/group
结果:
root
daemon
bin
sys
...
ubuntu
mysql
结果基本是类似的,因为每位用户在被创建的时侯就会手动创建一个同名的组作为其默认的用户组。
这里我是使用 ubuntu 这个帐号来登陆的,下面我来看下 ubuntu 这个帐号是属于什么组。
查看一个用户所属组的命令格式如下:
gorups
这里就是 groups 命令加上用户名才能查看该用户名所属的组了,如果不加用户名的话就默认是当前用户。
例如查看 ubuntu 这个用户所属于的组,命令如下:
groupsubuntu
结果:
ubuntu:ubuntuadmcdromsudodipplugdevlxdlpadminsambashare
还不少,这个用户被分配到了好多组下,比如同名的组 ubuntu,还有 sudo 组,另外还有一些其他的组。
其中 sudo 组比较特殊,如果被分到了这个组上面就代表该帐号拥有 root 权限,可以使用 sudo 命令。
了解了如何查看用户所属的组,我们也应当反过来了解怎样查看一个用户组上面包含什么用户啊。
查看某个用户组下所有用户命令如下:
members
不过这个命令不是自带的,需要额外安装 members 包,命令如下:
sudoapt-getinstallmembers
例如查看 sudo 用户组下的所有用户,即拥有 root 权限的用户:
memberssudo
结果:
ubuntuhadoop
可以见到拥有 root 权限的用户有两个,ubuntu 和 hadoop,当然不同的机器结果肯定是不一样的。
接下来介绍一个比较有用的命令,就是 id 命令,它可以拿来查看用户的所属组别,格式如下:
id
例如查看 ubuntu 用户的信息,就是这样:
idubuntu
结果:
uid=500(ubuntu)gid=500(ubuntu)groups=500(ubuntu),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),110(lxd),115(lpadmin),116(sambashare)
这里有一个 gid,作为主工作组,后面还有个 groups,它列举了用户所在的所有组。主工作组只有一个,而后者的数目则不限。可以看见用户组的结果和使用 groups 命令见到的结果是一致的。
接下来我们再来了解一下怎样创建一个用户和如何为用户分配组别。
添加一个用户命令格式如下:
sudoadduser
比如我要添加一个用户 cqc,命令就可以如此写:
sudoaddusercqc
这里使用的命令后面都带有 sudo,因为虽然是系统级别的操作。
添加一个组的命令格式如下:
sudogroupadd
格式是类似的,后面跟一个组的名称就可以了,例如我要为我的实验室创建一个用户组,那么就可以使用如下命令:
sudogroupaddlab
创建完了用户和组,那得把它们关联上去吧,关联的意思就是把某个用户加入到某个组上面,命令格式如下:
sudoadduser
或者使用 usermod 命令:
sudousermod-G
如果要添加多个组的话,可以通过 -a 选项指定多个名称:
sudousermod-aG
例如我要将 cqc 用户添加到 sudo 用户组中,命令就是:
sudoaddusercqcsudo
或:
sudousermod-Gsudocqc
这样就为用户和用户组做好关联了。
文件权限管理
了解了这种以后,我们再来了解一下文件权限的相关知识,下面我们先随意找一个目录,查看一下文件的列表。
列出某个目录下文件详尽信息的命令如下:
ll
或者使用:
ls-l
比如我这儿列举了 /etc/nginx 目录下的文件列表:
10
11
12
13
14
15
16
17
18
19
total80
drwxr-xr-x7rootroot4096Jun2122:16./
drwxr-xr-x103rootroot4096Sep418:04../
drwxr-xr-x2rootroot4096Jul122017conf.d/
-rw-r--r--1rootroot1077Feb122017fastcgi.conf
-rw-r--r--1rootroot1007Feb122017fastcgi_params
-rw-r--r--1rootroot2837Feb122017koi-utf
-rw-r--r--1rootroot2223Feb122017koi-win
-rw-r--r--1rootroot3957Feb122017mime.types
-rw-r--r--1rootroot1505Jun2120:24nginx.conf
-rw-r--r--1rootroot12288Jun2120:44.nginx.conf.swp
-rw-r--r--1rootroot180Feb122017proxy_params
-rw-r--r--1rootroot636Feb122017scgi_params
drwxr-xr-x2rootroot4096Jun2122:42sites-available/
drwxr-xr-x2rootroot4096Jun2119:08sites-enabled/
drwxr-xr-x2rootroot4096Jun2119:08snippets/
-rw-r--r--1rootroot664Feb122017uwsgi_params
drwxr-xr-x2rootroot4096Jun2202:44vhosts/
-rw-r--r--1rootroot3071Feb122017win-utf
我们注意到了每一行都是一个文件或文件夹的信息,一共包括七列:
其中第一列的文件权限信息是十分重要的,它由十个字符组成:
我们可以使用 chmod 命令来改变文件或目录的权限,有如此几种用法。
一种是数字权限命名,rwx 对应一个二进制数字,如 101 就代表拥有读取和执行的权限,而转为十进制的话,r 就代表 4,w 就代表 2,x 就代表 1,然后三个数字加上去就和二进制数字对应上去了。如 7=4+2+1,这就对应着 rwx;5=4+1,这就对应着 r-x。所以,相应地 777 就代表了 rwxrwxrwx,即所有者、所属用户组、其他用户对该文件都拥有读取、写入、执行的权限,这是相当危险的!
赋予权限的命令如下:
sudochmod
例如我要为一个 file.txt 赋予 777 权限,就写成:
sudochmod777file.txt
另外我们也可以使用代号来赋于权限,代号有 u、g、o、a 四中,分别代表所有者权限,用户组权限,其他用户权限和所有用户权限,这些代号旁边通过 + 和 – 符号来控制权限的添加和移除,再前面跟上权限类型就好,例如:
sudochmodu-xfile.txt
就是给所有者移除 x 权限,也就是执行权限。
sudochmodg+wfile.txt
就是为用户组添加 w 权限,即写入权限。
另外假如是文件夹的话还可以对文件夹进行递归赋权限操作,如:
sudochmod-R777share
就是将 share 文件夹和其内所有内容都赋于 777 权限。
好,有了权限的标示,那我们还得把用户和用户组与文件关联上去啊,这里使用的命令就是 chown 和 chgrp 命令。
命令格式如下:
sudochown
sudochgrp
例如我要将 file.txt 的所有者换成 cqc,那就可以使用如下命令:
sudochowncqcfile.txt
如果我要将 file.txt 所属用户组换成 lab,那就可以使用如下命令:
sudochgrplabfile.txt
另外同样可以使用 -R 来进行递归操作,如将 share 文件夹及其内所有内容的所有者都换成 cqc,命令如下:
sudochown-Rcqcshare/
好,了解了 chown、chgrp、chmod 之后,我们就可以灵活地对文件权限进行控制了。
实战演示
可能里面说起来有点具象,下面我们以一个实例来演示一下权限控制的流程,通过这个流程,相信理解以上的命令都不在话下了。
首先情况是这样的,我要在某台主机上共享一些文件给我实验室的人,但这台主机上还有其他非实验室的人在使用,我只想让实验室的人查看和更改那些文件,其他人不行。
另外我自己的帐号要有最高权限来管理这种文件的共享权限,即要有 root 权限。
现在我早已登陆了一个 ubuntu 的帐号,是系统初始化的,拥有 root 权限。
下面我就模拟创建三个帐号和一个用户组,来得到如下疗效:
创建自己的帐户
首先我先为自己创建一个帐户,添加一个 cqc 的用户:
sudoaddusercqc
运行以后会提示输入密码和其他信息:
10
11
12
13
14
15
16
Addinguser`cqc'...
Addingnewgroup`cqc'(1002)...
Addingnewuser`cqc'(1002)withgroup`cqc'...
Creatinghomedirectory`/home/cqc'...
Copyingfilesfrom`/etc/skel'...
EnternewUNIXpassword:
RetypenewUNIXpassword:
passwd:passwordupdatedsuccessfully
Changingtheuserinformationforcqc
Enterthenewvalue,orpressENTERforthedefault
FullName[]:
RoomNumber[]:
WorkPhone[]:
HomePhone[]:
Other[]:
Istheinformationcorrect?[Y/n]
这时候发觉一个同名的组就被创建了,查看下 cqc 所在的组:
groupscqc
结果如下:
cqc:cqc
再用 id 命令查看下信息:
idcqc
结果如下:
uid=1002(cqc)gid=1002(cqc)groups=1002(cqc)
可以看见当前 cqc 只属于 cqc 用户组。
接下来我们创建一个用户组,叫做 lab,来标注我的实验室,命令如下:
sudogroupaddlab
然后查看下用户组上面的成员:
memberslab
没有任何结果,说明我们创建了一个空的组,没有任何成员。
然后我们将刚刚创建的 cqc 加入到该组中,因为我自己也属于该实验室linux系统,肯定也要加进来,命令如下:
sudoaddusercqclab
结果:
Addinguser`cqc'togroup`lab'...
Addingusercqctogrouplab
Done.
然后查看下组内成员:
memberslab
结果:
cqc
这样 lab 组内就有了 cqc 这个用户了。
别忘了 cqc 还须要拥有 root 权限,所以我们还须要将 cqc 添加到 sudo 组内,命令如下:
sudoaddusercqcsudo
结果:
Addinguser`cqc'togroup`sudo'...
Addingusercqctogroupsudo
Done.
这样就成功加入到 sudo 组了,cqc 也就是我的帐户就可以使用 sudo 命令了。
查看下用户状态:
idcqc
结果如下:
uid=1002(cqc)gid=1002(cqc)groups=1002(cqc),27(sudo),1003(lab)
这样 cqc 就属于三个用户组了,既是实验室成员,又拥有 root 权限。
上面的分配用户组的命令我们也可以使用 usermod 来实现:
sudousermod-aGsudo,labcqc
这样就添加到多个组了。
添加实验室用户
接下来,再添加实验室的另外一个人员 lbd,然后将其添加到 lab 组中,流程是类似的,命令如下:
sudoadduserlbd
sudoadduserlbdlab
运行完毕以后,id 命令查看其信息:
idlbd
结果如下:
uid=1004(lbd)gid=1005(lbd)groups=1005(lbd),1003(lab)
这样就成功创建 lbd,并将其添加到实验室 lab 组了。
添加非实验室用户
最后另外添加一个用户 slb,非实验室成员,只创建帐户就好了linux 查用户 组的权限,命令如下:
sudoadduserslb
但是我们不把他加入 lab 组中。
查看他的状态:
idslb
结果如下:
uid=1003(slb)gid=1004(slb)groups=1004(slb)
所以两人的状态是这样的:
idcqc
uid=1002(cqc)gid=1002(cqc)groups=1002(cqc),27(sudo),1003(lab)
idlbd
uid=1004(lbd)gid=1005(lbd)groups=1005(lbd),1003(lab)
idslb
uid=1003(slb)gid=1004(slb)groups=1004(slb)
文件权限分配
接下来我们创建一个文件夹来共享实验室数据,放在 /srv 目录下。然后调用 mkdir 命令创建名称为 share 的文件夹,命令如下:
cd/srv
sudomkdirshare
注意这儿我还是使用 ubuntu 账户来创建的。
先看下当前目录权限:
ls-l
结果如下:
total12
drwxr-xr-x3rootroot4096Sep418:17./
drwxr-xr-x24rootroot4096Sep418:17../
drwxr-xr-x2rootroot4096Sep418:17share/
可以看见 share 文件的所有者是 root,用户组也是 root,权限是 755,即只有 root 拥有更改权限,其他的只有读取和执行权限。
然后步入 share 文件夹创建一个 names.txt:
cdshare
sudovinames.txt
编辑内容如下:
cqc
lbd
保存完毕以后,这时查看一下文件权限,如下:
-rw-r-----1rootroot8Sep420:00names.txt
权限是 640,这表明只有所有者 root 拥有写入的权限,所在组只有读的权限。
这时开启另外一个终端,登录 cqc 账号,实际上是不能查看和更改任何该文件的内容的,下面的更改和读取命令还会提示权限不够:
vinames.txt
catnames.txt
为什么呢?因为该文件是刚刚由 ubuntu 账号使用 sudo 命令创建的,因此文件的所有者是 root,并不是 cqc,因此虽然文件的权限是 640,那也就不能使用文件所有者的权限,而且 cqc 也不属于 root 组,所以也不能使用文件组的权限了,因此哪些都看不了,什么都改不了。
但 cqc 属于 sudo 组啊,可以借助 sudo 命令临时获取 root 权限,临时以 root 的身分来操作该文件,这样就可以来查看和更改文件了,因此下边的命令是有效的:
sudovinames.txt
sudocatnames.txt
但这样还是须要使用 sudo 才能更改,很不便捷。
这时假若我们把文件的所有者改成 cqc,情况那就不一样了。
使用 ubuntu 账号,对 names.txt 更改其所有者为 cqc,改的命令如下:
sudochowncqcnames.txt
这时查看下文件信息:
-rw-r-----1cqcroot8Sep420:29names.txt
可以看见所有者信息早已弄成了 cqc,这样 cqc 账号再直接查看和更改,那就可以了,不再须要 sudo 命令:
vinames.txt
catnames.txt
这样就不会有权限提示,当然加上 sudo 更是没问题。
好,接下来 lbd 呢?我们登陆试试更改。
首先当前的文件状态是这样的:
-rw-r-----1cqcroot8Sep420:31names.txt
lbd 不是所有者了,因此上面的 rw- 权限是没哪些用的,但他属于 lab 组,而该文件对于用户组的权限是 r–,也就是读取权限。
我们使用 lbd 账号来尝试看下文件的内容:
catnames.txt
cat:names.txt:Permissiondenied
很遗憾,又没有权限。因为哪些?因为这个文件的用户组并不是 lab 啊,而 lbd 这个用户又不属于 root 组,所以没有任何权限。
那咋整?将文件的用户组改成 lab 就好了,使用 ubuntu 账号或 cqc 账号来操作:
sudochgrplabnames.txt
这样就成功将文件所属用户组改成 lab 了,接下来再使用 lbd 账号查看下文件内容:
catnames.txt
就成功读取了。
然而 lbd 现在是没有写入权限的,因为对于用户组来说,该文件的权限是 r–,如果要获取写入权限,我们可以使用如下命令:
sudochmodg+wnames.txt
或:
sudochmod660names.txt
这样就相当于赋于了 rw- 权限,下面我们再使用 lbd 账号尝试更改这个文件:
vinames.txt
就没问题了。
那么对于非实验室朋友 slb 呢?它没有任何权限,我们登陆 slb 账号尝试更改和读取该文件:
catnames.txt
vinames.txt
均无权限。
所以说,这样我们就成功为实验室的人员赋于了权限,而非实验室的人则没有任何权限。
如果我要为 slb 赋予读取权限咋整呢?很简单,添加一下就好了:
sudochmodo+rnames.txt
这就是为其他用户添加了读取权限。这时 slb 就可以读取文件,但不能更改文件,也是比较安全的。
好,如果我的文件十分多呢?比如十几二十个,都置于 share 文件夹内,那不能一个个进行权限设置吧?
这时候我们只须要针对文件夹进行操作即可,下面的命令就可以为 share 文件夹赋于 775 权限,即所有者 cqc 和所在组 lab 可对其进行查看和更改,其他的人只能看不能改:
sudochmod-R775share/
sudochown-Rcqcshare/
sudochgrp-Rlabshare/
注意文件夹通常还会赋于 x 权限,不然连步入文件夹的权限都没有。这也就是文件夹通常会赋于 775、755,而文件会赋于 664、600、644、640 的诱因了。
赋予 775 权限以后,share 的权限就弄成了:
drwxrwxr-x2cqclab4096Sep420:31share/
这样其他用户就只能看,不能改,这样普通文件就没哪些问题了。
如文件夹内包含了可执行文件,还可以单独为其他用户针对可执行文件消除 x 权限,如消除 Python 文件的可执行权限:
sudochmodo-x*.py
好了,到如今为止,我们就得心应手地完成了权限控制了!
相信假如你耐心看完的话,什么用户管理、权限管理,都不在话下!
转载请标明:静觅解读 Linux 下的用户管理、用户组管理和权限管理