用户的管理

用户组及配置文件

用户的类型

Linux是一个多用户、多任务的操作系统,如果要使用系统资源,就必须向系统管理员申请一个用户,通过这个用户进入系统,通过建立不同属性的用户实现
不同的作用或权限,可以合理利用和控制系统资源。
Linux系统中用户角色分为三类:
1、管理员用户
默认是root用户,它的UID 和GID均为0,系统安装完成后自动生成的,默认通过它就可以登录系统,拥有最高的管理权限。
2、普通用户
由系统管理员root创建的,创建完成后可以登录系统,但默认无法创建、修改和删除任何管理员下的文件;UID从500-65535
3、虚拟用户(系统用户)
安装系统后默认生成的用户,大多数不能登录系统,但它们是系统正常运行不可缺少的,它们的存在主要是为了方便系统管理,满足相应的系统进程对文件所属用户的要求;UID从 1-499
类型        UID
root         0
虚拟用户    1-499
虚拟用户时为了满足系统中每个服务/进程在运行的时候都要有一个用户和家庭。
普通用户    500+

常用的命令解释器

/bin/bash       普通用户默认的命令解释器
/sbin/nologin   虚拟用户(傀儡用户)使用
[root@nfsnobody ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh

用户及组配置文件

[root@nfsnobody ~]# ll /etc/passwd /etc/shadow /etc/group /etc/gshadow
-rw-r--r-- 1 root root  648 Sep 12 12:05 /etc/group         用户组信息
---------- 1 root root  529 Sep 12 12:05 /etc/gshadow       用户组密码
-rw-r--r-- 1 root root 1271 Sep 12 12:05 /etc/passwd        用户信息
---------- 1 root root  936 Sep 12 12:09 /etc/shadow        用户密码

/etc/passwd

/etc/passwd  存放用户信息
存储用户信息,每一行表示一个用户信息,有多少行就表示多少个用户信息。

[root@nfsnobody ~]# cat /etc/passwd  存放用户信息
root:x:0:0:root:/root:/bin/bash
root     :x             :0     :0      :root             :/root           :/bin/bash
nobody   :x             :99    :99     :Nobody           :/               :/sbin/nologin
nfsnobody     :x             :500   :500    :                 :/home/nfsnobody      :/bin/bash
用户名   原来密码的位置  UID   GID    用户的说明信息     用户的家目录     命令解释器

/etc/shadow

存储用户密码信息文件

[root@nfsnobody ~]# cat /etc/shadow
LH : ! !: 17751: 0: 99999: 7: : :
此文件由9个字段的数据组成,字段之间用“:”分隔,格式如下:
1用户名 2 密码 3 最近改动密码的日期 4 密码不可被更动的天数 5 密码需要重新变更的天数 6 密码需要变更期限前的警告期限 7 密码过期的恕限时间
8帐号失效日期 9 保留

/etc/group

主要存储组相关信息的文件

[root@nfsnobody ~]# cat /etc/group
nfsnobody  :    x      :     500        :
组名       组密码      组ID(GID)   组成员
此文件由4个字段的数据组成,字段之间用“:”分隔

/etc/gshadow

主要用来存储组密码信息

[root@nfsnobody ~]# cat /etc/gshadow
nfsnobody     :    !         :               :
组名          组密码           组管理员       用户组成员
此文件由4个字段的数据组成,字段之间用“:”分隔

/etc/skel

/etc/skel目录是在linux下面添加一个新用户使用的用户老家的模板。和创建用户相关的目录
此目录用来存放新用户需要的所有基础环境变量文件的目录。
用户家目录缺少.bash开头的文件    会出现的错误

[nfsnobody@nfsnobody ~]$ rm -f .bash* 删除用户家目录下的环境变量后,退出
-bash-4.1$ 重新登录

新用户家目录中的三个隐藏文件,与/etc.skel中的相同。

[root@nfsnobody skel]# useradd alex888
[root@nfsnobody skel]# su - alex888
[alex888@nfsnobody ~]$ ll -a
total 20
drwx------  2 alex888 alex888 4096 Sep 12 10:18 .
drwxr-xr-x. 6 root    root    4096 Sep 12 10:18 ..
-rw-r--r--  1 alex888 alex888   18 Mar 23 08:15 .bash_logout
-rw-r--r--  1 alex888 alex888  176 Mar 23 08:15 .bash_profile
-rw-r--r--  1 alex888 alex888  124 Mar 23 08:15 .bashrc
.bash_logout   用户登出的时候运行这个文件里的内容
.bash_profile  环境变量
.bashrc        存放用户的别名数

模拟故障

通过故障 了解/etc/skel 文件的作用

[f:\~]$ ssh 10.0.0.200 22         本地shell使用ssh登录进nfsnobody用户

[nfsnobody@nfsnobody ~]$ ls -a    ls -a 查看下家目录下的文件 包括隐藏文件
.  ..  .bash_history  .bash_logout  .bash_profile  .bashrc  .viminfo
[nfsnobody@nfsnobody ~]$ rm -rf .bash*    删除.bash开头的文件  模拟故障
[nfsnobody@nfsnobody ~]$ exit     退出  重新登录
logout
如果模拟故障不成功,
原因分析:1、vim /etc/profile   2、注释掉PS=那行 3、 source /etc/profile

[f:\~]$ ssh 10.0.0.200 22         重新登录

-bash-4.1$ ls -a                  命令行 变了 出现故障
.  ..  .bash_history  .viminfo
-bash-4.1$ cp /etc/skel/.bash* ~  把/etc/skel目录下.bash开头的文件 复制一份到家目录
-bash-4.1$ exit                    退出 重新登录
logout

[f:\~]$ ssh 10.0.0.200 22

[nfsnobody@nfsnobody ~]$ ls -a     命令行恢复  故障解决
.  ..  .bash_history  .bash_logout  .bash_profile  .bashrc  .viminfo

useradd工作原理

useradd命令工作原理有以下几步完成:
1、不带任何参数使用添加用户时,首先读/etc/login.defs    /etc/default/useradd 预先定义的规则
2、根据设置的规则添加用户,同时会向/etc/passwd  /etc/group文件添加新建的用户和组,但/etc/shadow   /etc/gshadow也会同步生成记录
3、同时系统会根据/etc/login.defs    /etc/default/useradd文件中配置的信息建立用户的家目录,并复制/etc/skel中所有隐藏的环境配置文件到新用户的家目录中,以完成对用户环境的初始化设置。

/etc/login.defs  控制用户的默认信息
/etc/login.defs文件定义了与/etc/password和/etc/shadow配套的用户限制设定。这个文件是需要的,缺失并不会影响系统的使用,但是也许会产生意想不到的错误。
如果/etc/shadow文件里有相同的选项,则以/etc/shadow里的设置为准,也就是说/etc/shadow的配置优先级高于/etc/login.defs。

用户相关命令

useradd

useradd 命令创建用户
语法格式:useradd  [options] [login] 
useradd  [选项]    [用户名]
参数:
-n 不创建以用户名为名的组
-c 创建用户时,添加个人信息
-u 用户ID值,这个值必须是唯一的
-s 用户登录后使用的shell
-g 指定用户对应的组,对应的组必须在系统中存在

useradd命令不使用参数

useradd 命令创建用户
xshell不允许用户无密码登录

[root@nfsnobody ~]# useradd LH            创建一个新用户
[root@nfsnobody ~]# tail -1 /etc/passwd   创建后的用户 信息都是默认的  没有密码
LH:x:502:502::/home/LH:/bin/bash             创建成功  /etc/passwd 可以查到
[root@nfsnobody ~]# grep LH /etc/group    使用grep 过滤下LH的组信息 
LH:x:502:                         创建了一个以用户名为名的组

useradd -n

-n 不创建以用户名为名的组

[root@nfsnobody ~]# useradd -n LH1               创建一个用户
[root@nfsnobody ~]# grep LH1 /etc/passwd         过滤检验下 创建成功
LH1:x:503:100::/home/LH1:/bin/bash
[root@nfsnobody ~]# grep LH1 /etc/group          过滤下组信息 没有同名的组
LH:x:502:
[root@nfsnobody ~]# id LH1                       使用id命令看下 LH1这个用户在users这个组里
uid=503(LH1) gid=100(users) groups=100(users)

useradd -c

-c 创建用户时,添加个人信息
创建用户的同时,添加agan2用户的个人信息,个人信息使用逗号隔开

[root@localhost ~]# useradd -c nfsnobody,15810516499,河北LH     格式
[root@localhost ~]# grep  "LH" /etc/passwd                 过滤下信息查看
LH:x:506:506:nfsnobody,15810516499,河北:/home/LH:/bin/bash

useradd -u

-u 用户ID值,这个值必须是唯一的
创建用户的同时,修改用户默认的UID

[root@localhost ~]# useradd -u 888 LH                      格式规范
[root@localhost ~]# grep  "LH" /etc/passwd                 过滤下信息查看
LH:x:888:888::/home/LH:/bin/bash

useradd -s

-s指定用户登录后的shell
/sbinlogin 表示禁止登录
此例在企业中部署nginx、mysql等服务时经常用到

[root@localhost ~]# useradd -s /sbinlogin  tian
[root@localhost ~]# grep -w "tian" /etc/passwd 
tian:x:8892:8892::/home/tian:/sbinlogin

useradd -g

-g 指定用户对应的组,对应的组必须在系统中存在
-G参数会把修改记录在/etc/group
让用户,隶属于到edu组,这里通过id 命令来查看用户,所属于的组。
因为使用-g 组信息记录在/etc/passwd中。事实上系统确认一个用户的所属组的时候是根据/etc/passwd的组ID。 
因此,useradd -g仅仅修改/etc/passwd,而不会修改/etc/group。 
加"-G"参数会把修改记录在/etc/group

[root@nfsnobody ~]# groupadd HH           创建一个新的组
[root@nfsnobody ~]# tail -1 /etc/group        查看新建的组信息
HH:x:503:
[root@nfsnobody ~]# useradd -g HH LH2     使用-g创建一个新用户使他属于HH这个组
[root@nfsnobody ~]# id LH2                查看
uid=504(LH2) gid=503(HH) groups=503(HH)
[root@nfsnobody ~]# grep LH2 /etc/passwd  查看下用户的信息
LH2:x:504:503::/home/LH2:/bin/bash
[root@nfsnobody ~]# tail -1 /etc/group    
查看下组的信息  虽然加入了组 但是在group这个文件里 并没有显示出来
HH:x:503:
[root@nfsnobody ~]# useradd -G HH LH3      用-G创建一个新用户 并加入到这个组
[root@nfsnobody ~]# grep LH3 /etc/group    查看LH3的组信息  可以发现同时属于两个组
HH:x:503:LH3
LH3:x:505:
[root@nfsnobody ~]# grep LH3 /etc/passwd   过滤下LH3用户信息
LH3:x:505:505::/home/LH3:/bin/bash
[root@nfsnobody ~]# id LH3                  -G创建的LH3 同时属于两个组
uid=505(LH3) gid=505(LH3) groups=505(LH3),503(HH)
[root@nfsnobody ~]# id LH2                  -g创建的LH2 属于HH这个组
uid=504(LH2) gid=503(HH) groups=503(HH)
[root@nfsnobody ~]# grep HH /etc/group
HH:x:503:LH3

usermod

usermod 修改系统已经存在的用户信息
语法:usermod   [options]    [login]
      usermod   [选项]       [用户名]
参数:
-c   修改用户的个人信息,同useradd 的-c功能  
-g   修改用户对应的用户组,同  useradd的-d功能
-s   修改用户登录后使用的shell名称,同useradd的-s功能
-u   修改用户的uid ,同useradd 的-u功能
-l   修改用户的名称

usermod

格式
usermod  -l  u1   LH
            新名 已存在的名
把LH的用户名改为u1

[root@nfsnobody ~]# ls /home/        查看一下信息
LH  LH1  LH2  LH3  nfsnobody  www
[root@nfsnobody ~]# id LH            LH的ID信息
uid=502(LH) gid=502(LH) groups=502(LH)
[root@nfsnobody ~]# usermod -l u1 LH   修改名字
[root@nfsnobody ~]# id u1              查看u1的ID
uid=502(u1) gid=502(LH) groups=502(LH)   
[root@nfsnobody ~]# id LH            查看LH的
id: LH: No such user                    修改成LH已经不存在了
[root@nfsnobody ~]# ls /home/        查看家目录
LH  LH1  LH2  LH3  nfsnobody  www
[root@nfsnobody ~]# su - u1          切换到u1用户
[u1@nfsnobody ~]$ pwd                u1用户的家目录还是LH  家目录名称没有变
/home/LH

useradd与usermod的区别

useradd与usermod 有很多相同的参数
命令不同之处  
useradd是对新用户(要创建的用户)作用/配置
usermod是对已存在的用户配置

userdel

userdel 删除用户
语法:userdel   [options]  [login]
      userdel   [选项]     [用户名]
参数:           
-f     强制删除用户
-r     删除用户的同时,删除与用户相关的所有文件(包含邮箱信息)
userdel可以直接删除参数  注意需要加-r参数 不然会删除不彻底(不干净)会导致以后创建同名的用户无法创建

彻底删除用户

userdel -rf  彻底删除删除与用户相关的所有文件(包含邮箱信息)
可以不加f  但是想彻底删除一个用户 必须要加-r

[root@nfsnobody ~]# ls /home/
LH1  LH2  LH3  nfsnobody  www
[root@nfsnobody ~]# userdel -rf LH1    -rf 彻底删除一个用户 
[root@nfsnobody ~]# id LH1
id: LH1: No such user
[root@nfsnobody ~]# ls /home/
LH2  LH3  nfsnobody  www
[root@nfsnobody ~]# ls /var/spool/mail/
LH2  LH3  nfsnobody  root  www

未彻底删除补救方法

未彻底删除导致的问题

[root@nfsnobody ~]# ls /home/       查看下用户家目录信息
LH2  LH3  nfsnobody  www
[root@nfsnobody ~]# userdel LH2     未使用参数删除用户
[root@nfsnobody home]# id LH2       确实已经删除了  id也查询不到
id: LH2: No such user
[root@nfsnobody ~]# useradd LH2     但是创建同名用户显示用户已存在
useradd: warning: the home directory already exists.
Not copying any file from skel directory into it.
Creating mailbox file: File exists        大概意思是用户已存在

补救方法

[root@nfsnobody ~]# cd /var/spool/mail/   进入到用户的邮箱  删除LH2的邮箱
[root@nfsnobody mail]# ls                 先看一下
LH2  LH3  nfsnobody  root  www
[root@nfsnobody mail]# rm -rf LH2
[root@nfsnobody mail]# cd /home/        进入到/home目录  这是普通用户的家目录
[root@nfsnobody home]# ls
LH2  LH3  nfsnobody  www
[root@nfsnobody home]# rm -rf LH2      删除LH2这个目录
[root@nfsnobody home]# ls /home/       检查是否删除
LH3  nfsnobody  www                          已删除
[root@nfsnobody home]# vim /etc/passwd
删除或注释里面开头是LH2的信息
[root@nfsnobody home]# vim /etc/group
删除或注释里面开头是LH2的信息
[root@nfsnobody home]# useradd LH2       重新尝试创建 可以创建
[root@nfsnobody home]# id LH2            检查
uid=506(LH2) gid=506(LH2) groups=506(LH2)
passwd 

修改用户密码命令
语法:passwd [option] [username]
passwd [选项]   [用户名]
参数:
--stdin //从标准输入读取密码字符串

修改当前用户的密码

普通用户使用passwd 修改密码时,必须满足密码复杂性要求;root 修改密码不需要满足密码复杂性。

[root@localhost ~]# passwd 
Changing password for user root.
New password:                     输入新密码
BAD PASSWORD: it is WAY too short
BAD PASSWORD: is too simple
Retype new password:              再次输入
passwd: all authentication tokens updated successfully.  更新成功

修改普通用户的密码

root用户可以直接修改 不用满足密码复杂性

[root@localhost ~]# useradd u1
[root@localhost ~]# passwd u1
Changing password for user u1.
New password: 
BAD PASSWORD: it is WAY too short
BAD PASSWORD: is too simple
Retype new password: 
passwd: all authentication tokens updated successfully.

非人工交互设置密码

--stdin  这个命令在工作中批量设置密码时很有用
一条命令非人工交互设置密码(企业使用技巧)

[root@localhost ~]# echo "123456" | passwd --stdin u1
Changing password for user u1.
passwd: all authentication tokens updated successfully.  密码更新成功

批量更新用户的密码

批量更新用户的密码
格式  
用户名:密码,
用户必须存在才可以,一行一个用户

[root@localhost lh]# chpasswd    输入命令
root:123456                      格式  用户名:密码,用户必须存在才可以,一行一个用户
u1:123456
u2:654321                        输入完成后,直接ctrl+D 结束输入

此命令有一个缺点 当一行输入错误后,不能返回修改。
当使用useradd 命令批量创建用户后,可以使用chpasswd 命令批量设置密码或批量修改密码。
把用户和密码字符串放到文件里执行批量改密码

[root@localhost lh]# cat passwd.txt         先将密码写入一个文件
u1:123
u2:321
u3:123
[root@localhost lh]# chpasswd < passwd.txt  然后使用<重定向到chpasswd

su和sudo

su的使用

su的作用是变更为其它使用者的身份,超级用户除外,需要键入该使用者的密码。
su 切换用户却不切换工作环境 , su - 同时切换用户与工作环境
缺点:用户通过su root命令直接获取root权限 从而造成用户的权限太大 也就可能给系统造成危险
su  与  su -

[root@nfsnobody home]# cd /etc/     先进入/etc目录下
[root@nfsnobody etc]# su nfsnobody     使用su 切换用户
[nfsnobody@nfsnobody etc]$ exit        切换后还在/etc目录下  退出
[root@nfsnobody etc]# su  - nfsnobody  使用su - 切换
[nfsnobody@nfsnobody ~]$               切换后自动返回当前用户的家目录
[nfsnobody@nfsnobody ~]$ pwd
/home/nfsnobody

sudo

su的缺点造就了sudo的诞生
由于用户通过su root命令直接获取root权限 从而造成用户的权限太大 也就可能给系统造成危险。
为了既保证系统的安全又可以执行相应命令,sudo 也就以此诞生。
sudo作用:通过配置文件来限制用户的权限 ,可以让普通用户在执行指定的命令或程序时,拥有超级用户的权限。
sudo的工作过程如下:
当用户执行sudo时,系统会主动寻找/etc/sudoers文件,判断该用户是否有执行sudo的权限
确认用户具有可执行sudo的权限后,让用户输入用户自己的密码确认
若密码输入成功,则开始执行sudo后续的命令
root执行sudo时不需要输入密码(因为sudoers文件中有配置root ALL=(ALL) ALL这样一条规则)
给普通用户u1提权,让普通用户可以查看root用户的家目录;普通用户可以使用useradd命令,创建新用户
分析步骤:

useradd   u1
visudo=vi打开/etc/sudoers文件 或  vim  /etc/sudoers 
visudo会检查内部语法,避免用户输入错误信息,所以我们一般使用visudo,编辑此文件要用root权限
编辑文件的第98行,编辑完成后,wq! 强制保存退出
root    ALL=(ALL)     ALL
u1      ALL=(ALL)     /bin/ls,/usr/sbin/useradd 
使用u1 用户登录测试       
sudo    useradd  u11     可成功创建用户,证明提权成功
sudo    ls   /root       可查看root的家,证明提权成功
sudo   -l         -l 参数是列出当前用户可执行的命令,但只有在sudoers文件里的用户才能使用该选项。
[nfsnobody@nfsnobody ~]$ sudo -l(小L)

用户查询命令

w命令

w  用于显示目前登入系统的用户信息。
执行这项指令可得知目前登入系统的用户有哪些人,以及他们正在执行的程序。
单独执行 w 指令会显示所有的用户,您也可指定用户名称,仅显示某位用户的相关信息。

显示当前登录的用户

[root@nfsnobody etc]# w
17:35:19 up 23:28,  2 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     tty1     -                Wed12    2days  0.00s  0.00s -bash
root     pts/0    10.0.0.1         13:16    0.00s  0.12s  0.00s w

w -h

w -h不打印头信息;

[root@nfsnobody etc]# w -h
root     tty1     -                Wed12    2days  0.00s  0.00s -bash
root     pts/0    10.0.0.1         13:16    0.00s  0.12s  0.00s w -h


id命令

id命令 查看用户的UID 、GID
id -u   显示用户ID
id -g   显示用户所属群组的ID。
id -G   显示用户所属附加群组的ID。

[root@nfsnobody /]# id user6
uid=8897(user6) gid=8899(z11) groups=8899(z11)
[root@nfsnobody /]# id -g user6
8899
[root@nfsnobody /]# id -G user6
8899
[root@nfsnobody /]# id -u user6
8897

last和lastlog

last命令用了显示用户登录情况,以下是直接显示固定行数的记录:
lastlog 命令 显示linux中所有用户最近一次远程登录的信息

[root@nfsnobody etc]# last
[root@nfsnobody etc]# lastlog

组相关信息

groupadd

添加用户组命令 groupadd
语法:groupadd  [options]   [group]
      groupadd  [选项]      [用户组]
参数:
-g   gid   指定用户组的GID,GID唯一不能为负数,如果不指定GID从500开始
-f         新增一个组,强制覆盖一个已存在的组,GID、组成员不会改变。
添加组z11,查看添加后的组信息

[root@nfsnobody ~]# groupadd z11
[root@nfsnobody ~]# grep "z11" /etc/group
z11:x:8895:
[root@nfsnobody ~]# tail -1 /etc/group
z11:x:8895:

gpasswd

将已存在的用户加入到组中的命令 gpasswd
语法:gpasswd [options] [user]   [group]
gpasswd [选项]    [用户名] [组名]
参数:
-a:添加一个用户到组,可以追加到组
-M:添加多个用户到组,覆盖之前的组成员
-d:从组删除用户
把user1用户添加到z1,并且查看是否添加成功 
-a选项只能添加一个用户,需要同时添加多用户时,使用-M参数

[root@nfsnobody lh]# groupadd z1
[root@nfsnobody lh]# useradd user1
[root@nfsnobody lh]# gpasswd -a user1 z1
Adding user user1 to group z1
[root@nfsnobody lh]# grep "z1" /etc/group
z1:x:8896:user1

同时添加user2、user3用户到z1组(先创建user2、user3用户)
使用-M参数添加多个用户时,多用户之间使用逗号分割;添加批量用户时,先使用-a参数,在使用-M参数,就会覆盖之前添加过的用户;所以添加多用户时,先使用-M 参数。

[root@nfsnobody lh]# gpasswd -M user2,user3 z1
[root@nfsnobody lh]# grep "z1" /etc/group
z1:x:8896:user2,user3
将user2用户从组中删除
[root@nfsnobody lh]# gpasswd -d user2 z1 
Removing user user2 from group z1
[root@nfsnobody lh]# grep "z1" /etc/group
z1:x:8896:user3

groupmod

修改组信息的命令 groupmod
语法:groupmod  [options]  [group]
      groupmod  [选项]    [组名]
groupmod  -n  新名  旧名
groupmod  -g  8888  dir
参数:
-n    修改组名
-g    修改GID

修改z1组的GID

[root@nfsnobody lh]# grep "z1" /etc/group
z1:x:8896:user3
[root@nfsnobody lh]# groupmod -g 8888 z1
[root@nfsnobody lh]# grep "z1" /etc/group
z1:x:8888:user3

修改z1组的组名为newz1

[root@nfsnobody lh]# grep "z1" /etc/group
z1:x:8888:user3
[root@nfsnobody lh]# groupmod -n z1new z1
[root@nfsnobody lh]# grep "z1" /etc/group
z1new:x:8888:user3

groupdel

删除组的命令 groupdel  
查看用户属于到哪些组,使用命令:groups
语法:groupdel   [group]
      groupdel   [组名]
范例:
groupdel 组名 
删除组,删除组后,用户名依然存在

groups

看用户属于到哪些组,命令:groups 
语法:groups   [user] 
      groups   用户名

[root@nfsnobody lh]# groups user1
user1 : user1 z2
posted on 2019-12-05 09:42  合衬-nfsnobody.com  阅读(826)  评论(0编辑  收藏  举报