Linux常用命令(博客地图):https://blog.youkuaiyun.com/sysukehan/article/details/105804511
用户及用户组基础知识请参考《Linux常用命令(用户及用户组基础知识)》
相关文件结构
/etc/passwd文件结构
例:root:x:0:0:root:/root:/bin/bash | ||||||
1 | 2 | 3 | 4 | 5 | 6 | 7 |
root | X | 0 | 0 | root | /root | /bin/bash |
账号名称 | 密码 | UID | GID | 用户信息说明 | 主文件夹 | Shell |
/etc/shadow文件结构
例:root:$6$yMuqjFCP$p6z3v3bTa842XU/HRjmWALrXv723ZTepEgwT1G2M3kSI2M7hyGak6api1LhJu8smwz5K8r8MER1O..5hjWM7R1:18340:0:99999:7::: | ||||||||
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
root | $6$yMuqjFCP$p6z3v3bTa842XU /HRjmWALrXv723ZTepE gwT1G2M3kSI2M7hyGak6api1LhJu8 smwz5K8r8MER1O..5hjWM7R1 | 18340 | 0 | 99999 | 7 | 空 | 空 | 空 |
账号名称 | 密码(加密后) | 最近修改密码的日期 | 密码不可修改的日期 | 密码需要重新修改的日期 | 密码需要修改前的警告天数 | 密码过期后的宽限时间 | 账号失效日期 | 保留 |
/etc/group文件结构
例:adm:x:4:syslog,kehan | |||
1 | 2 | 3 | 4 |
adm | x | 4 | syslog,kehan |
用户组名称 | 用户组密码 | GID | 用户组支持的账号名称 |
用户组的查看和切换
初始用户组(effective group)
每个用户在他的/etc/passwd里面的第四列有所谓的GID,那个GID就是所谓的“初始用户组”。当用户登录系统时,立刻就拥有这个用户组的相关权限。初始用户组是不需要在/etc/group的第四个字段写入该账号的。
有效用户组(initial group)
在/etc/group的第四个字段中配置了账号,该账号就加入了这个用户组,这个用户组就是该账号的有效用户组。
有效与支持用户组的查看:groups
groups命令显示的第一个用户组就是root的有效用户组,这时候root用户创建的文件或目录,所属的用户组就是root的有效用户组,也就是root。
切换有效用户组:newgrp
为root添加一个用户组后,groups命令查询结果如下:
用newgrp命令切换有效用户组:
此时有效用户组变更为dbgroup,此时创建的文件或目录,所属用户组就是dbgroup了。
新增用户:useradd
useradd [-u UID] [-g 初始用户组] [-G 次要用户组] [-mM] [-c 说明栏] [-d 主文件夹绝对路径] [-s shell] 用户账号名
参数:
-u:后面接的是UID,是一组数字。直接指定一个特定的UID给这个账号。
-g:后面接的用户组名就是前面提到的初始用户组,该用户组的GID会被放置到/etc/passwd的第四个字段内。
-G:后面接的组名则是这个账号还可以加入的用户组,这个参数会修改/etc/group内的相关数据。
-M:不要创建用户主文件夹(系统账号默认值)。
-m:创建用户主文件夹(一般账号默认值)。
-c:这个是/etc/passwd的第五列说明内容,可以随便设置。
-d:指定某个目录成为主文件夹,而不要使用默认值,要求使用绝对路径。
-r:创建一个系统的账号,这个账号的UID会有限制(参考/etc/login.defs)。
-s:后面接一个shell,若没有指定则默认是/bin/bash。
-e:后面接一个日期,格式为“YYYY-MM-DD”,此选项可写入shadow第八字段,即账号失效日的设置选项。
-f:后面接shadow的第七字段选项,指定密码是否会失效。0为立刻失效,-1为永不失效(密码只会过期而强制于登录时重新设置而已)。
不加参数地创建一个用户看系统做了哪些事情:
1、在/etc/passwd里面创建一行与账号相关的数据,包括创建UID/GID/主文件夹等。
2、在/etc/shadow里面将此账号的密码相关参数填入,但是尚未有密码。默认情况下账号密码永不过期。
3、在/etc/group里面加入一个与账号同名的目录作为用户的主文件夹,且权限为700.
还需要执行“passwd 用户名”命令设置用户密码后创建用户才算结束。可以看到此时密码字段是!,此时conan这个新账号是不能登录的,但是可以从root用户切换过去。
useradd默认参数
useradd参考文件(useradd默认参数来源):/etc/default/useradd
用useradd -D也可以调出默认配置。
1、GROUP=100:新建账号的初始用户组使用GID为100
系统上面GID为100即是users这个用户组,这个设置意思是让新用户账号的初始用户组为users。但是不同的Linux表现不一样,有的Linux版本默认的用户组名为与账号名相同的用户组。这是因为针对用户组的角度有两种不同的机制:
1、私有用户组机制:系统会创建一个与账号一样的用户组给用户作为初始用户组。这种用户组的设置机制会比较有保密性,这是因为用户都有自己的用户组,而且主文件夹权限将会设置为700(仅有自己可进入自己的主文件夹之故。使用这种机制将不会参考GROUP=100这个配置。
2、公共用户组机制:就是以GROUP=100这个设置值作为新建账号的初始用户组,因此每个账号都属于users这个用户组,且默认主文件夹通常的权限会是“drwxr-xr-x”,由于每个账号都属于users用户组,因此大家可以互相分享主文件夹内的数据。
2、HOME=/home:用户主文件夹的基准目录(basedir)
用户的主文件夹通常是与账号同名的目录,这个目录将会放在此设置值的目录后面。所以conan的主文件夹就是/home/conan。
3、INACTIVE=-1:密码过期后是否会失效的设置
0代表过期后立刻失效,-1代表密码永不失效,30代表过期后30天失效。
4、EXPIRE=:账号失效日期
就是/etc/shadow文件内的第八字段,可以直接设置账号在哪个日期后直接失效,而不理会密码的问题,通常不会设置此选项。
5、SHELL=/bin/sh:默认使用的shell程序文件名
6、SKEL=/etc/skel:用户主文件夹参考基准目录
指定用户主文件夹参考基准目录,新用户主文件夹的内容都是从/etc/skel中拷贝过去的。
7、CREATE_MAIL_SPOOL=no:是否创建用户的mailbox
UID/GID默认密码参数
UID/GID密码参数的参考文件/etc/login.defs
mailbox所在目录
MAIL_DIR /var/mail:用户默认邮件信箱放置目录。
shadow密码第4,5,6字段内容
PASS_MAX_DAYS 99999:/etc/shadow的第5列,更改密码后需要再次更改密码的天数
PASS_MIN_DAYS 0:/etc/shadow的第4列,更改密码后不可更改密码的天数
PASS_WARN_AGE 7:/etc/shadow的第6列,密码过期前会警告的天数
UID/GID指定数值
UID_MIN 1000:一般账号最小UID
UID_MAX 60000:一般账号最大UID
GID_MIN 1000:一般用户组最小GID
GID_MAX 60000:一般用户组最大GID
系统计算新一般用户账号ID逻辑:先参考UID_MIN取得最小值,由/etc/passwd查找最大的UID数值,将两者相比,找出最大的那个加1就是新账号的UID。如果当前最大UID是2000,那么新UID就是2001,1000~1999就会空出来。
如果是创建系统账号,那么就会找出比500小的最大的那个UID+1.
用户删除与密码设置值
USERGROUPS_ENAB yes:如果使用userdel去删除一个账号,且该账号所属的初始用户组已经没有人隶属于该用户组了,那么就删除掉该用户组。
CREATE_HOME yes:我的系统上没有这个参数,所以没有自动创建新用户的主文件夹,加上这个配置后再创建一般用户,系统会自动创建新用户的主文件夹。
所以在使用useradd创建账号时至少会参考以下三个文件:
/etc/default/useradd
/etc/login.defs
/etc/skel/*
修改密码:passwd
所有用户都可以用passwd修改自己的密码。
只有root用户可以用“passwd 账号”来修改其他账号的密码。
参数:
-l:锁定账号,通过在/etc/shadow第二列最前面加上!使密码失效。
-u:解锁账号,和-l相对。
-S:列出密码相关参数,即shadow文件内的大部分信息。
-n:后面接天数,shadow的第4字段,多久不可修改密码天数。
-x:后面接天数,shadow的第5字段,多久内必须要改动密码。
-w:后面接天数,shadow的第6字段,密码过期前的警告天数。
-i:后面接“日期”,shadow的第7字段,密码失效日期。
root使用passwd命令可以设置各种各样的密码,几乎不会受密码复杂度的限制。
chage -l 账号名可以用来替代passwd -S 账号名,列出的信息更易读。
修改用户参数:usermod
usermod username
参数:
-c:后面接账号的说明,即/etc/passwd第五列的说明,可以加入一些账号的说明。
-d:后面接账号的主文件夹,即修改/etc/passwd的第6列。
-e:后面接日期,格式是YYYY-MM-DD,也就是在/etc/shadow内的第8个字段数据。
-f:后面接天数,为shadow的第7字段,密码过期后的账号宽限时间。
-g:后面接初始用户组,修改/etc/passwd的第四个字段,即是GID的字段。
-G:后面接次要用户组,修改这个用户组能够支持的用户组。
-a:与-G合用可增加次要用户组的支持而非设置(usermod -G dbgroup -a root)。
-l:后面接账号名称,即是修改账号名称,/etc/passwd的第一列。
-s:后面接Shell的实际文件,例如/bin/bash或/bin/sh等。
-u:后面接UID数字,即/etc/passwd第三列的数据。
-L:暂时将用户的密码冻结,让他无法登录,其实仅改/etc/shadow的密码。
-U:将/etc/shadow密码列的!去掉。
删除用户:userdel
userdel [-r] username
参数:
-r:连同用户的主文件夹一起删除。
删除的用户数据有:
用户账号/密码相关参数:/etc/passwd,/etc/shadow
用户组相关参数:/etc/group,/etc/gshadow
用户个人文件数据:/home/username,/var/spool/mail/username
想要完整删除某个用户,最好先用find / -user username查出系统内属于username的文件,删掉这些文件后再执行userdel -r username。
查询用户相关信息:id
查询自己的相关GID/UID等信息:id
查询其他账号的相关GID/UID等信息:id username
新增用户组:groupadd
groupadd 用户组名
参数:
-g:后面接某个特定的GID,用来直接给予某个GID。
-r:新建系统用户组。
修改group相关参数:groupmod
groupmod [-g gid] [-n group_name] 用户组名
参数:
-g:修改既有的GID。
-n:修改既有的组名。
不要随意修改GID,容易造成系统资源的混乱。
删除用户组:groupdel
groupdel groupname
只有没有账号以groupname为初始用户组的情况下才可以删除该用户组。
切换用户:su
su - [username]
不带username代表这切换到root用户。
不带-的情况下shell不会加载目标username的环境变量。
退出切换的用户:exit
切换身份进行某项任务:sudo
sudo [-b] [-u 新用户账号]
参数:
-b:将后续的命令让系统自动执行,而不与目前的shell产生影响。
-u:后面可以接欲切换的用户,若无此项则代表切换身份为root。
如:以sshd身份在/tmp下面新建一个名为mysshd的文件。
sudo -u sshd touch /tmp/mysshd
sudo可以切换身份来进行某项任务。在上述命令中,因为无法使用su – sshd去切换系统账号(因为系统账号的shell是/sbin/nologin),这个时候就可以使用sudo命令以sshd的权限在/tmp下面新建文件。但是sudo默认只有root能使用,因为sudo的执行流程是这样的:
1)当用户执行sudo时,系统于/etc/sudoers文件中查找该用户是否有执行sudo的权限;
2)当用户具有可执行sudo的权限后,便让用户输入用户自己的密码来确认;
3)若密码输入成功,便开始执行sudo后续接的命令;
4)root执行sudo时不需要输入密码。若欲切换的身份与执行者身份相同,也不需要输入密码;
sudo执行的重点是能否使用sudo必须要看/etc/sudoers的设置值,而可使用sudo的是通过输入用户自己的密码来执行后续的命令串。
除了root之外的账号,若想要使用sudo执行属于root的权限命令,则root需要先使用visudo去修改/etc/sudoers,让该账号能够使用全部或部分的root命令功能。使用visudo是因为/etc/sudoers是有语法的,如果设置错误会造成无法使用sudo命令的不良后果。使用visudo去修改,结束离开修改界面时,系统会去检验/etc/sudoers的语法。
常用的修改sudoers的方法就是使单一用户可进行root的所有命令,那么加上root下方那一行即可:
kehan ALL=(ALL:ALL) ALL
四个参数的意义是:
1)用户账号:系统的哪个账号可以使用sudo这个命令,默认为root这个账号。
2)登录者的来源主机名:这个账号由哪台主机连接到本Linux主机,意思是这个账号可能是由哪一台网络主机连接过来的,这个设置值可以指定客户端计算机(信任用户的意思)。ALL意思是可来自任何一台网络主机。
3)可切换的身份:这个账号可以切换成什么身份来执行后续的命令,ALL意思是可以切换成任何人。
4)可执行的命令:这个命令务必使用绝对路径编写,ALL意思是可以执行任何命令。
一般为了让其他账户具有和root一样的权限,就指定账号后全部设置为ALL。
参考资料
《鸟哥的Linux私房菜基础学习篇(第三版)》