Linux用户和用户组

Stella981
• 阅读 580

参考:https://blog.csdn.net/love20165104027/article/details/82386271

用户相关的文件

/etc/passwd

/etc/shadow

相关的文件

/etc/group

/etc/gshadow

/etc/passwd的文件内容

root:x:0:0:root:/root:/bin/bash

第一个字段:账号名称

第二个字段:密码。(密码信息加密放在/etc/shadow中,因此这里为x)

第三个字段:UID。(0表示账号为系统管理员,1-999表示账号为系统账号,1000-6000表示账号为一般使用者)

第四个字段:GID。(用户所在初始群组的ID号)(每个账号被创建后,都会被分配到一个初始组中)

第五个字段:用户名全称或账号意义说明。(可理解为账号的注释说明)

第六个字段:家目录。(默认为/home/账号名称)

第七个字段:账号登录系统之后取得的shell。(账号通过该shell跟linux进行交流)

/etc/shadow的文件内容:

root:$6$BOzhx0mUbB97BizQ$34NhP3GsdbmnzvLwbRqY.kU0X.qUeAC02RQJSf::0:99999:7:::

第一个字段:账号名称。

第二个字段:密码。(这里存的是加密后的密码。若密码以 "!" 开头,表示密码失效,账号被锁,暂时无法登录。)

(1)如果为空,则对应账号没有密码,登录时不需要密码。

(2)星号("*")代表账号被锁定。

(3)双叹号表示这个密码已经过期了。

(4)$6$开头的,表明是用SHA-512加密的。

(5)$1$开头的,表明是用MD5加密的。

(6)$2$开头的,表明是用Blowfish加密的。

(7)$5$开头的,表明是用SHA-256加密的。

虽然这些加密过的密码很难被解出来, 但是『很难』不等于『不会』,所以,这个档案的预设权限是『-rw-------』或者是『-r--------』,亦只有 root 才可以读写就是了!你得随时注意,不要不小心更动了这个档案的权限呢!

由于固定的编码系统产生的密码长度必须一致,因此『当你让这个字段的长度改变后,该密码就会失效(算不出来)』。 很多软件透过这个功能,在此字段前加上 ! 或 * 改变密码字段长度,就会让密码『暂时失效』了。

第三个字段:这个字段记录了『更改密码那一天』的日期。计算 Linux 日期的时间是以 1970 年 1 月 1 日作为 1 而累加的日期,1971 年 1

月 1 日则为 366 啦。

1970年1月1日 00:00:00 互联网的起始时间

echo $(($(date --date="2008/09/04" +%s)/86400+1)) 14126

这是在2008/09/04那天计算的,距离1970/01/01那天有多少天。

2008/09/04 为你想要计算的日期,86400 为每一天的秒数, %s 为 1970/01/01 以来累积总秒数。 由于 bash 仅支持整数,因此最终需要

加上 1 补齐 1970/01/01 当天。

echo $(($(date --date="2019/10/15" +%s)/86400+1)) 18184

这是在2019/10/15那天计算的,距离1970/01/01那天有多少天。

假如最后一次修改密码是在2019/10/15这天,那么第三个字段这里记录的就是18184,表示天数。

第四个字段:密码不可需改的天数。假如你最后一次修改密码是在2019/10/15这天,该字段设置的是7,那么在2019/10/15到2019/10/22

这段时间之内,你不能修改密码,也根本无法修改。

第五个字段:密码需要再次修改的天数。假如你最后一次修改密码是在2019/10/15,该字段设置的是30,那么在2019/11/15之前,你需要再

次修改你的密码。过了2019/11/15日,你的密码就过期了。(2019/11/15就是过期日)

经常变更密码是个好习惯!

第六个字段:在密码过期日的前几天开始发出警告。在密码过期前,提前多少天提醒用户。假如你设置的是7,那么系统会从2019/11/08日开

是发出警告,提醒你该修改密码了。

第七个字段:密码过期之后的账号宽限天数。假如该字段设置的是7,那么从过期日2019/11/15日开始,到2019/11/22日这段时间之内,你

依然可以用你的旧密码登录,但只是能登录而已。进入bash后,系统会强制让你修改密码,否则不予使用。

如果在这七天内,你依然不听劝告,坚持不改密码,那么对不起,7天之后,你的密码就失效了(等同于作废)。

在这7天内,你可以不登录,但我会保留你密码的有效性。7天之内,你要是想登录,我可以准许你登录,但是有一条,登录后,必须先改密码,

如果不改,你就无法使用系统。如果你想拖,7天之后,你的密码就作废了。

