用户组及配置文件
用户的类型
Linux是一个多用户、多任务的操作系统,如果要使用系统资源,就必须向系统管理员申请一个用户,通过这个用户进入系统,通过建立不同属性的用户实现
不同的作用或权限,可以合理利用和控制系统资源。Linux系统中用户角色分为三类:1、管理员用户默认是root用户,它的UID 和GID均为0,系统安装完成后自动生成的,默认通过它就可以登录系统,拥有最高的管理权限。2、普通用户由系统管理员root创建的,创建完成后可以登录系统,但默认无法创建、修改和删除任何管理员下的文件;UID从500-655353、虚拟用户(系统用户)安装系统后默认生成的用户,大多数不能登录系统,但它们是系统正常运行不可缺少的,它们的存在主要是为了方便系统管理,满足相应的系统进程对文件所属用户的要求;UID从 1-499类型 UIDroot 0虚拟用户 1-499虚拟用户时为了满足系统中每个服务/进程在运行的时候都要有一个用户和家庭。普通用户 500+常用的命令解释器
/bin/bash 普通用户默认的命令解释器/sbin/nologin 虚拟用户(傀儡用户)使用[root@znix ~]# cat /etc/shells/bin/sh/bin/bash/sbin/nologin/bin/dash/bin/tcsh/bin/csh
用户及组配置文件
[root@znix ~]# 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/bashroot :x :0 :0 :root :/root :/bin/bashnobody :x :99 :99 :Nobody :/ :/sbin/nologinclsn :x :500 :500 : :/home/clsn :/bin/bash用户名 原来密码的位置 UID GID 用户的说明信息 用户的家目录 命令解释器
/etc/shadow
存储用户密码信息文件
[root@nfsnobody ~]# cat /etc/shadowLH : ! !: 17751: 0: 99999: 7: : :此文件由9个字段的数据组成,字段之间用“:”分隔,格式如下:1用户名 2 密码 3 最近改动密码的日期 4 密码不可被更动的天数 5 密码需要重新变更的天数 6 密码需要变更期限前的警告期限 7 密码过期的恕限时间8帐号失效日期 9 保留
/etc/group
主要存储组相关信息的文件
[root@nfsnobody ~]# cat /etc/groupnfsnobody : x : 500 :组名 组密码 组ID(GID) 组成员此文件由4个字段的数据组成,字段之间用“:”分隔
/etc/gshadow
主要用来存储组密码信息
[root@nfsnobody ~]# cat /etc/gshadownfsnobody : ! : :组名 组密码 组管理员 用户组成员此文件由4个字段的数据组成,字段之间用“:”分隔
/etc/skel
/etc/skel目录是在linux下面添加一个新用户使用的用户老家的模板。和创建用户相关的目录
此目录用来存放新用户需要的所有基础环境变量文件的目录。用户家目录缺少.bash开头的文件 会出现的错误[nfsnobody@nfsnobody ~]$ rm -f .bash* 删除用户家目录下的环境变量后,退出-bash-4.1$ 重新登录
新用户家目录中的三个隐藏文件,与/etc.skel中的相同。
[root@znix skel]# useradd alex888[root@znix skel]# su - alex888[alex888@znix ~]$ ll -atotal 20drwx------ 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:LH3LH3: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/groupHH: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的IDuid=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 LH1id: 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]# lsLH2 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 shortBAD PASSWORD: is too simpleRetype new password: 再次输入passwd: all authentication tokens updated successfully. 更新成功
修改普通用户的密码
root用户可以直接修改 不用满足密码复杂性
[root@localhost ~]# useradd u1[root@localhost ~]# passwd u1Changing password for user u1.New password: BAD PASSWORD: it is WAY too shortBAD PASSWORD: is too simpleRetype new password: passwd: all authentication tokens updated successfully.
非人工交互设置密码
--stdin 这个命令在工作中批量设置密码时很有用
一条命令非人工交互设置密码(企业使用技巧)[root@localhost ~]# echo "123456" | passwd --stdin u1Changing password for user u1.passwd: all authentication tokens updated successfully. 密码更新成功
批量更新用户的密码
批量更新用户的密码
格式 用户名:密码,用户必须存在才可以,一行一个用户[root@localhost gj]# chpasswd 输入命令root:123456 格式 用户名:密码,用户必须存在才可以,一行一个用户u1:123456u2:654321 输入完成后,直接ctrl+D 结束输入
此命令有一个缺点 当一行输入错误后,不能返回修改。
当使用useradd 命令批量创建用户后,可以使用chpasswd 命令批量设置密码或批量修改密码。把用户和密码字符串放到文件里执行批量改密码[root@localhost gj]# cat passwd.txt 先将密码写入一个文件u1:123u2:321u3:123[root@localhost gj]# chpasswd < passwd.txt 然后使用
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 u1visudo=vi打开/etc/sudoers文件 或 vim /etc/sudoers visudo会检查内部语法,避免用户输入错误信息,所以我们一般使用visudo,编辑此文件要用root权限编辑文件的第98行,编辑完成后,wq! 强制保存退出root ALL=(ALL) ALLu1 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]# w17:35:19 up 23:28, 2 users, load average: 0.00, 0.00, 0.00USER TTY FROM LOGIN@ IDLE JCPU PCPU WHATroot tty1 - Wed12 2days 0.00s 0.00s -bashroot pts/0 10.0.0.1 13:16 0.00s 0.12s 0.00s w
w -h
w -h不打印头信息;
[root@nfsnobody etc]# w -hroot tty1 - Wed12 2days 0.00s 0.00s -bashroot pts/0 10.0.0.1 13:16 0.00s 0.12s 0.00s w -h
id命令
id命令 查看用户的UID 、GID
id -u 显示用户IDid -g 显示用户所属群组的ID。id -G 显示用户所属附加群组的ID。[root@nfsnobody /]# id user6uid=8897(user6) gid=8899(z11) groups=8899(z11)[root@nfsnobody /]# id -g user68899[root@nfsnobody /]# id -G user68899[root@nfsnobody /]# id -u user68897
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/groupz11:x:8895:[root@nfsnobody ~]# tail -1 /etc/groupz11:x:8895:
gpasswd
将已存在的用户加入到组中的命令 gpasswd
语法:gpasswd [options] [user] [group]gpasswd [选项] [用户名] [组名]参数:-a:添加一个用户到组,可以追加到组-M:添加多个用户到组,覆盖之前的组成员-d:从组删除用户把user1用户添加到z1,并且查看是否添加成功 -a选项只能添加一个用户,需要同时添加多用户时,使用-M参数[root@nfsnobody gj]# groupadd z1[root@nfsnobody gj]# useradd user1[root@nfsnobody gj]# gpasswd -a user1 z1Adding user user1 to group z1[root@nfsnobody gj]# grep "z1" /etc/groupz1:x:8896:user1
同时添加user2、user3用户到z1组(先创建user2、user3用户)
使用-M参数添加多个用户时,多用户之间使用逗号分割;添加批量用户时,先使用-a参数,在使用-M参数,就会覆盖之前添加过的用户;所以添加多用户时,先使用-M 参数。[root@nfsnobody gj]# gpasswd -M user2,user3 z1[root@nfsnobody gj]# grep "z1" /etc/groupz1:x:8896:user2,user3将user2用户从组中删除[root@nfsnobody gj]# gpasswd -d user2 z1 Removing user user2 from group z1[root@nfsnobody gj]# grep "z1" /etc/groupz1:x:8896:user3
groupmod
修改组信息的命令 groupmod
语法:groupmod [options] [group] groupmod [选项] [组名]groupmod -n 新名 旧名groupmod -g 8888 dir参数:-n 修改组名-g 修改GID修改z1组的GID
[root@nfsnobody gj]# grep "z1" /etc/groupz1:x:8896:user3[root@nfsnobody gj]# groupmod -g 8888 z1[root@nfsnobody gj]# grep "z1" /etc/groupz1:x:8888:user3
修改z1组的组名为newz1
[root@nfsnobody gj]# grep "z1" /etc/groupz1:x:8888:user3[root@nfsnobody gj]# groupmod -n z1new z1[root@nfsnobody gj]# grep "z1" /etc/groupz1new:x:8888:user3
groupdel
删除组的命令 groupdel
查看用户属于到哪些组,使用命令:groups语法:groupdel [group] groupdel [组名]范例:groupdel 组名 删除组,删除组后,用户名依然存在groups
看用户属于到哪些组,命令:groups
语法:groups [user] groups 用户名[root@nfsnobody lh]# groups user1user1 : user1 z2