介绍
近来和几个同学开发项目,期间使用了一台服务器跑模型,这台服务器是多人公用的,好多人都在里面有自己的帐号,互不干涉内政,一切看上去非常井然有序。
近日,这个服务器上刚挂载了一块新硬碟,是一位同学使用root帐号挂载的,之后将c盘映射到某个文件夹下。但是挂载好了以后发觉使用普通帐号没有权限在文件夹下操作,难以创建文件,于是他干脆就直接把文件夹权限改成777了。我心想,这还了得,改成777了,其他人在上面乱改咋整?会出人命的!
所以,我就这件事详尽梳理了一下Linux下的用户、用户组、文件权限等基本知识,看完这种,之后不要动不动就把文件夹改成777权限了。
基本操作
首选我们梳理一下Linux下的用户、用户组、文件权限等基本知识,之后前面通过一个案例来实际演示一下权限设置的一些操作。
首先Linux系统中,是有用户和用户组的概念的,用户就是身分的象征,我们必须以某一个用户身分来操作一个系统,实际上这就对应着我们登陆系统时的帐号。而用户组就是一些用户的集合,我们可以通过用户组来界定和统一管理个别用户。
例如我要在陌陌发一条同学圈,我只想给我的亲人们看,莫非我发的时侯还要一个个去勾选所有的人?这未免太麻烦了。为了解决这问题,陌陌上面就有了标签的概念,我们可以提早给好友以标签的形式分类,发的时侯直接勾选某个标签就好了,简单高效。实际上这就是用户组的概念,我们可以将个别人进行分组和归类,待会儿只须要指定类别或组别就可以了,而不用一个个人去对号入座,因而节约了大量时间。
在Linux中,一个用户是可以属于多个组的,一个组也是可以包含多个用户的,下边我以一台UbuntuLinux为例来演示一下相关的命令和操作。
用户和用户组
首先查看所有用户,命令如下:
cut -d':' -f 1 /etc/passwd 复制代码
结果:
root daemon bin sys ... ubuntu mysql 复制代码
这儿一行就是一个用户名,因为太多,部份就省略了,实际上这个命令就是从密码文件中把用户名单独列下来了。
之后查看所有用户组,命令也是类似的:
cut -d':' -f 1 /etc/group 复制代码
结果:
root daemon bin sys ... ubuntu mysql 复制代码
结果基本是类似的,由于每位用户在被创建的时侯就会手动创建一个同名的组作为其默认的用户组。
这儿我是使用ubuntu这个帐号来登入的,下边我来看下ubuntu这个帐号是属于什么组。
查看一个用户所属组的命令格式如下:
gorups 复制代码
这儿就是groups命令加上用户名才能查看该用户名所属的组了,若果不加用户名的话就默认是当前用户。
比如查看ubuntu这个用户所属于的组,命令如下:
groups ubuntu 复制代码
结果:
ubuntu : ubuntu adm cdrom sudo dip plugdev lxd lpadmin sambashare 复制代码
还不少,这个用户被分配到了好多组下,例如同名的组ubuntu,还有sudo组,另外还有一些其他的组。
其中sudo组比较特殊,倘若被分到了这个组上面就代表该帐号拥有root权限,可以使用sudo命令。
了解了如何查看用户所属的组,我们也应当反过来了解怎样查看一个用户组上面包含什么用户啊。
查看某个用户组下所有用户命令如下:
members 复制代码
不过这个命令不是自带的,须要额外安装members包,命令如下:
sudo apt-get install members 复制代码
比如查看sudo用户组下的所有用户,即拥有root权限的用户:
members sudo 复制代码
结果:
ubuntu hadoop 复制代码
可以见到拥有root权限的用户有两个,ubuntu和hadoop,其实不同的机器结果肯定是不一样的。
接出来介绍一个比较有用的命令,就是id命令,它可以拿来查看用户的所属组别,格式如下:
id 复制代码
比如查看ubuntu用户的信息,就是这样:
id ubuntu 复制代码
结果:
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命令见到的结果是一致的。
接出来我们再来了解一下怎样创建一个用户和如何为用户分配组别。
添加一个用户命令格式如下:
sudo adduser 复制代码
例如我要添加一个用户cqc,命令就可以如此写:
sudo adduser cqc 复制代码
这儿使用的命令后面都带有sudo,由于其实是系统级别的操作。
添加一个组的命令格式如下:
sudo groupadd 复制代码
格式是类似的,前面跟一个组的名称就可以了,比如我要为我的实验室创建一个用户组,这么就可以使用如下命令:
sudo groupadd lab 复制代码
创建完了用户和组,那得把它们关联上去吧,关联的意思就是把某个用户加入到某个组上面,命令格式如下:
sudo adduser 复制代码
或则使用usermod命令:
sudo usermod -G 复制代码
假如要添加多个组的话,可以通过-a选项指定多个名称:
sudo usermod -aG 复制代码
比如我要将cqc用户添加到sudo用户组中,命令就是:
sudo adduser cqc sudo 复制代码
或:
sudo usermod -G sudo cqc 复制代码
这样就为用户和用户组做好关联了。
文件权限管理
了解了这种以后,我们再来了解一下文件权限的相关知识,下边我们先随意找一个目录,查看一下文件的列表。
列举某个目录下文件详尽信息的命令如下:
ll 复制代码
或则使用:
ls -l 复制代码
例如我这儿列举了/etc/nginx目录下的文件列表:
total 80 drwxr-xr-x 7 root root 4096 Jun 21 22:16 ./ drwxr-xr-x 103 root root 4096 Sep 4 18:04 ../ drwxr-xr-x 2 root root 4096 Jul 12 2017 conf.d/ -rw-r--r-- 1 root root 1077 Feb 12 2017 fastcgi.conf -rw-r--r-- 1 root root 1007 Feb 12 2017 fastcgi_params -rw-r--r-- 1 root root 2837 Feb 12 2017 koi-utf -rw-r--r-- 1 root root 2223 Feb 12 2017 koi-win -rw-r--r-- 1 root root 3957 Feb 12 2017 mime.types -rw-r--r-- 1 root root 1505 Jun 21 20:24 nginx.conf -rw-r--r-- 1 root root 12288 Jun 21 20:44 .nginx.conf.swp -rw-r--r-- 1 root root 180 Feb 12 2017 proxy_params -rw-r--r-- 1 root root 636 Feb 12 2017 scgi_params drwxr-xr-x 2 root root 4096 Jun 21 22:42 sites-available/ drwxr-xr-x 2 root root 4096 Jun 21 19:08 sites-enabled/ drwxr-xr-x 2 root root 4096 Jun 21 19:08 snippets/ -rw-r--r-- 1 root root 664 Feb 12 2017 uwsgi_params drwxr-xr-x 2 root root 4096 Jun 22 02:44 vhosts/ -rw-r--r-- 1 root root 3071 Feb 12 2017 win-utf 复制代码
我们注意到了每一行都是一个文件或文件夹的信息,一共包括七列:
其中第一列的文件权限信息是十分重要的,它由十个字符组成:
我们可以使用chmod命令来改变文件或目录的权限,有那么几种用法。
一种是数字权限命名,rwx对应一个二补码数字,如101就代表拥有读取和执行的权限,而转为十补码的话,r就代表4,w就代表2,x就代表1,之后三个数字加上去就和二补码数字对应上去了。如7=4+2+1,这就对应着rwx;5=4+1,这就对应着r-x。所以,相应地777就代表了rwxrwxrwx,即所有者、所属用户组、其他用户对该文件都拥有读取、写入、执行的权限,这是相当危险的!
赋于权限的命令如下:
sudo chmod 复制代码
比如我要为一个file.txt赋于777权限,就写成:
sudo chmod 777 file.txt 复制代码
另外我们也可以使用代号来赋于权限,代号有u、g、o、a中学,分别代表所有者权限,用户组权限,其他用户权限和所有用户权限,这种代号旁边通过+和-符号来控制权限的添加和移除,再前面跟上权限类型就好,比如:
sudo chmod u-x file.txt 复制代码
就是给所有者移除x权限,也就是执行权限。
sudo chmod g+w file.txt 复制代码
就是为用户组添加w权限,即写入权限。
另外假如是文件夹的话还可以对文件夹进行递归赋权限操作,如:
sudo chmod -R 777 share 复制代码
就是将share文件夹和其内所有内容都赋于777权限。
好,有了权限的标示,那我们还得把用户和用户组与文件关联上去啊,这儿使用的命令就是chown和chgrp命令。
命令格式如下:
sudo chown sudo chgrp 复制代码
比如我要将file.txt的所有者换成cqc,那就可以使用如下命令:
sudo chown cqc file.txt 复制代码
假如我要将file.txt所属用户组换成lab,那就可以使用如下命令:
sudo chgrp lab file.txt 复制代码
另外同样可以使用-R来进行递归操作,如将share文件夹及其内所有内容的所有者都换成cqc,命令如下:
sudo chown -R cqc share/ 复制代码
好,了解了chown、chgrp、chmod以后,我们就可以灵活地对文件权限进行控制了。
实战演示
可能里面说上去有点具象,下边我们以一个实例来演示一下权限控制的流程,通过这个流程,相信理解以上的命令都不在话下了。
首先情况是这样的,我要在某台主机上共享一些文件给我实验室的人,但这台主机上还有其他非实验室的人在使用,我只想让实验室的人查看和更改那些文件,其他人不行。
另外我自己的帐号要有最高权限来管理这种文件的共享权限,即要有root权限。
如今我早已登陆了一个ubuntu的帐号,是系统初始化的,拥有root权限。
下边我就模拟创建三个帐号和一个用户组,来得到如下疗效:
创建自己的帐户
首先我先为自己创建一个帐户,添加一个cqc的用户:
sudo adduser cqc 复制代码
运行以后会提示输入密码和其他信息:
Adding user `cqc' ... Adding new group `cqc' (1002) ... Adding new user `cqc' (1002) with group `cqc' ... Creating home directory `/home/cqc' ... Copying files from `/etc/skel' ... Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully Changing the user information for cqc Enter the new value, or press ENTER for the default Full Name []: Room Number []: Work Phone []: Home Phone []: Other []: Is the information correct? [Y/n] 复制代码
这时侯发觉一个同名的组就被创建了,查看下cqc所在的组:
groups cqc 复制代码
结果如下:
cqc : cqc 复制代码
再用id命令查看下信息:
id cqc 复制代码
结果如下:
uid=1002(cqc) gid=1002(cqc) groups=1002(cqc) 复制代码
可以看见当前cqc只属于cqc用户组。
接出来我们创建一个用户组,称作lab,来标注我的实验室,命令如下:
sudo groupadd lab 复制代码
之后查看下用户组上面的成员:
members lab 复制代码
没有任何结果,说明我们创建了一个空的组,没有任何成员。
之后我们将刚刚创建的cqc加入到该组中,由于我自己也属于该实验室,肯定也要加进来,命令如下:
sudo adduser cqc lab 复制代码
结果:
Adding user `cqc' to group `lab' ... Adding user cqc to group lab Done. 复制代码
之后查看下组内成员:
members lab 复制代码
结果:
cqc 复制代码
这样lab组内就有了cqc这个用户了。
别忘了cqc还须要拥有root权限,所以我们还须要将cqc添加到sudo组内,命令如下:
sudo adduser cqc sudo 复制代码
结果:
Adding user `cqc' to group `sudo' ... Adding user cqc to group sudo Done. 复制代码
这样就成功加入到sudo组了,cqc也就是我的帐户就可以使用sudo命令了。
查看下用户状态:
id cqc 复制代码
结果如下:
uid=1002(cqc) gid=1002(cqc) groups=1002(cqc),27(sudo),1003(lab) 复制代码
这样cqc就属于三个用户组了,既是实验室成员,又拥有root权限。
里面的分配用户组的命令我们也可以使用usermod来实现:
sudo usermod -aG sudo,lab cqc 复制代码
这样就添加到多个组了。
添加实验室用户
接出来,再添加实验室的另外一个人员lbd,之后将其添加到lab组中,流程是类似的,命令如下:
sudo adduser lbd sudo adduser lbd lab 复制代码
运行完毕以后,id命令查看其信息:
id lbd 复制代码
结果如下:
uid=1004(lbd) gid=1005(lbd) groups=1005(lbd),1003(lab) 复制代码
这样就成功创建lbd,并将其添加到实验室lab组了。
添加非实验室用户
最后另外添加一个用户slb,非实验室成员,只创建帐户就好了,命令如下:
sudo adduser slb 复制代码
并且我们不把他加入lab组中。
查看他的状态:
id slb 复制代码
结果如下:
uid=1003(slb) gid=1004(slb) groups=1004(slb) 复制代码
所以两人的状态是这样的:
id cqc uid=1002(cqc) gid=1002(cqc) groups=1002(cqc),27(sudo),1003(lab) id lbd uid=1004(lbd) gid=1005(lbd) groups=1005(lbd),1003(lab) id slb uid=1003(slb) gid=1004(slb) groups=1004(slb) 复制代码
文件权限分配
接出来我们创建一个文件夹来共享实验室数据,置于/srv目录下。之后调用mkdir命令创建名称为share的文件夹,命令如下:
cd /srv sudo mkdir share 复制代码
注意这儿我还是使用ubuntu帐户来创建的。
先看下当前目录权限:
ls -l 复制代码
结果如下:
total 12 drwxr-xr-x 3 root root 4096 Sep 4 18:17 ./ drwxr-xr-x 24 root root 4096 Sep 4 18:17 ../ drwxr-xr-x 2 root root 4096 Sep 4 18:17 share/ 复制代码
可以看见share文件的所有者是root,用户组也是root,权限是755,即只有root拥有更改权限,其他的只有读取和执行权限。
之后步入share文件夹创建一个names.txt:
cd share sudo vi names.txt 复制代码
编辑内容如下:
cqc lbd 复制代码
保存完毕以后,这时查看一下文件权限,如下:
-rw-r----- 1 root root 8 Sep 4 20:00 names.txt 复制代码
权限是640,这表明只有所有者root拥有写入的权限,所在组其组只有读的权限。
这时开启另外一个终端,登陆cqc帐号,实际上是不能查看和更改任何该文件的内容的,下边的更改和读取命令还会提示权限不够:
vi names.txt cat names.txt 复制代码
为何呢?由于该文件是刚刚由ubuntu帐号使用sudo命令创建的,因而文件的所有者是root,并不是cqc,因而虽然文件的权限是640,那也就不能使用文件所有者的权限,但是cqc也不属于root组,所以也不能使用文件组的权限了,因而哪些都看不了,哪些都改不了。
但cqc属于sudo组啊,可以借助sudo命令临时获取root权限,临时以root的身分来操作该文件,这样就可以来查看和更改文件了,因而下边的命令是有效的:
sudo vi names.txt sudo cat names.txt 复制代码
但这样还是须要使用sudo就能更改,很不便捷。
这时假若我们把文件的所有者改成cqc,情况那就不一样了。
使用ubuntu帐号,对names.txt修改其所有者为cqc,改的命令如下:
sudo chown cqc names.txt 复制代码
这时查看下文件信息:
-rw-r----- 1 cqc root 8 Sep 4 20:29 names.txt 复制代码
可以看见所有者信息早已弄成了cqclinux 给用户分配权限,这样cqc帐号再直接查看和更改,那就可以了,不再须要sudo命令:
vi names.txt cat names.txt 复制代码
这样就不会有权限提示,其实加上sudo更是没问题。
好,接出来lbd呢?我们登陆试试更改。
首先当前的文件状态是这样的:
-rw-r----- 1 cqc root 8 Sep 4 20:31 names.txt 复制代码
lbd不是所有者了,因而后面的rw-权限是没哪些用的,但他属于lab组,而该文件对于用户组的权限是r--,也就是读取权限。
我们使用lbd帐号来尝试看下文件的内容:
cat names.txt cat: names.txt: Permission denied 复制代码
很遗憾,又没有权限。由于哪些?由于这个文件的用户组并不是lab啊,而lbd这个用户又不属于root组,所以没有任何权限。
那咋整?将文件的用户组改成lab就好了,使用ubuntu帐号或cqc帐号来操作:
sudo chgrp lab names.txt 复制代码
这样就成功将文件所属用户组改成lab了,接出来再使用lbd帐号查看下文件内容:
cat names.txt 复制代码
就成功读取了。
但是lbd如今是没有写入权限的,由于对于用户组来说,该文件的权限是r--,假如要获取写入权限,我们可以使用如下命令:
sudo chmod g+w names.txt 复制代码
或:
sudo chmod 660 names.txt 复制代码
这样就相当于赋于了rw-权限,下边我们再使用lbd帐号尝试更改这个文件:
vi names.txt 复制代码
就没问题了。
这么对于非实验室同事slb呢?它没有任何权限linux 给用户分配权限,我们登陆slb帐号尝试更改和读取该文件:
cat names.txt vi names.txt 复制代码
均无权限。
所以说,这样我们就成功为实验室的人员赋于了权限,而非实验室的人则没有任何权限。
假如我要为slb赋于读取权限咋整呢?很简单,添加一下就好了:
sudo chmod o+r names.txt 复制代码
这就是为其他用户添加了读取权限。这时slb就可以读取文件,但不能更改文件,也是比较安全的。
好,假如我的文件十分多呢?例如十几二十个,都置于share文件夹内,那不能一个个进行权限设置吧?
这时侯我们只须要针对文件夹进行操作即可,下边的命令就可以为share文件夹赋于775权限红帽子linux,即所有者cqc和所在组lab可对其进行查看和更改,其他的人只能看不能改:
sudo chmod -R 775 share/ sudo chown -R cqc share/ sudo chgrp -R lab share/ 复制代码
注意文件夹通常还会赋于x权限,不然连步入文件夹的权限都没有。这也就是文件夹通常会赋于775、755,而文件会赋于664、600、644、640的缘由了。
赋于775权限以后,share的权限就弄成了:
drwxrwxr-x 2 cqc lab 4096 Sep 4 20:31 share/ 复制代码
这样其他用户就只能看redflag linux,不能改,这样普通文件就没哪些问题了。
如文件夹内包含了可执行文件,还可以单独为其他用户针对可执行文件消除x权限,如消除Python文件的可执行权限:
sudo chmod o-x *.py 复制代码
好了,到如今为止,我们就得心应手地完成了权限控制了!
相信假如你耐心看完的话,哪些用户管理、权限管理,都不在话下!
原文链接: