用户管理与权限管理
这节课讲解用户管理与权限管理的知识,这一节讲的知识点在工作中可能不会由你来进行实操,但是你得知道怎么回事。因为下面大量的操作都涉及到一个用户—root,root 是 Linux中级别最高的一个用户,在企业中,也很少会给你 root 用户的密码。如果一个公司直接给你们root 密码,那你就可以考虑写一个辞职信了,因为正经一点的大公司都会有一个专门的职位——运维工程师,专门负责root的密码。
那我们为什么还要讲这一节的知识点呢?因为 Linux 服务器是多用户、多任务的,一般是多个人、多个部门使用一台服务器,或者是在一台服务器上运行需要不同组件的管理员权限,这个时候肯定是会有角色的划分的,你虽然不会去实操创建用户、设置权限,但是你必须清楚你想要的是一个什么样的账户,以及这个账户需要有什么样的权限和能够操作哪些文件。
整体来说,有一个三位一体的概念——用户、权限、资源。这三个必须绑定在一起才有意义。例如你只知道创建用户,你就是创建一万个用户,也没有什么用,除非创建的用户与某些资源捆绑起来,再施加一个权限给用户,这样的设置才是一个有意义的具有特定权限能够使用特定资源的用户。
我们可以先举一个简单的例子,将我们要讲的知识点以及具体操作串一下:
例子:假设公司有两个独立的项目组—group1和group2,起初的时候,这两个项目组之间没有任何的交集,这时我们只需要分别为连个项目组创建两个用户和密码即可。
通过 useradd 命令创建了三个用户,group1、group2和其他用户other(用于后续测试权限)。
接下来我们还需要分别给每个用户设置密码,如果不设置密码,是无法登陆的。
设置密码的命令为 passwd,普通用户只能使用这个命令设置自己的密码,而 root 用户可以通过这个命令修改别人的密码。
然后我们就可以登陆了:
另外,我们还可以使用 id 命令,查看 用户的 UID 和 GID 信息:
默认创建用户(如果不分配组的话)会创建一个与用户名同名的组,该用户就属于这个组。
接下来,我们先来看一下每个用户 家目录 的权限:
我们可以看到,默认情况下,每个用户的家目录只对所有者(即用户本身)具有 rwx 权限,对 组内用户和其它用户都没有权限。
另外,root 可以访问任意用户的家目录:
通过 su 命令,可以切换用户:
且 从 root 用户切换到其它用户不需要输入密码,由其它用户切换到其它用户需要输入密码。
接下来继续说我们的例子:现在我们已经创建了两个项目组的用户,他们分别进行自己的开发,现在,他们需要都使用一个文件夹,且这个文件夹还不能被其他的用户访问。我们该怎么处理:
我们如何在一个服务器中为两个用户设置一个合适的环境呢?只能他们两个访问数据、操作数据,其他用户访问不了。
我们可以创建一个公共share区域,权限对这两个用户开放:
在 root 用户的根目录下创建一个 share 目录:
我们先看一下默认的设置是怎样的:创建者为 root ,归属组为 root ,权限设置为:rwxr-xr-x。与两个项目组的用户没有半毛钱关系。
所以我们现在需要创建一个组,group1 和 group2 归属于这个组,且 share 的归属组也为这个组,对归属组的权限须设置为 rwx,且无其它用户的权限须设置为 ---,步骤如下 1、2、3。
1、通过 groupadd 命令创建一个组groupshare,然后使用 usermod 命令将两个用户添加组groupshare中:
2、改变 share 的归属组:
3、更改 share 目录的权限设置:
修改权限有两种方式:字符型和数值型。这里先使用字符型。
给组加上w的权限(g+w),给其它用户减去 rx 的权限(o-rx)
到此,share 公共区域设置完成。
不过,这时,如果我们直接使用 group1 或者 group2 用户访问 share 目录,还是没有权限,
这是因为我们在 对 share 进行设置之前就已经登录了 group1 和 group2。这时候,我们需要重新登录一下 group1 和 group2 用户,以刷新一下各自对 share 目录的权限。
OK 了。
接下来,我们使用 group1 用户在 share 目录下创建一个 1.py 文件。
之后,如果切换到 group2 用户,尝试编辑 1.py 文件,保存时就会报错:
其实,我们仔细观察一下,1.py 的 权限设置以及归属组就知道了:
group1 创建的 1.py 文件默认是属于 group1 组的,对其他用户的权限设置为只读 r。
所以,我们有两种方法来解决问题:
1、修改 1.py 的归属组为 groupshare。但是 chown 命令只有 root 用户才能使用,如果每次创建一个文件都请求 root 用户修改一次,也太繁琐了,或许很快你就被开除了。
2、修改1.py 对其他用户的权限。(其实其他用户就只有group2,因为share只对groupshare组开放,能进来的只有group1和group2),这里选择修改权限是为了讲一下权限的数值修改方式。
chmod
在设置权限时,可以简单地使用三个数字分别对应 拥有者 / 组 和 其他 用户的权限# 直接修改文件|目录的 读|写|执行 权限,但是不能精确到 拥有者|组|其他 chmod +/-rwx 文件名|目录名

