转载:
https://cuiqingcai.com/6284.html
http://www.runoob.com/linux/linux-user-manage.html
基本概念
在 linux 系统中,有用户和用户组的概念。用户就是身份的象征,我们必须以一个用户身份来操作一个系统,实际上这就对应着我们登录系统时的账号。而用户组就是一些用户的集合,我们可以通过用户组来划分和统一管理某些用户。
比如我要在微信发一条朋友圈,我只想给我的亲人们看,难道我发的时候还要一个个去勾选所有的人?这未免太麻烦了。为了解决这问题,微信里面就有了标签的概念,我们可以提前给好友以标签的方式分类,发的时候直接勾选某个标签就好了,简单高效。实际上这就是用户组的概念,我们可以将某些人进行分组和归类,到时候只需要指定类别或组别就可以了,而不用一个个人去对号入座,从而节省了大量时间。
在 Linux 中,一个用户是可以属于多个组的,一个组也是可以包含多个用户的,下面我以一台 CentOS Linux 为例来演示一下相关的命令和操作。
用户和用户组
查看所有的用户:
cut -d':' -f 1 /etc/passwd
这里一行就是一个用户名,由于太多,部分就省略了,实际上这个命令就是从密码文件中把用户名单独列出来了。
然后查看所有的用户组,命令也是类似的:
cut -d':' -f 1 /etc/group
结果基本是类似的,因为每个用户在被创建的时候都会自动创建一个同名的组作为其默认的用户组。
这里我是使用 root 账户登录的,下面来看一下 root 这个账号是属于哪些组:
查看一个用户所属的组的命令格式如下:
gorups <username>
这里就是 groups 命令加上用户名就能查看该用户名所属的组了,如果不加用户名的话就默认是当前用户。
例如查看 root 这个用户所属于的组,命令如下:
groups root
因为 root 用户比较特殊,登录服务器,查看登录用户的权限:
可以看到 furuiyang 这个用户被分配到了 furuiyang、wheel、docker 组
如果这个用户被分配到了 sudo 组,就代表这个用户具有 root 权限,可以使用 sudo 命令。
了解了怎样查看用户所属的组,我们也应该反过来了解一下如何查看一个用户组里面包含哪些用户:
查看某个用户组下所有的用户的命令如下:
members <group>
不过这个命令不是自带的,需要额外安装 members 包,在ubuntu 下命令如下:
sudo apt-get install members
在centos 上装包: yum install members, 结果是没有这个包…(TODO)
接下来介绍一个比较有用的命令,就是 id 命令,它可以用来查看用户的所属组别,格式如下:
id <username>
这里有一个 gid,作为主工作组,后面还有个 groups,它列出了用户所在的所有组。主工作组只有一个,而后者的数量则不限。可以看到用户组的结果和使用 groups 命令看到的结果是一致的。
接下来我们再来了解一下如何创建一个用户和怎样为用户分配组别。
添加一个用户命令格式如下:
sudo adduser <username>
比如我要再添加一个用户 ruiyang, 命令就可以这么写:
sudo adduser ruiyang
这里使用的命令前面都带有 sudo,因为毕竟是系统级别的操作。
添加一个组的命令格式如下:
sudo groupadd <group>
格式是类似的,后面跟一个组的名称就可以了,例如我要为我的实验室创建一个用户组,那么就可以使用如下命令:
sudo groupadd lab
创建完了用户和组,那得把它们关联起来吧,关联的意思就是把某个用户加入到某个组里面,命令格式如下:
sudo adduser <username> <group>
或者使用 usermod 命令:
sudo usermod -G <group> <username>
如果要添加多个组的话,可以通过 -a 选项指定多个名称:
sudo usermod -aG <group1,group2,group3..> <username>
例如我要将 ruiyang 用户添加到 sudo 用户组中,命令就是:
(TODO 在centos中未找到 sudo 用户组)
sudo adduser ruiyang sudo
或:
sudo usermod -G sudo ruiyang
这样就为用户和用户组做好关联了。
文件权限管理
了解了这些之后,我们再来了解一下文件权限的相关知识,下面我们先随便找一个目录,查看一下文件的列表。
列出某个目录下文件详细信息的命令如下:
ll
或者使用
ls -l
举例:
[root@furuiyang home]$ ll -s
total 40
4 -rw-r--r-- 1 root root 9 Feb 13 21:32 a.txt
4 drwxr-xr-x 3 root root 4096 Nov 23 21:38 dload
4 drwxr-xr-x 3 root root 4096 Dec 22 10:04 numpy-exercises
4 drwxr-xr-x 3 root root 4096 Dec 22 09:59 pandas-exercises
4 drwx------ 2 ruiyang ruiyang 4096 Feb 18 15:20 ruiyang
4 drwxr-xr-x 3 root root 4096 Dec 26 16:38 some_notes
4 drwxr-xr-x 4 root root 4096 Dec 14 18:36 stock_data_process
4 drwxr-xr-x 3 root root 4096 Dec 26 13:44 sync_mysql2mongodb
4 drwxr-xr-x 3 root root 4096 Dec 26 14:04 timed_task
4 drwxr-xr-x 5 root root 4096 Nov 23 18:07 tms
我们注意到了每一行都是一个文件或文件夹的信息,一共包括七列:
- 第一列是文件的权限信息
- 第二列表示该文件夹连接的文件数
- 第三列表示文件所属用户
- 第四列表示文件所属用户组
- 第五列表示文件大小(字节)
- 第六列表示最后修改日期
- 第七列表示文件名
其中第一列的文件权限信息是非常重要的,它由十个字符组成:
- 第一个字符代表文件的类型,有三种,- 代表这是一个文件,d 代表这是一个文件夹,l 代表这是一个链接。
- 第 2-4 个字符代表文件所有者对该文件的权限,r 就是读,w 就是写,x 就是执行,如果是文件夹的话,执行就意味着查看文件夹下的内容,例如 rw- 就代表文件所有者可以对该文件进行读取和写入。
- 第 5-7 个字符代表文件所属组对该文件的权限,含义是一样的,如 r-x 就代表该文件所属组内的所有用户对该文件有读取和执行的权限。
- 第 8-10 个字符代表是其他用户对该文件的权限,含义也是一样的,如 r– 就代表非所有者,非用户组的用户只拥有对该文件的读取权限。
我们可以使用 chmod 命令来改变文件或目录的权限,有这么几种用法。
一种是数字权限命名,rwx 对应一个二进制数字,如 101 就代表拥有读取和执行的权限,而转为十进制的话,r 就代表 4,w 就代表 2,x 就代表 1,然后三个数字加起来就和二进制数字对应起来了。如 7=4+2+1,这就对应着 rwx;5=4+1,这就对应着 r-x。所以,相应地 777 就代表了 rwxrwxrwx,即所有者、所属用户组、其他用户对该文件都拥有读取、写入、执行的权限,这是相当危险的!
赋予权限的命令如下:
sudo chmod <permission> <file>
例如我要为一个 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 权限,即写入权限。