第八个字段:账号失效日期。这个字段具有专权性,它能让你的账号失效或者不失效。【账号的失效和密码的失效不是一样的概念】

2019/11/10对应18179

2019/11/15对应18184  过期日

2019/11/20对应18189

如果该字段设置18179,表示说你的账号在2019/11/10这天会作废。虽然你的密码还没有过期,但对不起,我是王,得听我的。

如果该字段设置18189,表示说你的账号在2019/11/20这天会作废。虽然给了你7天的缓冲期,但对不起,在我面前,它不起作用。

第九个字段:保留字段。

常用命令:

useradd [-u UID] [-g 初始群組] [-G 次要群組] [-m/M] [-c 账号意义说明] [-d 家目绝对路径] [-s shell] [-r] \

[-e 账号失效日期,格式为YYYY-MM-DD] [-f 密码是否会失效,0立刻失效,-1永不失效] 账号名称

-M表示强制不建立家目录,-m表示强制建立家目录,-r表示创建系统账号

-b选项:

# 创建账号zhangsan,家目录创建到/opt/目录下,也就是/opt/zhangsan

useradd -b /opt zhangsan

-c选项:

# 添加账号的同时,添加注释

useradd -b /opt -c "测试" zhangsan

cat /etc/passwd

zhangsan:x:1002:1002:测试:/opt/zhangsan:/bin/bash

-d选项:

# 明确指定家目录

useradd -c "测试-d选项" -d /home/lisi wangwu

注意:-d不能和-b一起使用。我们创建的账号是wangwu,但指定的家目录却是/home/lisi。也就是说,家目录的名字不一定要和账号名一样。

Linux用户和用户组

# 没有使用-b和-d,则用户的家目录创建在/home/wangwu 

useradd -c "测试-d选项" wangwu

-D选项:

修改默认值。

-e选项:

账号失效日期。

useradd -e "2019-12-12" yangsilang

如果没有用-e,就使用/etc/default/useradd中的EXPIRE变量。要是没有EXPIRE变量,就使用空字符串。

-f选项:

密码过期后,再过多少天,账户就会永久禁用。

0表示当密码过期后,账户立即禁用。

-1表示不使用这个特性。也就是说,密码过期后,保留该账号直到永久。

其他的正数,则表示具体的天数。比如5表示密码过期后,再过5天,禁用该账号。

如果没有使用-f,则使用/etc/default/useradd中的INACTIVE,如果没有INACTIVE,则使用默认的-1.

-g选项:

组名或组ID。组名必须存在。

如果没有使用-g,则会参考/etc/login.defs中的USERGROUPS_ENAB变量。如果值为yes,表示创建用户的时候,同时创建组。组名就是用户名。等同于在命令行上添加选项

-U。

如果值为no,(等同于添加-N选项)则会参考/etc/default/useradd中的GROUP变量,如果没有GROUP,则使用100作为GID。

-G选项:

将用户添加到多个组中。

useradd -G group1,group2,group3 zhangsan

-G后跟的组,要参考-g选项的标准。不符合,就报错。默认是将用户放到初始组。

一般来说,我们创建用户账号的时候只要指定账号名称即可:useradd 账号名称,这样账号的其他信息都会使用系统为我们设置的默认值。

[root@localhost ~]# useradd -D   # 默认值
GROUP=100                        # 默认组的ID
HOME=/home                       # 默认家目录所在目录
INACTIVE=-1                      # 密码失效日
EXPIRE=                          # 账号失效日
SHELL=/bin/bash                  # 默认shell
SKEL=/etc/skel                   # 使用者家目录的内容资料参考目录
CREATE_MAIL_SPOOL=yes            # 是否建立邮件信箱,/var/spool/mail/账号名

# 这些默认参数实际上在文件/etc/default/useradd中。

useradd命令会为我们做以下这些事情:

<1> 在/etc/passwd建立一行与账号相关的资料。

<2> 在/etc/shadow建立一行与此账号密码相关的数据,但是尚未有密码。

<3> 在/etc/group建立一行此账号的初始群组信息,群组名称与账号名称一致。

<4> 在/etc/gshadow建立一行此账号初始群组的密码信息,但是没有密码。

<5> 在/home中建立此账号家目录,目录名称与账号名称一致,权限为700。

初始群组的两种机制:公共群组机制(SuSE使用)和私有群组机制(RHEL和CENTOS)。

对于公共群组机制:创建的新账号都会分配给GID为100的群组(组名为users),也就是说多个账号都在users组中。使用了GROUP=100。

对于私有群组机制:每个账号都有各自的群组和家目录,大家并不共用。没有使用GROUP=100。

