用户与群组 编辑 请登陆,再编辑

前言

每个LINUX登陆的使用者至少都会取得两个 ID :

使用者 ID (User ID ,简称 UID)

群组 ID (Group ID ,简称 GID)

这个是LINUX下用户与群组最基础的知识,本条目简单介绍LINUX下的用户与群组。

用户

用户的类型

用户是能够获取系统资源的权限的集合,账号包括用户名和密码,用户通过账号登陆系统.但是LINUX系统并不是通过用户名称来识别用户,而是通过UID(User Identification),即用户标识符. 并且LINUX的用户分为三类:

用户类型 UID范围 简介

超级管理员 0 ##root用户,具有操作整个系统的所用权限,默认禁止该账户直接登录

系统用户 1~499 ##能够登录系统获得有限权限的用户,并且可以使用sudo获取root权限 默认系统用户为普通用户

普通用户 500~65535(但目前支持到4294967295) ##前两类用户建立的用户,只能执行普通操作

/etc/passwd

用户信息保存在/etc/passwd中,passwd文件是以行为单位的配置文件,每行定义系统上的一个用户,行内分为字段,字段之间由一个冒号隔开。这些字段依次为:

用户名:密码:用户ID:主要组ID:GECOS:主目录:登录shell

字段解释:

用户名:就是一个用户名,登录时候用的
密码:在旧的UNIX系统上,这个字段含有用户的加密密码,为了安全性,现在的linux均显示为x或*号(password并非密码,为密码占位符,实际密码存放在/etc/shadow下)
用户ID:linux内核用于识别用户的一个整数ID
主要组ID:linux内核用于识别用户主要组的一个整数ID
GECOS:用户全名,安装linux时如果不输入全名,则显示为跟用户名一样,如果输入,则显示为全名(不可用于登录)
主目录:用户登录时,他的登录Shell将使用这个目录作为当前工作目录
登录Shell:用户登录时的默认Shell,在redhat 企业版中,登录shell通常是/bin/bash

一个/etc/passwd文件中的典型几行数据

root:x:0:0:root:/root:/bin/bash
apache:x:48:48:Apache:/var/www:/sbin/nologin
tomcat:x:91:91:Apache Tomcat:/usr/share/tomcat6:/bin/sh

说明:第2个字段用户加密后的密码在现代linux中不显示的,显示为"x"或"*"号,如需了解passwd详细信息,可终端执行: man 5 passwd

命令来查看.

/etc/shadow

以前用户的加密都是被保存在/etc/passwd文件中的第2个字段中,并且每个用户都可以读取,随着计算机性能的发展,暴力破解变得相对比较容易,因此,现在linux采用一种“影子密码”,用户的密码被保存在专门的/etc/shadow文件中,其权限不允许普通用户查看,root用户可以查看,了解详细信息可终端执行:

man 5 shadow。

/etc/shadow文件信息存储结构,包括九个字段用:隔开依次为:

用户名:加密密码:上次更改密码的时间:最小更改密码间隔:密码有效期限:密码过期提示时间:密码锁定期:账户有效期:保留字段
第一字段:用户名(也被称为登录名),在/etc/shadow中,用户名和/etc/passwd 是相同的,这样就把passwd 和shadow中用的用户记录联系在一起;这个字段是非空的;
第二字段:密码(已被加密),如果是有些用户在这段是x,表示这个用户不能登录到系统;这个字段是非空的;
第三字段:上次修改口令的时间;这个时间是从1970年01月01日算起到最近一次修改口令的时间间隔(天数),您可以通过passwd 来修改用户的密码,然后查看/etc/shadow中此字段的变化;
第四字段:两次修改口令间隔最少的天数;如果设置为0,则禁用此功能;也就是说用户必须经过多少天才能修改其口令;此项功能用处不是太大;默认值是通过/etc/login.defs文件定义中获取,PASS_MIN_DAYS 中有定义;
第五字段:两次修改口令间隔最多的天数;这个能增强管理员管理用户口令的时效性,应该说在增强了系统的安全性;如果是系统默认值,是在添加用户时由/etc/login.defs文件定义中获取,在PASS_MAX_DAYS 中定义;
第六字段:提前多少天警告用户口令将过期;当用户登录系统后,系统登录程序提醒用户口令将要作废;如果是系统默认值,是在添加用户时由/etc/login.defs文件定义中获取,在PASS_WARN_AGE 中定义;
第七字段:在口令过期之后多少天禁用此用户;此字段表示用户口令作废多少天后,系统会禁用此用户,也就是说系统会不能再让此用户登录,也不会提示用户过期,是完全禁用;
第八字段:用户过期日期;此字段指定了用户作废的天数(从1970年的1月1日开始的天数),如果这个字段的值为空,帐号永久可用;
第九字段:保留字段,目前为空,以备将来Linux发展之用

