1.用户相关文件 


1.1/etc/passwd 用户信息文件 

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

第一列: 用户名 

第二列: 密码位 

第三列: 用户ID 

 0 超级用户UID。如果用户UID为0,代表这个账号是管理员账号。那Linux中如何把普通用户升级成为管理员呢?就是把其他用户的UID修改为0就可以了,这点和Windows是不同的。不过不建议建立多个管理员账号。 

 1-499 系统用户(伪用户)UID。这些UID账号是系统保留给系统用户的UID,也就是说UID是1-499范围内的用户是不能登录系统的,而是用来运行系统或服务的。其中1-99是系统保留的账号,系统自动创建。100-499 是预留给用户创建系统账号的。 

 500-60000 普通用户UID。建立的普通用户UID从500开始,最大到60000。这些用户足够使用了,但是如果不够也不用害怕,2.6.x内核以后的Linux系统用户UID已经可以支持232这么多了。 

第四列:组ID GID 添加用户时,如果不指定用户所属的初始组,那么会建立和用户名相同的组 

第五列: 用户说明 

第六列: 用户家目录 ~ 

第七列: 登录shell /bin/bash 

如何把普通用户变成超级用户:把用户UID改为0 


1.2 /etc/shadow 影子文件 

root:$6$9w5Td6lg$bgpsy3olsq9WwWvS5Sst2W3ZiJpuCGDY.4w4MRk3ob/i85fI38RH15wzVoomff9isV1PzdcXmixzhnMVhMxbv0:15775:0:99999:7::: 

第一列: 用户名 

第二列: 加密密码 

我们也可以在密码前人为的加入“!”或“*”改变加密值让密码暂时失效,使这个用户无法登陆,达到暂时禁止用户登录的效果。 

注意所有伪用户的密码都是“!!”或“*”,代表没有密码是不能登录的。当然我新创建的用户如果不设定密码,它的密码项也是“!!”,代表这个用户没有密码,不能登录 

第三列: 密码最近更改时间, 1970年1月1日作为标准时间 

时间戳转日期 

[root@localhost ~]# date -d "1970-01-01 15775 days" 

2013年 03月 11日 星期一 00:00:00 CST 

日期转时间戳 

[root@localhost ~]# echo $(($(date --date="2013/03/11" +%s)/86400+1)) 

15775 

第四列: 两次密码的修改间隔时间(和第3字段相比) 

第五例: 密码有效期(和第3字段相比) 

第六列: 密码修改到期前的警告天数(和第5字段相比) 

第七列: 密码过期后的宽限天数(和第5字段相比) 

第八列: 密码失效时间 

这里同样要写时间戳,也就是用1970年1月1日进行时间换算。如果超过了失效时间,就算密码没有过期,用户也就失效无法使用了 

第九列: 保留 


1.3 /etc/group 组信息文件 

root:x:0:root 

第一列: 组名 

第二列: 组密码位 

第三列: GID 

第四列: 此组中支持的其他用户.附加组是此组的用户 

初始组:每个用户初始组只能有一个,初始组只能有一个,一般都是和用户名相同的组作为初始组 

附加组:每个用户可以属于多个附加组。要把用户加入组,都是加入附加组 

有效组:当前认定的组

4组密码文件/etc/gshadow 

如果我给用户组设定了组管理员,并给该用户组设定了组密码,组密码就保存在这个文件当中。组管理员就可以利用这个密码管理这个用户组了。 

5 用户的家目录 

6 用户邮箱目录 

这个邮箱在/var/spool/mail目录当中,例如user1用户的邮箱就是/var/spool/mail/user1文件 

7 用户模板目录 

/etc/skel/ 



2.用户管理命令 

2.1 添加用户 


手工删除用户 

手工删除用户试验:手工删除,如果可以正常建立用户,证明用户删除干净。 

/etc/passwd 

/etc/shadow 

/etc/group 

/etc/gshadow 

/home/user1 

