Linux用户和用户组

Stella981
• 阅读 248

参考: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指令时无需输入密码。

点赞
收藏
评论区
推荐文章
技术小男生 技术小男生
2个月前
linux环境jdk环境变量配置
1:编辑系统配置文件vi /etc/profile2:按字母键i进入编辑模式,在最底部添加内容: JAVAHOME/opt/jdk1.8.0152 CLASSPATH.:$JAVAHOME/lib/dt.jar:$JAVAHOME/lib/tools.jar PATH$JAVAHOME/bin:$PATH3:生效配置
刚刚好 刚刚好
2个月前
css问题
1、 在IOS中图片不显示(给图片加了圆角或者img没有父级) <div<img src""/</div div {width: 20px; height: 20px; borderradius: 20px; overflow: h
blmius blmius
1年前
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:SQL Mode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。 全局s
晴空闲云 晴空闲云
2个月前
css中box-sizing解放盒子实际宽高计算
我们知道传统的盒子模型,如果增加内边距padding和边框border,那么会撑大整个盒子,造成盒子的宽度不好计算,在实务中特别不方便。boxsizing可以设置盒模型的方式,可以很好的设置固定宽高的盒模型。 盒子宽高计算假如我们设置如下盒子:宽度和高度均为200px,那么这会这个盒子实际的宽高就都是200px。但是当我们设置这个盒子的边框和内间距的时候,那
艾木酱 艾木酱
1个月前
快速入门|使用MemFire Cloud构建React Native应用程序
> MemFire Cloud是一款提供云数据库,用户可以创建云数据库,并对数据库进行管理,还可以对数据库进行备份操作。它还提供后端即服务,用户可以在1分钟内新建一个应用,使用自动生成的API和SDK,访问云数据库、对象存储、用户认证与授权等功能,可专
Stella981 Stella981
1年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置 1、virsh edit centos7 找到“memory”和“vcpu”标签,将 <name>centos7</name> <uuid>2220a6d1-a36a-4fbb-8523-e078b3dfe795</uuid>
Wesley13 Wesley13
1年前
MySQL查询按照指定规则排序
1.按照指定(单个)字段排序 select * from table_name order id desc; 2.按照指定(多个)字段排序 select * from table_name order id desc,status desc; 3.按照指定字段和规则排序 selec
Stella981 Stella981
1年前
Angular material mat
Icon Icon Name mat-icon code _add\_comment_ add comment icon <mat-icon> add\_comment</mat-icon> _attach\_file_ attach file icon <mat-icon> attach\_file</mat-icon> _attach\
Wesley13 Wesley13
1年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
#### 背景描述 # Time: 2019-01-24T00:08:14.705724+08:00 # User@Host: **[**] @ [**] Id: ** # Schema: sentrymeta Last_errno: 0 Killed: 0 # Query_time: 0.315758 Lock_
helloworld_34035044 helloworld_34035044
4个月前
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。 uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid() 或 uuid(sep)参数说明:sep 布尔值,生成的uuid中是否包含分隔符'',缺省为
helloworld_28799839 helloworld_28799839
2个月前
常用知识整理
# Javascript ## 判断对象是否为空 ```js Object.keys(myObject).length === 0 ``` ## 经常使用的三元运算 > 我们经常遇到处理表格列状态字段如 `status` 的时候可以用到 ``` vue