举例例子说明:

beinan:$1$VE.Mq2Xf$2c9Qi7EQ9JP8GKF8gH7PB1:13072:0:99999:7:::
linuxsir:$1$IPDvUhXP$8R6J/VtPXvLyXxhLWPrnt/:13072:0:99999:7::13108:
第一字段:用户名(也被称之为登录名),在例子中有两条记录,也表示有两个用户beinan和linuxsir
第二字段:被加密的密码,如果有的用户在此字段中是x,表示这个用户不能登录系统,也可以看作是虚拟用户,不过虚拟用户和真实用户都是相对的,系统管理员随时可以对任何用户操作;
第三字段:表示上次更改口令的天数(距1970年01月01日),上面的例子能说明beinan和linuxsir这两个用户,是在同一天更改了用户密码,当然是通过passwd 命令来更改的,更改密码的时间距1970年01月01日的天数为13072;
第四字段:禁用两次口令修改之间最小天数的功能,设置为0
第五字段:两次修改口令间隔最多的天数,在例子中都是99999天;这个值如果在添加用户时没有指定的话,是通过/etc/login.defs来获取默认值,PASS_MAX_DAYS 99999;您可以查看/etc/login.defs来查看,具体的值;
第六字段:提前多少天警告用户口令将过期;当用户登录系统后,系统登录程序提醒用户口令将要作废;如果是系统默认值,是在添加用户时由/etc/login.defs文件定义中获取,在PASS_WARN_AGE 中定义;在例子中的值是7 ,表示在用户口令将过期的前7天警告用户更改期口令;
第七字段:在口令过期之后多少天禁用此用户;此字段表示用户口令作废多少天后,系统会禁用此用户,也就是说系统会不能再让此用户登录,也不会提示用户过期,是完全禁用;在例子中,此字段两个用户的都是空的,表示禁用这个功能;
第八字段:用户过期日期;此字段指定了用户作废的天数(从1970年的1月1日开始的天数),如果这个字段的值为空,帐号永久可用;在例子中,我们看到beinan这个用户在此字段是空的,表示此用户永久可用;而linuxsir这个用户表示在距1970年01月01日后13108天后过期,算起来也就是2005年11月21号过期;
第九字段:保留字段,目前为空,以备将来Linux发展之用

用户管理

添加用户

useradd命令可以建新用户hilbert,终端执行:

sudo useradd hilbert   

该命令会在 /etc/passwd中创建如下条目。

hilbert:*:1001:1001::/home/hilbert:/bin/sh

注意:useradd在密码区域放了一个星号,在指定一个真正的密码前禁用该账号。

useradd在被赋予一些参数后就会更加有用。

举例说明,我们指定 hilbert 的首要组为“faculty”,还需要把他添加进“famous”组。我们自行设置了家目录并让 useradd命令在这个家目录不存在时创建它.终端执行:

sudo  useradd -c "David Hilbert" -d /home/math/hilbert -g faculty -G famous -m -s /bin/sh hilbert

该命令创建了下面的passwd条目:

sudo  hilbert:x:1001:1001:David Hilbert:/home/math/hilbert:/bin/sh

分配到的UID比系统中最高的UID要高,与之相关的shadow条目为:

sudo hilbert:!:15597:0:99999:7:::