/var/spool/mail/user1 邮箱 


useradd命令 

useradd 选项 用户名 

选项: 

-u 550 指定UID 

-g 组名 指定初始组 不要手工指定 

-G 组名 指定附加组,把用户加入组,使用附加组 

-c 说明 添加说明 

-d 目录 手工指定家目录,目录不需要事先建立 

-s shell /bin/bash. 


useradd默认值 

useradd添加用户时参考的默认值文件主要有两个,分别是/etc/default/useradd和/etc/login.defs 


/etc/default/useradd 

[root@localhost ~]# vi /etc/default/useradd 

# useradd defaults file 

GROUP=100 

HOME=/home 

INACTIVE=-1 

EXPIRE= 

SHELL=/bin/bash 

SKEL=/etc/skel 

CREATE_MAIL_SPOOL=yes 

挨个解释下: 

GROUP=100:这个选项是建立用户的默认组,也就是说添加每个用户时,用户的初始组就是GID为100的这个用户组。目前我们采用的机制私有用户组机制。 

HOME=/home:这个选项是用户的家目录的默认位置,所以所有的新建用户的家目录默认都在/home/下。 

INACTIVE=-1:这个选项就是密码过期后的宽限天数,也就是/etc/shadow文件的第七个字段。如果是天数,比如10代表密码过期后10天后失效;如果是0,代表密码过期后立即失效;如果是-1,则代表密码永远不会失效。这里默认值是-1,所以所有新建立的用户密码都不会失效。 

EXPIRE=:这个选项是密码失效时间,也就是/etc/shadow文件的第八个字段。也就说用户到达这个日期后就会直接失效。当然这里也是使用时间戳来表示日期的。默认值是空,所以所有新建用户没有失效时间,永久有效。 

SHELL=/bin/bash:这个选项是用户的默认shell的。/bin/bash是Linux的标志shell,所以所有新建立的用户默认都具备shell赋予的权限。 

SKEL=/etc/skel :这个选项就是定义用户的模板目录的位置,/etc/skel/目录中的文件都会复制到新建用户的家目录当中。 

CREATE_MAIL_SPOOL=yes: 这个选项定义是否给新建用户建立邮箱,默认是创建,也就是说所有的新建用户系统都会新建一个邮箱,放在/var/spool/mail/下和用户名相同。 



/etc/login.defs 

[root@localhost ~]# vi /etc/login.defs 

#这个文件有些注释,把注释删除掉,文件内容就变成下面这个样子了 

MAIL_DIR /var/spool/mail 

PASS_MAX_DAYS 99999 

PASS_MIN_DAYS 0 

PASS_MIN_LEN 5 

PASS_WARN_AGE 7 

UID_MIN 500 

UID_MAX 60000 

GID_MIN 500 

GID_MAX 60000 

CREATE_HOME yes 

UMASK 077 

USERGROUPS_ENAB yes 

ENCRYPT_METHOD SHA512 

MAIL_DIR /var/spool/mail:这行指定了新建用户的默认邮箱位置。比如user1用户的邮箱是就是/var/spool/mail/user1。 

PASS_MAX_DAYS 99999:这行指定的是密码的有效期,也就是/etc/shadow文件的第五字段。代表多少天之后必须修改密码,默认值是99999。 

PASS_MIN_DAYS 0: 这行指定的是两次密码的修改间隔时间,也就是/etc/shadow文件的第四字段。代表第一次修改密码之后,几天后才能再次修改密码。默认值是0。 

PASS_MIN_LEN 5:这行代表密码的最小长度,默认不小于5位。但是我们现在用户登录时验证已经被PAM模块取代,所以这个选项并不生效。 

PASS_WARN_AGE 7:这行代表密码修改到期前的警告天数,也就是/etc/shadow文件的第六字段。代表密码到底有效期前多少天开始进行警告提醒,默认值是7天。 

