我们梳理一下 Linux 下的用户、用户组、文件权限等基本知识,最后通过一个案例来实际演示一下权限设置的一些操作。
首先 Linux 系统中,是有用户和用户组的概念的,用户就是身份的象征,我们必须以某一个用户身份来操作一个系统,实际上这就对应着我们登录系统时的账号。而用户组就是一些用户的集合,我们可以通过用户组来划分和统一管理某些用户。
比如我要在微信发一条朋友圈,我只想给我的亲人们看,难道我发的时候还要一个个去勾选所有的人?这未免太麻烦了。为了解决这问题,微信里面就有了标签的概念,我们可以提前给好友以标签的方式分类,发的时候直接勾选某个标签就好了,简单高效。实际上这就是用户组的概念,我们可以将某些人进行分组和归类,到时候只需要指定类别或组别就可以了,而不用一个个人去对号入座,从而节省了大量时间。
在 Linux 中,一个用户是可以属于多个组的,一个组也是可以包含多个用户的,下面我以一台
Ubuntu Linux
为例来演示一下相关的命令和操作。
用户和用户组
首先查看所有用户,命令如下:
cut -d':' -f 1 /etc/passwd
这里一行就是一个用户名,由于太多,部分就省略了,实际上这个命令就是从密码文件中把用户名单独列出来了。
然后查看所有用户组,命令也是类似的:
cut -d':' -f 1 /etc/group
结果基本是类似的,因为每个用户在被创建的时候都会自动创建一个同名的组作为其默认的用户组。
这里我是使用 ubuntu 这个账号来登录的,下面我来看下 ubuntu 这个账号是属于哪些组。
功能
在Linux中 useradd 命令用来创建或更新用户信息。
useradd 命令属于比较难用的命令 (low level utility for adding users),所以 Debian 系的发行版中建议管理员使用 adduser 命令。其实 adduser 命令只是一个调用了 useradd 命令的脚本文件。
本文将详细分析群组和家目录相关的选项。并且以实例的方式介绍常用的 useradd 命令写法。
语法和基本选项
注意:本文并不是一个完整的文档,所以仅列出部分常用的选项进行说明。
useradd [option] username
[option]:
-d<登入目录> 指定用户登入时的目录。
-g<群组> 初始群组。
-G<群组> 非初始群组。
-m 自动创建用户的家目录。
-M 不要创建用户的家目录。
-N 不要创建以用户名称为名的群组。
-s 指定用户登入后所使用的shell。
查看一个用户所属组的命令格式如下:
groups <username>
这里就是 groups 命令加上用户名就能查看该用户名所属的组了,如果不加用户名的话就默认是当前用户。
例如查看 ubuntu 这个用户所属于的组,命令如下:
groups ubuntu
结果:
ubuntu : ubuntu adm cdrom sudo dip plugdev lxd lpadmin sambashare
还不少,这个用户被分配到了很多组下,比如同名的组 ubuntu,还有 sudo 组,另外还有一些其他的组。
其中 sudo 组比较特殊,如果被分到了这个组里面就代表该账号拥有 root 权限,可以使用 sudo 命令。
了解了怎样查看用户所属的组,我们也应该反过来了解如何查看一个用户组里面包含哪些用户啊。
查看某个用户组下所有用户命令如下:
members <group>
不过这个命令不是自带的,需要额外安装 members 包,命令如下:
sudo apt-get install members
例如查看 sudo 用户组下的所有用户,即拥有 root 权限的用户:
members sudo
结果:
ubuntu hadoop
可以看到拥有 root 权限的用户有两个,ubuntu 和 hadoop,当然不同的机器结果肯定是不一样的。
接下来介绍一个比较有用的命令,就是 id 命令,它可以用来查看用户的所属组别,格式如下:
id <username>
例如查看 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 useradd <username>
比如我要添加一个用户 cqc,命令就可以这么写:
sudo useradd cqc
这里使用的命令前面都带有 sudo,因为毕竟是系统级别的操作。
添加一个组的命令格式如下:
sudo groupadd <group>
格式是类似的,后面跟一个组的名称就可以了,例如我要为我的实验室创建一个用户组,那么就可以使用如下命令:
sudo groupadd lab
创建完了用户和组,那得把它们关联起来吧,关联的意思就是把某个用户加入到某个组里面,命令格式如下:
sudo useradd <username> <group>
或者使用 usermod 命令:
sudo usermod -G <group> <username>
如果要添加多个组的话,可以通过 -a 选项指定多个名称:
sudo usermod -aG <group1,group2,group3..> <username>
例如我要将 cqc 用户添加到 sudo 用户组中,命令就是:
sudo useradd cqc sudo
或:
sudo useradd -G sudo cqc
这样就为用户和用户组做好关联了。
细说用户组
首先我们要搞清楚,什么是初始群组?简单来说在 /etc/passwd 文件中,每行的第四个字段指定的就是用户的初始群组。用户登录后立即就拥有了初始群组中的权限。
下面我们通过不同的命令来查看群组选项的用法:
sudo useradd tester1
没有使用任何群组相关的参数,默认在创建用户 tester1 的同时会创建一个同名的群组。用户 tester1 的初始群组就是这个新建的群组。
sudo useradd tester2 -N
这次我们使用了 -N 选项,即不要生成与用户同名的群组。查看下 /etc/passwd 文件,发现 tester2 用户的初始群组ID是100。这个100是哪来的?有ID为100的群组吗?其实100作为 -N 的默认值是写在配置文件中的。不管有没有ID为100的群组,都是这个值。当然我们也可以通过修改配置文件来改变这个默认值!
sudo useradd tester3 -g sudo
sudo 是一个非常有权势的群组,我决定把 tester3 加入到这个群组。好,现在去查看一下 /etc/passwd 和 /etc/group 文件,看看有没有新的群组被创建? tester3 的初始群组又是谁?这次没有创建与 tester3 同名的群组。用户 tester3 的初始群组变成了 sudo。
sudo useradd tester4 -G sudo
和上一条命令相比我们只是把小写的g替换成了大写的G。但结果可相差太多了,请您一定要好好的检查 /etc/passwd 和 /etc/group 文件。因为这次不仅创建了群组 tester4,它还是用户 tester4 的初始群组。和tester1 的唯一不同是 tester4 被加入了 sudo 群组。
在实际的使用中,tester3 和 tester4 的场景都是比较常见的,需要根据实际情况进行区分。
细说家目录
Useradd 命令对用户家目录的处理让人困惑,下面我们将通过实验来了解家目录相关的不同选项的使用方法:
sudo useradd tester1
让我们重新看看创建用户 tester1 这条命令。它不会为用户 tester1 创建名为 tester1 的目录作为家目录,但是我们打开 /etc/passwd 文件,发现 tester1 的记录中居然包含了家目录 /home/tester1。
tester1:x:1005:1005::/home/tester1:
这让人不可思议,但这条命令确实是这么实现的。
sudo useradd -m tester5
若要在创建用户的同时创建用户的家目录,必须指定 -m 选项。
sudo useradd -d /home/abc tester6
我们希望自己指定家目录,此时不生成目录 abc
sudo useradd -d /home/abcd -m tester7
此时生成目录 abcd,并且目录下默认存在文件
常见用例
Case 1: 创建一个带有家目录并且可以登录 bash 的用户
sudo useradd -m -s /bin/bash tester1
Case 2: 指定创建用户家目录的路径
sudo useradd -m -d /home/xxx tester2
/home/xxx目录会被创建。
Case 3: 创建用户家目录且能登录bash的用户,所属组,同时填写用户密码
useradd -m -s /bin/bash -d /home/test/ -G root -p xxxxxx tester3
Case 4: 创建一个没有家目录且不能登录的用户
sudo useradd -s /sbin/nologin tester3
Case 5: 创建时把用户加入不同的用户组
sudo useradd -m -G xxx,sudo tester4
注意过个组名使用逗号分隔,不能有空格。