useradd也将 "hilbert"添加到/etc/group中的 “faculty”及“famous”组。创建目录/home/math/hilbert,并根据/etc/skel目录的内容创建相关文件。

可以通过运行useradd -D来确定useradd的默认设置。 你也可以将-D标记(flag)与其他参数联用来设置这些默认值。

adduser命令也可以建新用户hilbert,终端执行:

sudo adduser hilbert   

并且自动向导设置hilbert用户的家目录,二无密码和系统Shell。

useradd是一个ELF可执行程序; useradd会添加用户名,并创建和用户名相同的组名,但它并不在/home目录下创建基于用户名的目录,也不提示创建新的密码。

-b, –base-dir BASE_DIR 指定home目录的base目录

-d, –home-dir HOME_DIR 指定home目录

-g, –gid GROUP 指定gid

-l, –no-log-init do not add the user to the lastlog and

faillog databases

不要把用户添加到lastlog和failog中, 这个用户的登录记录不需要记载

-M, –no-create-home 不要建立home目录

-p, –password PASSWORD 指定新用户的密码

-r, –system 建立一个系统帐号

-s, –shell SHELL 指定shell

adduser -m -d /usr/system -s /bin/bash -p passwd system 而adduser是一个perl脚本, 可以交互式地设定一些用户参数

问题 adduser的-p 参数 并不能加密密码 /usr/sbin/usermod 与 useradd的参数很类似 usermod –password PASSWORD username

总结

总结上来讲,在Linux中,adduser更适合初级使用者,因为不用去记那些繁琐的参数选项,只要跟着系统的提示一步*一步进行下去就行,缺点就是整个创建过程比较复杂而漫长;

而useradd比较适合有些高阶经验的使用者,往往一行命令加参数就能解决很多问题,所以创建起来十分方便。

修改用户

usermod命令可以用来修改用户账户的各项设置和相关信息

语法:usermod [-LU][-c <备注>][-d <登入目录>][-e <有效期限>][-f <缓冲天数>][-g <群组>][-G <群组>][-l <帐号名称>][-s <shell>][-u <uid>][用户帐号]

参数:
 -c<备注>  修改用户帐号的备注文字。 

  -d登入目录>  修改用户登入时的目录。  -e<有效期限>  修改帐号的有效期限。  -f<缓冲天数>  修改在密码过期后多少天即关闭该帐号。   -g<群组>  修改用户所属的群组。 -G<群组>  修改用户所属的附加群组。   -l<帐号名称>  修改用户帐号名称。  -L  锁定用户密码,使密码无效。  -s  修改用户登入后所使用的shell。   -u  修改用户ID。  -U  解除密码锁定。

例子:

sudo usermod -e 2015-07-04 ##hilbert 设置hilbert的账号于2015年07月04日到期
sudo usermod -G staff ##newuser2将newuser2添加到组staff中
sudo usermod -l newuser1 ##newuser修改newuser的用户名为newuser1 
sudo usermod -L newuser1 ##锁定账号newuser1 
sudo usermod -U newuser1 ##解除对newuser1的锁定

注意:usermod不允许你改变正在线上的使用者帐号名称 。 当usermod用来改变user ID,必须确认这名user没在电脑上执行任何程序。 你需手动更改使用者的crontab档。也需手动更改使用者的at工作档。 采用NIS server须在server上更动相关的NIS设定 。

删除用户

userdel命令用来删除用户账户,要移除hilbert用户,我们可以使用下面的命令:

sudo userdel hilbert    ##删除hilbert用户在passwd、shadow、group文件中的相关条目,不删除hilbert的家目录
sudo userdel -r hilbert ##删除hilbert用户在passwd、shadow、group文件中的相关条目并且删除hilbert的家目录

群组

群组介绍

Linux中为了使用户共享文件或者其他资源方便,引入了群组的功能:

Linux中每一个用户属于一个群组(group),而每一个群组(group)都有一个group标示符,即GID. 所有群组和对应的gid都存放在根目录的/etc/group中

Linux系统在创建每一个用户时就为每一个用户创建了了一个同名的群组,并将这个用户加入到该群组中,也就是说至少每个用户都有一个同名的群组,当然也可以加入到其他群组中。加入到其他群组是为了获取适当的权限来访问特定的资源。