UID_MIN 500 、UID_MAX 60000 :这两行代表创建用户时,最小UID和最大的UID的范围。我们2.6.x内核开始,Linux用户的UID最大可以支持232这么多,但是真正使用时最大范围是60000。还要注意如果我手工指定了一个用户的UID是550,那么下一个创建的用户的UID就会从551开始,哪怕500-549之间的UID没有使用(小于500的UID是给伪用户预留的)。 

GID_MIN 500、 GID_MAX 60000 这两行指定了GID的最小值和最大值之间的范围。 

CREATE_HOME yes:这行指定建立用户时是否自动建立用户的家目录,默认是建立 

UMASK 077:这行指定的是建立的用户家目录的默认权限,因为umask值是077,所以新建的用户家目录的权限是700。 

USERGROUPS_ENAB yes: 这行指定的是使用命令userdel删除用户时,是否删除用户的初始组,默认是删除。 

ENCRYPT_METHOD SHA512: 这行指定Linux用户的密码使用SHA512散列模式加密,这是新的密码加密模式,原先的Linux只能用DES或MD5方式加密 



2.2设定密码 

[root@localhost ~]#passwd [选项] 用户名 

选项: 

-l: 暂时锁定用户。仅root用户可用 

-u: 解锁用户。仅root用户可用 

--stdin: 可以将通过管道符输出的数据作为用户的密码。主要在批量添加用户时使用 

[root@localhost ~]#passwd 

#passwd直接回车代表修改当前用户的密码 

也可以使用字符串作为密码: 

[root@localhost ~]# echo "123" | passwd --stdin user1 

更改用户 user1 的密码 。 

可以通过命令,把密码修改日期归零(shadow第3字段).这样用户一登陆就要修改密码,例如: 

[root@localhost ~]# chage -d 0 user1 


2.3用户信息修改 

usermod命令是修改已经添加的用户的信息的,命令如下: 

[root@localhost ~]#usermod [选项] 用户名 

选项: 

-u UID: 修改用户的UID 

-d 家目录: 修改用户的家目录。家目录必须写绝对路径 

-c 用户说明: 修改用户的说明信息,就是/etc/passwd文件的第五个字段 

-g 组名: 修改用户的初始组,就是/etc/passwd文件的第四个字段 

-G 组名: 修改用户的附加组,其实就是把用户加入其他用户组 

-s shell: 修改用户的登录Shell。默认是/bin/bash 

-e 日期: 修改用户的失效日期,格式为“YYYY-MM-DD”。也就是/etc/shadow 文件的第八个字段 

-L: 临时锁定用户(Lock) 


2.4删除用户 

[root@localhost ~]# userdel [-r] 用户名 

选项: 

-r: 在删除用户的同时删除用户的家目录 


2.5切换用户身份 

su命令可以切换成不同的用户身份,命令格式如下: 

[root@localhost ~]# su [选项] 用户名 

选项: 

-: 选项只使用“-”代表连带用户的环境变量一起切换 

-c 命令: 仅执行一次命令,而不切换用户身份 

“-”不能省略,它代表切换用户身份时,用户的环境变量也要切换成新用户的环境变量


3.组管理命令 

3.1添加用户组:groupadd 

添加用户组的命令是groupadd,命令格式如下: 

[root@localhost ~]# groupadd [选项] 组名 

选项: 

-g GID: 指定组ID 

添加用户组的命令比较简单,举个例子: 

[root@localhost ~]# groupadd group1 

#添加group1组 

[root@localhost ~]# grep "group1" /etc/group 

group1:x:502: 


3.2删除用户组:groupdel 

groupdel命令用于删除用户组,命令格式如下: 

[root@localhost ~]#groupdel 组名 

例子: 

[root@localhost ~]#groupdel testgrp 

#删除testgrp组 

注:不过大家要注意,要删除的组不能是其他用户的初始组,也就是说这个组中没有初始用户才可以删除。如果组中有附加用户,则删除组时不受影响。 