- 常见数字组合有(
u
表示用户/g
表示组/o
表示其他):
777
===>u=rwx,g=rwx,o=rwx
755
===>u=rwx,g=rx,o=rx
644
===>u=rw,g=r,o=r
所以,这里我们就需要
然后,我们在 group2 用户时就可以对 1.py 具有和 group1 一样的 rw 权限了。
其实这节课的内容不是很难,主要在于理解和分析:你需要什么权限,以及如何处理公共文件。
另外,到公司后,你也不会去进行实操,而是需要写清楚一个邮件给运维:我需要一个什么样的用户,能访问什么目录、什么文件,其它用户能访问什么目录、什么文件。
本节课使用到的命令有以下几个,现在分别讲解:
1、useradd
Linux useradd命令用于建立用户帐号。
useradd可用来建立用户帐号。帐号建好之后,再用passwd设定帐号的密码.而可用userdel删除帐号。使用useradd指令所建立的帐号,实际上是保存在/etc/passwd文本文件中。
语法
useradd [-mMnr][-c <备注>][-d <登入目录>][-e <有效期限>][-f <缓冲天数>][-g <群组>][-G <群组>][-s <shell>][-u <uid>][用户帐号]
或
useradd -D [-b][-e <有效期限>][-f <缓冲天数>][-g <群组>][-G <群组>][-s <shell>]
参数说明:
- -c<备注> 加上备注文字。备注文字会保存在passwd的备注栏位中。
- -d<登入目录> 指定用户登入时的启始目录。
- -D 变更预设值.
- -e<有效期限> 指定帐号的有效期限。
- -f<缓冲天数> 指定在密码过期后多少天即关闭该帐号。
- -g<群组> 指定用户所属的群组。
- -G<群组> 指定用户所属的附加群组。
- -m 自动建立用户的登入目录。
- -M 不要自动建立用户的登入目录。
- -n 取消建立以用户名称为名的群组.
- -r 建立系统帐号。
- -s<shell> 指定用户登入后所使用的shell。
- -u<uid> 指定用户ID。
实例
添加一般用户
# useradd tt
为添加的用户指定相应的用户组
# useradd -g root tt
创建一个系统用户
# useradd -r tt
为新添加的用户指定home目录
# useradd -d /home/myd tt
建立用户且制定ID
# useradd caojh -u 544
2、passwd
Linux passwd命令用来更改使用者的密码
语法
passwd [-k] [-l] [-u [-f]] [-d] [-S] [username]
必要参数:
- -d 删除密码
- -f 强制执行
- -k 更新只能发送在过期之后
- -l 停止账号使用
- -S 显示密码信息
- -u 启用已被停止的账户
- -x 设置密码的有效期
- -g 修改群组密码
- -i 过期后停止用户账号
选择参数:
- –help 显示帮助信息
- –version 显示版本信息
实例
修改用户密码
# passwd w3cschool //设置w3cschool用户的密码 Enter new UNIX password: //输入新密码,输入的密码无回显 Retype new UNIX password: //确认密码 passwd: password updated successfully #
显示账号密码信息
# passwd -S w3cschool w3cschool P 05/13/2010 0 99999 7 -1
删除用户密码
# passwd -d lx138 passwd: password expiry information changed.
3、id
Linux id命令用于显示用户的ID,以及所属群组的ID。
id会显示用户以及所属群组的实际与有效ID。若两个ID相同,则仅显示实际ID。若仅指定用户名称,则显示目前用户的ID。
语法
id [-gGnru][--help][--version][用户名称]
参数说明:
- -g或–group 显示用户所属群组的ID。
- -G或–groups 显示用户所属附加群组的ID。
- -n或–name 显示用户,所属群组或附加群组的名称。
- -r或–real 显示实际ID。
- -u或–user 显示用户ID。
- -help 显示帮助。
- -version 显示版本信息。
实例
显示当前用户信息
# id //显示当前用户ID uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=root:system_r:unconfined_t
显示用户群组的ID
# id -g 0
显示所有群组的ID
# id -g 0 1 2 3 4 5 6 10
显示指定用户信息
# id hnlinux
4、su
Linux su命令用于变更为其他使用者的身份,除 root 外,需要键入该使用者的密码。
使用权限:所有使用者。
语法
su [-fmp] [-c command] [-s shell] [--help] [--version] [-] [USER [ARG]]
参数说明:
- -f 或 –fast 不必读启动档(如 csh.cshrc 等),仅用于 csh 或 tcsh
- -m -p 或 –preserve-environment 执行 su 时不改变环境变数
- -c command 或 –command=command 变更为帐号为 USER 的使用者并执行指令(command)后再变回原来使用者
- -s shell 或 –shell=shell 指定要执行的 shell (bash csh tcsh 等),预设值为 /etc/passwd 内的该使用者(USER) shell
- –help 显示说明文件
- –version 显示版本资讯
- – -l 或 –login 这个参数加了之后,就好像是重新 login 为该使用者一样,大部份环境变数(HOME SHELL USER等等)都是以该使用者(USER)为主,并且工作目录也会改变,如果没有指定 USER ,内定是 root
- USER 欲变更的使用者帐号
- ARG 传入新的 shell 参数
实例
变更帐号为 root 并在执行 ls 指令后退出变回原使用者
su -c ls root
变更帐号为 root 并传入 -f 参数给新执行的 shell
su root -f
变更帐号为 clsung 并改变工作目录至 clsung 的家目录(home dir)
su - clsung
切换用户
hnlinux@w3cschool.cc:~$ whoami //显示当前用户 hnlinux hnlinux@w3cschool.cc:~$ pwd //显示当前目录 /home/hnlinux hnlinux@w3cschool.cc:~$ su root //切换到root用户 密码: root@w3cschool.cc:/home/hnlinux# whoami root root@w3cschool.cc:/home/hnlinux# pwd /home/hnlinux
切换用户,改变环境变量
hnlinux@w3cschool.cc:~$ whoami //显示当前用户 hnlinux hnlinux@w3cschool.cc:~$ pwd //显示当前目录 /home/hnlinux hnlinux@w3cschool.cc:~$ su - root //切换到root用户 密码: root@w3cschool.cc:/home/hnlinux# whoami root root@w3cschool.cc:/home/hnlinux# pwd //显示当前目录 /root
5、groupadd
用于创建一个新的工作组
补充说明
groupadd命令 用于创建一个新的工作组,新工作组的信息将被添加到系统文件中。
语法
groupadd(选项)(参数)
选项
-g:指定新建工作组的id;
-r:创建系统工作组,系统工作组的组ID小于500;
-K:覆盖配置文件“/ect/login.defs”;
-o:允许添加组ID号不唯一的工作组。
参数
组名:指定新建工作组的组名。
实例
建立一个新组,并设置组ID加入系统:
groupadd -g 344 jsdigname
6、usermod
Linux usermod命令用于修改用户帐号。
usermod可用来修改用户帐号的各项设定。
语法
usermod [-LU][-c <备注>][-d <登入目录>][-e <有效期限>][-f <缓冲天数>][-g <群组>][-G <群组>][-l <帐号名称>][-s <shell>][-u <uid>][用户帐号]
参数说明:
- -c<备注> 修改用户帐号的备注文字。
- -d登入目录> 修改用户登入时的目录。
- -e<有效期限> 修改帐号的有效期限。
- -f<缓冲天数> 修改在密码过期后多少天即关闭该帐号。
- -g<群组> 修改用户所属的群组。
- -G<群组> 修改用户所属的附加群组。
- -l<帐号名称> 修改用户帐号名称。
- -L 锁定用户密码,使密码无效。
- -s<shell> 修改用户登入后所使用的shell。
- -u<uid> 修改用户ID。
- -U 解除密码锁定。
实例
更改登录目录
# usermod -d /home/hnlinux root
改变用户的uid
# usermod -u 777 root
7、chown
Linux/Unix 是多人多工操作系统,所有的文件皆有拥有者。利用 chown 将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户ID;组可以是组名或者组ID;文件是以空格分开的要改变权限的文件列表,支持通配符。 。
一般来说,这个指令只有是由系统管理者(root)所使用,一般使用者没有权限可以改变别人的文件拥有者,也没有权限可以自己的文件拥有者改设为别人。只有系统管理者(root)才有这样的权限。
使用权限 : root
语法
chown [-cfhvR] [--help] [--version] user[:group] file...
参数 :
- user : 新的文件拥有者的使用者 ID
- group : 新的文件拥有者的使用者群体(group)
- -c : 若该文件拥有者确实已经更改,才显示其更改动作
- -f : 若该文件拥有者无法被更改也不要显示错误讯息
- -h : 只对于连结(link)进行变更,而非该 link 真正指向的文件
- -v : 显示拥有者变更的详细资料
- -R : 对目前目录下的所有文件与子目录进行相同的拥有者变更(即以递回的方式逐个变更)
- –help : 显示辅助说明
- –version : 显示版本
实例
将文件 file1.txt 的拥有者设为 users 群体的使用者 jessie :
chown jessie:users file1.txt
将目前目录下的所有文件与子目录的拥有者皆设为 users 群体的使用者 lamport :
chmod -R lamport:users *
8、userdel
Linux userdel命令用于删除用户帐号。
userdel可删除用户帐号与相关的文件。若不加参数,则仅删除用户帐号,而不删除相关文件。
语法
userdel [-r][用户帐号]
参数说明:
- -r 删除用户登入目录以及目录中所有文件。
实例
删除用户账号
# userdel hnlinux
9、groupdel
Linux groupdel命令用于删除群组。
需要从系统上删除群组时,可用groupdel(group delete)指令来完成这项工作。倘若该群组中仍包括某些用户,则必须先删除这些用户后,方能删除群组。
语法
groupdel [群组名称]
实例
删除一个群组
# groupdel hnuser