如果一个文件属于一个群组,则这个群组的所有用户都能存取这个文件。

/etc/group

群组信息保存在/etc/group中,控制用户如何分组。它的格式如下:

groupname:password:gid:members

/etc/group文件信息存储结构,包括4个字段用:隔开依次为:

第一个字段的是组名:是群组的名称,由字母或数字构成。与/etc/passwd中的登录名一样,组名不应重复
第二个字段的是口令:字段存放的是群组加密后的口令字。一般Linux系统的群组都没有口令,即这个字段一般为空,或者是x
第三个字段的是组标识号:即GID
第四个字段的是组内用户列表:每个用户之间用,号分割;本字段可以为空;如果字段为空表示群组为GID的用户名

下面是组文件的部分内容:

more /etc/group 
 root:x:0:
daemon:x:1:
...
第一个字段root和daemon,表示有root和daemon两个群
第二个字段x,表示root群组和daemon群组的群组密码,已经加密
第三个字段0和1,表示root群组的GID为0,daemon群组GID为1
第四个字段空,表示有root和daemon两个群组

/etc/gshadow

Linux群组密码存放在/etc/gshadow文件中,只有在特权用户才能访问。在linux中一般很少用到群组密码。

/etc/gshadow文件信息存储结构,包括4个字段用:隔开依次为:

第一个字段就是这个群的名字
第二个字段的x表示这个群组在登录这个群组的密码
第三个字段是群组的gid
第四个字段是这个群组中还有哪些成员

举例说明:显示本机群组,终端执行(只截取两段):

more /etc/group
root:x:0:
adm:x:4:cxbii
第一个字段root和adm,表示有root和adm两个群
第二个字段x,表示root群组和adm群组的群组密码,已经加密
第三个字段0和4,表示root群组的GID为0,adm群组GID为4
第四个字段为空和cxbii,表示root群组的没有成员, adm群组有cxbii一个用户 

群组管理

添加群组

groupadd命令可以添加群组

语法:groupadd [-g gid [-o]] [-r] [-f] group
参数:
-g gid group’s ID 值 .除非使用
-o 参数不然该值必须是唯一, 不可相同.数值不可为负。预设为最小不得小于500而逐次增加。 0~999 传统上是保留给系统帐号使用。
-r 此 参数是用来建立系统帐号。的 UID 会比定义在系统档上/etc/login.defs. 的 UID_MIN 来的小.注意 useradd 此法所建立的帐号不会建立使用者目录,也不会在乎纪录在 /etc/login.defs. 的定义值 . 如果你想要有使用者目录须额外指定。
-m 参数来建立系统帐号。 这是 RED HAT 额外增设的选项。它会自动帮你选定一个小于999 的 gif 不需要 再加上 -g 参数。这是RED HAT 额外增设的选项。
-f 新增一个已经存在的群组帐号,系统会出现错误讯息然后结束groupadd .如果是这样的情况,不会新增这个群组(如果 是这个情况下,系统不会再新增一次)也可同时加上
-g 选项当你加上一个gid,此时 gid 就不用是唯一值,可不加 -o 参数,建好群组后会显结果 

举例使用: sudo groupadd cjh ##建立cjh群组 sudo groupadd cjh #3建立cjh群组,并且在/etc/passwd文件中产生一个组ID(GID)是344的项目。

删除群组

groupdel命令可以删除群组

sudo  groupdel group cjh ##删除cjh群组

设置群组密码

gpasswd命令可以设置群组密码:

sudo gpasswd group_name

取消组密码

使用gpasswd命令可以取消群组密码:

sudo gpasswd-r group_name

说明:取消密组码后,只有成员才可以通过newgrp命令切换入该组。

修改组成员

gpasswd命令可以修改向指定群组的用户:

语法:用法:gpasswd[-a user][-d user][-A user,...][-M user,...][-r][-R]groupname
参数:
-a:添加用户到组
-d:从组删除用户
-A:指定管理员
-M:指定组成员和-A的用途差不多
-r:删除密码
-R:限制用户登入组,只有组中的成员才可以用newgrp加入该组