3.3 把用户添加进组或从组中删除:gpasswd 

其实gpasswd命令是用来设定组密码并指定组管理员的,不过我们在前面已经说了,组密码和组管理员功能很少使用,而且完全可以被sudo命令取代,所以gpasswd命令现在主要用于把用户添加进组或从组中删除。命令格式如下: 

[root@localhost ~]# gpasswd [选项] 组名 

选项: 

-a 用户名: 把用户加入组 

-d 用户名: 把用户从组中删除 

举个例子: 

[root@localhost ~]# groupadd grouptest 

#添加组grouptest 

[root@localhost ~]# gpasswd -a user1 grouptest 

Adding user user1 to group grouptest 

#把用户user1加入grouptest组 

[root@localhost ~]# grep "user1" /etc/group 

user1:x:501: 

grouptest:x:505:user1 

#查看一下,user1用户已经作为附加用户加入grouptest组 

[root@localhost ~]# gpasswd -d user1 grouptest 

Removing user user1 from group grouptest 

#把用户user1从组中删除 

[root@localhost ~]# grep "grouptest" /etc/group 

grouptest:x:505: 

#组中没有user1用户了 

注:大家注意,也可以使用usermod命令把用户加入某个组,不过usermod命令的操作对象是用户,命令是“usermod -G grouptest user1”,把用户名作为参数放在最后;而gpasswd命令的操作对象是组,命令是“gpasswd -a user1 grouptest”,把组名作为参数放在最后。 


3.4改变有效组:newgrp 

我们说过,每个用户可以属于一个初始组(用户是这个组的初始用户),也可以属于多个附加组(用户是这个组的附加用户)。既然用户可以属于这么多用户组,那么用户在创建文件后,默认生效的组身份是哪个呢?当然是初始用户组的组身份生效了,因为初始组是用户一旦登录就直接获得的组身份。也就是说,用户在创建文件后,文件的属组是用户的初始组,因为用户的有效组默认是初始组。 


既然用户属于多个用户组,那么能不能改变用户的有效组呢?使用命令

newgrp就可以切换用户的有效组。命令格式如下:

[root@localhost ~]# newgrp 组名

注:我们已经有了普通用户user1,默认会建立user1用户组,user1组是user1用户的初始组。我们再把user1用户加入group1组,那么group1组就是user1用户的附加组。当user1用户创建文件test1时,test1文件的属组是user1组,因为user1组是user1用户的有效组。通过newgrp命令就可以把user1用户的有效组变成group1组,当user1用户创建文件test2时,就会发现test2文件的属组就是group1组。

命令如下:

[root@localhost ~]# groupadd group1

#添加组group1

[root@localhost ~]# gpasswd -a user1 group1

Adding user user1 to group group1

#把user1用户加入group1组

[root@localhost ~]# grep "user1" /etc/group

user1:x:501:

group1:x:503:user1

#user1用户既属于user1组,也属于group1组

[root@localhost ~]# su – user1

#切换成user1身份,超级用户切换成普通用户不用密码

[user1@localhost ~]$ touch test1

#创建文件test1

[user1@localhost ~]$ ll test1

-rw-rw-r-- 1 user1 user1 0 1月 14 05:43 test1

#test1文件的默认属组是user1组

[user1@localhost ~]$ newgrp group1

#切换user1用户的有效组为group1组

[user1@localhost ~]$ touch test2

#创建文件test2

[user1@localhost ~]$ ll test2

-rw-r--r-- 1 user1 group1 0 1月 14 05:44 test2

#test2文件的默认属组是group1组

通过这个例子明白有效组的作用了吗?其实就是当用户属于多个组时,在创建文件时哪个组身份生效。使用newgrp命令可以在多个组身份之间切换。



常见问题:

文件系统为只读,可以重新挂载磁盘,设置为支持读写操作

mount -o rw,remount /dev/mapper/centos-root /

运维基础篇(4)-用户管理_运维