/etc/default/useradd这个文件只是设置了一些账号的基本信息默认值,更多参数默认值可在/etc/login.defs文件中查看。

总结起来,使用useradd命令创建账号时会参考的文件有:/etc/default/useradd、/etc/login.defs、/etc/skel/*。

usermod

usermod -L  # 冻结账号(在密码前加 "!")

usermod -U  # 解冻账号(取消密码前的 "!")

userdel username

userdel -r username  # 递归删除(删除家目录)

passwd   # 修改密码,修改密码属性,冻结密码,解冻密码,查看密码信息

chage    # 也能修改密码信息

chage [-d 最近修改密码日期,格式为YYYY-MM-DD] [-m 密码不可修改的天数] [-M 密码需要再次修改的天数] \

[-W 在密码过期日前几天开始发出警告] [-I 密码过期之后的账号失效宽限天数] [-E 账号失效日期,格式为YYYY-MM-DD]

[root@localhost ~]# chage -l yangling

Last password change                   : never

Password expires                          : never

Password inactive                      : never

Account expires                      : never

Minimum number of days between password change : 0

Maximum number of days between password change : 99999

Number of days of warning before password expires : 7

# id yangling

# finger        # 查询当前登录系统的所有用户信息

# finger yangling   # 查询某个用户的属性

# chfn  # 修改finger中的展示信息

[root@localhost ~]# chsh -l   # 查看可用的shell,内容来源于/etc/shells

/bin/sh

/bin/bash

/sbin/nologin

/usr/bin/sh

/usr/bin/bash

/usr/sbin/nologin

cat /etc/group

yangling:x:1000:yangling

群组名称

群组密码

GID

群组中的成员

cat /etc/gshadow

yangling:!!::yangling

群组名称

群组密码:通常给群组管理员使用,少有设置。

群组管理员的账号。

组中的成员

创建组

groupadd [-g gid] 组名

创建系统组

groupadd -r -g gid 组名

修改组名(原来的名字是A,现在改为B)

groupmod [-g gid] [-n 新组名] 旧组名

不要随意修改GID

删除组(如果组内有用户,则无法删除)

groupdel 组名

初始群组与有效群组

初始群组:用户登入系统之后就获取到并拥有其相关权限的群组。也就是/etc/passwd文件第四个栏位上的GID对应的群组。

用户可以加入多个群组。但是该用户在创建新文件或新目录的时候,新文件或新目录的群组只能是用户当前的有效群组。

有效群组:可以使用命令“groups”查看当前用户加入的所有群组,列表中第一个群组即是当前有效群组,可以使用命令“newgrp 群组名称”

切换有效群组,但是只能在当前用户加入的所有群组中切换。切换有效群组之后会进入一个新的shell环境,可以使用“exit”命令来退出,回到原来有效群组和shell环境。

用户加入群组

方法1:由root将用户加入到组中。

usermod -a -G 'groupname' username

将username加入到groupname中。

方法2:由群组管理员来添加用户到组中。

(1)用root指定群组的管理员。

修改群组密码:gpasswd groupname

设置群组管理员、用户成员:gpasswd [-A 群组管理员账号列表] [-M 用户成员账号列表] 群组名称

移除群组名称:gpasswd -r 群组名称

使群组密码失效:gpasswd -R 群组名称

gpasswd -a username groupname

将username加入到groupname中

su 账号名                # 以non-login shell方式切换,不切换环境变量

su -                    # 以login shell方式切换,切换环境变量

su -l                   # 以login shell方式切换,切换环境变量

su - -c "指令" 账号名  # 利用新身份执行一条指令,执行后身份恢复为当前用户,不指定账号时,表示切换为root身份。

使用su命令切换身份是需要输入新切换账号的密码的(只有root不需要),也就是说,若要使用su切换身份,就必须要知道新切换账号的密码

才行。另一个命令sudo也可以切换身份执行命令操作,而且只需要输入当前账号密码即可,无需知道新切换账号的密码,只是切换身份执行命令

之后会自动恢复到原来账号身份。

sudo只是切换身份执行一个命令而已,要知道自己的密码

su是切换身份,要知道新账号的密码

sudo -u 账号名 指令

以-u后的账号执行指令

没有-u时,表示以root身份执行

/etc/sudoers

哪些用户或群组可在哪些主机登入系统时切换到哪些账号执行哪些指令,还可以设置执行sudo指令时无需输入密码。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
Java获得今日零时零分零秒的时间(Date型)
publicDatezeroTime()throwsParseException{    DatetimenewDate();    SimpleDateFormatsimpnewSimpleDateFormat("yyyyMMdd00:00:00");    SimpleDateFormatsimp2newS
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这