增加群组用户

sudo gpasswd-a cxbii root ##把cxbii加入rooot群组

删除组成员

sudo gpasswd-d cxbii root ##把cxbii移出rooot群组

身份切换

拥有可以毁灭自身这样强大权限的用户只有root用户一位,但是由于root用户权限过大,直接使用root用户登陆系统操作是很危险的事情,但是部分事情只有root权限能做,那么就涉及到了身份切换.与身份切换相关的有两个命令:su和sudo.

注意:除非您知道您在做什么,否则请不要轻易尝试以下命令,以下命令不一定保证您操作的安全性,也不能在您发生危险动作时进行及时阻止,可能导致不可挽回的损失!​

su

su:(Switch user 切换用户),可让一个普通用户切换为超级用户或其他用户,并可临时拥有所切换用户的权限,切换时需输入欲切换用户的密码;也可以让超级用户切换为普通用户,临时以低权限身份处理事务,切换时无需输入欲切换用户的密码。

使用方式:

su [-fmp] [-c command] [-s shell] [--help] [--version] [-] [USER [ARG]]
说明:变更为其他使用者的身份,除 root 外,需要键入该使用者的密码 
参数: 
-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 参数 

范例: su [用户名] 1.在root用户下, 输入 su 普通用户. 则切换至普通用户, 从root切换到变通用户不需要密码 2.在普通用户下, 输入 su [用户名] su -c ls root #变更帐号为 root 并在执行 ls 指令后退出变回原使用者。 su root -f #变更帐号为 root 并传入 -f 参数给新执行的 shell。 su - clsung #变更帐号为 clsung 并改变工作目录至 clsung 的家目录(home dir)。

su命令和su -命令最大的本质区别就是:前者只是切换了root身份,但Shell环境仍然是普通用户的Shell;而后者连用户和Shell环境一起切换成root身份了。

优缺点 优点:灵活的解决了身份切换问题.

缺点:su切换到特定用户需要特定用户的密码,例如切换到root下,如果10个用户需要切换到root,那么这10个用户都需要知道root的密码,那么将会增加root密码泄露的可能,并且这10个用户中有一个用户出现失误,将可能对系统造成不可挽回的灾难!

sudo

sudo是linux下常用的允许普通用户使用超级用户或者其它用户权限的工具。 sudo 对于控制和审计root用户的访问权限是极其有益的。它使得系统管理员可以将root用户的系统管理任务分配给其他人,而无需给予他们root口令。管理员也可以根据每个用户实际所需的root访问权限来定制系统访问权限,从而达到权限最小化的目标

命令格式如下:

sudo -K | -L | -V | -h | -k | -l | -vsudo [-HPSb] [-a auth_type] [-c 
class|-] [-p prompt] [-u username|#uid] {-e file [...] | -i | -s | command} 

下面我们再来看一下sudo其它常用的一些参数:

选项 含义 作用 

sudo -h Help 列出使用方法,退出。 
sudo -V Version 显示版本信息,并退出。 
sudo -l List 列出当前用户可以执行的命令。只有在sudoers里的用户才能使用该选项。 
sudo -u username|#uid User 以指定用户的身份执行命令。后面的用户是除root以外的,可以是用户名,也可以是#uid。 
sudo -k Kill 清除“入场卷”上的时间,下次再使用sudo时要再输入密码。 
sudo -K Sure kill 与-k类似,但是它还要撕毁“入场卷”,也就是删除时间戳文件。 
sudo -b command Background 在后台执行指定的命令。 
sudo -p prompt command Prompt 可以更改询问密码的提示语,其中%u会代换为使用者帐号名称,%h会显示主机名称。非常人性化的设计。 
sudo -e file Edit 不是执行命令,而是修改文件,相当于命令sudoedit。 

还有一些不常用的参数,在手册页sudo(8)中可以找到。

优缺点

优点:解决了身份切换的问题,同时避免root账户密码的泄露.

缺点:提权具有5分钟时效,即上一个命令完成后,5分钟内没有执行其他需要root权限的任务,需要重新提权.

/etc/sudoers

sudo的配置文件默认存放在/etc/sudoers下,sudo都提供了一个编辑该文件的命令:visudo来对该文件进行修改。

强烈推荐使用该命令修改sudoers,因为它会帮你校验文件配置是否正确,如果不正确,在保存退出时就会提示你哪段配置出错的。

首先写sudoers的缺省配置:

# sudoers file.
#
# This file MUST be edited with the 'visudo' command as root.
#
# See the sudoers man page for the details on how to write a sudoers file.
#
# Host alias specification
# User alias specification
# Cmnd alias specification
# Defaults specification
# User privilege specification
root ALL=(ALL) ALL
# Uncomment to allow people in group wheel to run all commands
# %wheel ALL=(ALL) ALL
# Same thing without a password
# %wheel ALL=(ALL) NOPASSWD: ALL
# Samples
# %users ALL=/sbin/mount /cdrom,/sbin/umount /cdrom
# %users localhost=/sbin/shutdown -h now

最简单的配置,让普通用户support具有root的所有权限 执行visudo之后,可以看见缺省只有一条配置: root ALL=(ALL) ALL 那么你就在下边再加一条配置: support ALL=(ALL) ALL 这样,普通用户support就能够执行root权限的所有命令 以support用户登录之后,执行: sudo su - 然后输入support用户自己的密码,就可以切换成root用户了

常见问题

忘记了登录密码,导致不能登录系统.

解决方法如下: 1.正常安装到硬盘的,开机时按住Shift键,直到出现引导菜单。如果是wubi安装的,那么在Windows启动菜单处,选择深度操作系统的菜单项,按下Shift不放,再按Enter键松开,直到启动菜单出现之后,再松开Shift键。

2.然后确保光标在深度操作系统启动的一行上(正常情况是第一项),然后按下“e”键。

3.在出现的画面当中,按几下键盘的下方向键,使光标移动到“linux /boot/....”的一行.

4.按键盘的End键使得光标移动到最后(低分辨率的话则有可能是下一行,其实是同一行因为太长被截断了),先打一个空格,然后执行:

rw init=/bin/bash

5.按Ctrl-X组合键启动系统,直到出现提示符。

然后执行:

passwd <你的用户名>

例如,如果你的用户名是sam,那么请执行passwd sam并回车。(例子图片的用户名为cxbii,所以执行的是 passwd cxbii) 然后连续执行两次新密码回车,这次可要记住了!

6.按Ctrl-Alt-Del重启,然后用新密码登录吧。

说明: 以上方法适合于所有使用Grub2的Linux系统,如果出于安全考虑,需要禁用到单用户模式,点击此处查看如何禁用单用户模式。

终端使用sudo提权出现: xx用户不在 sudoers 文件中。此事将被报告。

出现这个问题是sudo的配置文件出错,修改sudo的配置文件即可解决

使用su 切换到root,然后终端执行:

sudo gedit /etc/sudoers
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root ALL=(ALL:ALL) ALL
# Members of the admin group may gain root privileges
%admin ALL=(ALL:ALL) ALL

# Allow members of group sudo to execute any command
%sudo ALL=(ALL) ALL
xx ALL=(ALL) ALL (将此处的XX修改为出现改问题的用户名!)

保存文件退出即可解决

为什么用户权限不默认root?

由于root的权限过大,作为日常账户使用过于危险,因此系统账户默认不是root,并且登录管理器默认屏蔽root直接登录。 如果需要临时使用root权限,我们可以使用sudo命令,临时获取root权限。 终端输入密码没有回显

Linux系统是一个非常重视密码安全的系统,因此用户在终端输入密码时,终端将不会回显,即产生占位符(****),所以你只需要盲打密码后回车即可。

相关链接

linux之用户/etc/passwd和/etc/shadow文件

Linux密码文件passwd和shadow分析

Linux命令:usermod命令详解!

Linux添加用户组和删除用户组等指令

鸟哥私房菜

sudo及其配置文件sudoers