关注微信公众号:CodingTechWork,一起学习进步。
在Linux系统中,我们常常会看到目录或文件的所属关系:
[root@linux01 ~]# ll -d test.sh -rw-r----- 1 root root 144 11月 20 2019 test.sh其中root root就是文件拥有者和群组,root是超管账号,接下来我们来详细学习这些账号相关的概念以及相关命令使用。
User:Linux是一个多用户多任务的系统,一个物理机或者虚拟机往往会有很多人同时使用,每个用户在各自的家目录进行操作(如部署自己的应用、存储文件等),这个时候就需要将这些用户进行隔离,权限分开。用户A无权读写用户B的相关目录,用户B无权读写用户A的目录,保证每个人各自的隐私。
Group:多个使用者需要共享相同的东西,归属于同一个群组,举例来说,一个开发团队,在代码仓库中会属于同一个仓库地址下,这样一个团队的成员可以共享这个仓库地址下的代码进行读写,而其他开发团队的成员无权读写这个团队的代码仓库。
Others:其他人这个概念比较好理解,相对于本群组而言,跟其无关的都是其他人。
对于计算机而言,计算机不会认识账号昵称之类的别名,只会识别二进制(0和1),在Linux中也是同样的,主机对于账号只是识别ID。 登录账号一般有两个ID,一个是使用者ID(UDI, User ID),存放在/etc/passwd中;一个是群组ID(GID, Group ID) ,存放在/etc/group中。我们可以通过id user_name的方式来查看UID和GID。 文件或者目录查看属性时,首先会根据/etc/passwd和/etc/group的内容,利用UID和GID显示对应账号和群组名称,从而判断自己的拥有者和群组。
/etc/passwd是系统用户配置文件,这个文件中存储了系统中所有用户的基本信息。 该文件是对所有用户都可读的:
[root@linux01 ~]# ll -d /etc/passwd -rw-r--r-- 1 root root 1349 9月 3 10:18 /etc/passwd文件结构详解如下:
[root@linux01 ~]# head -n 5 /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/bin/false lp:x:4:7:lp:/var/spool/lpd:/bin/false一共7个字段,每一行中的字段由:隔开。第一个一般都是root系统管理员账户信息。
账号名称:登录账号的名称,与UID对应。
密码:早起Unix系统密码放置在改字段中,后因安全问题,放置密码数据被窃取,改放到/etc/shadow中,所以这边显示为x。
UID:账号的使用者识别码。
id范围id对应使用者的特性0 (系统管理员)UID=0时,表示该账号为root权限(系统管理员),普通账户的UID改为0即拥有root权限,但不建议修改。1~999(系统账号)UID=1~999时,即为系统保留的系统账号,用于更小的权限去操作系统中的服务。1000~60000(可登陆账号)UID=1000~60000时,表示一般使用者的账号。GID:该信息与/etc/group相关联,下面会阐述该目录内容的结构。
使用者信息说明栏:解释说明作用,一般配合finger使用。
主文件夹:用户家目录,一般useradd userA后,会自动为userA用户创建/home/userA用户家目录,rott的用户家目录在/root下。
shell:用户登录系统后会取得一个shell与系统核心联系,从而在系统上进行操作。
/etc/shadow是用于存储 Linux 系统中所有用户对应的密码信息,我们也称为“影子文件”。 除了root用户,其他用户没有权限访问该文件。
[root@linux01 ~]# ls -al /etc/shadow -r-------- 1 root root 1101 9月 3 10:25 /etc/shadow [t1@linux01 ~]$ cat /etc/shadow cat: /etc/shadow: Permission denied文件结构详解如下:
[root@linux01 ~]# head -n 5 /etc/shadow root:$6$T211m/bzdf7/N$AV4IJJWMgmCNuovXSlu6LvkUwQ5W1JKTVgy7fdarewvdsfs.SB7j7oJSuKvV9sg1VXrTw3M03FfRsn8NqY6cQ/:18225:0:99999:7::: bin:*:17110:0:99999:7::: daemon:*:17110:0:99999:7::: adm:!*:17110:0:99999:7::: lp:!*:17110:0:99999:7:::账号名称:与/etc/passwd对应,账号名称。
密码:存放加密的密码。
最近更改密码的累积天数:该字段记录的是变更密码的那天日期,从1970年1月1日作为1开始累积,这个累积的天数可以通过代码进行计算。
echo $(($(date --date="2020/09/03" +%s)/86400+1))其中,86400是一天的秒数,+1是为了补齐1970年1月1日那天。
密码不可被更改的天数:该字段限制了密码从最后一次变更后,需要经过多少天才可以进行变更。若为0,则表示无限制,可以随时更改密码。
密码需要重新更改的天数:该字段限制了密码从最后一次变更后,需要经过多少天就应该再次变更。若为99999,表示273年,也就是无限制。
密码需要更改前警告提示的天数:账号密码有效期快到的时候,会提前进行提示警告。
密码失效时间:密码更新时间(第3字段)+重新变更时间(第5字段)为有效期,过期后,还没有更新密码,密码就会过期。
账号失效日期:类似于第三个字段进行累计失效日期计算,过期后,账号无法使用。
保留:保留字段。
我们在上述的/etc/passwd账号配置文件中发现有GID字段, 而这个字段是在/etc/group相关联。
/etc/group文件存储群组相关配置信息。
[root@linux01 ~]# head -n 5 /etc/group root:x:0: bin:x:1: daemon:x:2: sys:x:3: adm:x:4:群组名称:群组的名称,与GID对应。
群组密码:群组的密码,通常给群组管理员使用,一般不设置,密码不会再此显示,会在/etc/gshadow中显示,在此只会显示x。
GID:群组的ID,也就是/etc/passwd第四个字段的GID。
群组支持的其他账号名称:一个账号可以加入多个群组,当其他账户加入该群组后,会填入到该字段中,逗号隔开。
/etc/gshadow是存放群组的密码等信息;
[root@linux01 ~]# head -n 5 /etc/gshadow root::: bin::: daemon::: sys::: adm:::群组名称:对应账户的群组名称;
群组密码:群去的密码;若开头为!则表示无合法密码,无群组管理员;
群组管理员账号:群组管理员的账号名称
有加入该群组支持的所属账号:群组下所支持的账号,与/etc/group中的保持一致。
三文件的关系: /etc/passwd、/etc/shadow、/etc/group
群组分为初始群组和有效群组,初始群组就是/etc/passwd中的第四个字段中GID对应的群组;有效群组就是某个用户userA可以加入到其他群组userB中,这个群组userB对于这个用户userA来说就是有效群组。 举例:假设通过useadd命令创建了t1和t2用户,然后通过usermod命令将t1用户加入到t2群组内。
[root@linux01 ~]# usermod -G t2 t1其中-G是指定有效群组。
我们可以在/etc/group中看到t1用户已加入到t2群组的第四个字段中。 [root@linux01 ~]# grep t1 /etc/passwd /etc/shadow /etc/group /etc/passwd:t1:x:1002:1002::/home/t1:/bin/bash /etc/shadow:t1:$6$9OxP0pfl$0qLlLCi4WNHcK5yuGHDIXPKQ2A/Ilm1zBkf73fS8v1g0EsLa9.0Vavi8oInFfGLyvfU9ulsgWVUzJRbGUJuEq/:18508:0:60:7::: /etc/group:t1:x:1002: /etc/group:t2:x:1003:t1 我们也可以登录t1账号后,通过groups命令查看所支持的群组 [root@linux01 ~]# su - t1 上一次登录:四 9月 3 16:22:46 CST 2020pts/0 上 [t1@linux01 ~]$ groups t1 t2 [t1@linux01 ~]$ touch test0.txt [t1@linux01 ~]$ ll -d test0.txt -rw-r----- 1 t1 t1 0 Sep 3 17:53 test0.txt第一个t1是有效群组,查看到新建的文件的使用者是t1,所属群组也是t1。
我们可以通过newgrp来切换有效群组 [t1@linux01 ~]$ newgrp t2 [t1@linux01 ~]$ groups t2 t1 [t1@linux01 ~]$ touch test.txt [t1@linux01 ~]$ ll -d test.txt -rw-r----- 1 t1 t2 0 Sep 3 18:01 test.txt我们可以看到文件使用者是t1,所属群组是t2。
useradd命令是新建账号命令。
useradd [-u UID] [-g 初始群组] [-G 次要群组] [-mM] [-c 说明栏] [-d 主目录的绝对路径] [-s shell] 使用者账号名
无参创建:
[root@linux01 ~]# useradd u1 [root@linux01 ~]# ll -d /home/u1/ drwx------ 2 u1 u1 4096 9月 4 09:11 /home/u1/ [root@linux01 ~]# grep u1 /etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/passwd:u1:x:1004:1004::/home/u1:/bin/bash /etc/shadow:u1:!!:18509:0:90:7::: /etc/group:u1:x:1004: /etc/gshadow:u1:!::说明:
在/etc/passwd中创建一行与账号相关的数据,包含了UID、GID、用户家目录等信息;在/etc/shadow中创建一行与账号密码相关的数据,如果没有指定密码,则无密码填入;若需要指定密码,则需要使用passwd user_name命令来指定密码;在/etc/group中创建一行与账号群组相关的数据,加入一个与账号名称一样的群组名称;在/etc/gshadow中创建一行与账号群组密码相关的数据,包含群组名称、群组管理密码等信息;在/home下创建一个与账号名称相同的用户家目录,用于使用者主文件夹,且权限为700(drwx------),加参创建:
[root@linux01 ~]# useradd -u 1009 -g users u2 [root@linux01 ~]# ll -d /home/u2/ drwx------ 2 u2 users 4096 9月 4 09:16 /home/u2/ [root@linux01 ~]# grep u2 /etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/passwd:u2:x:1009:100::/home/u2:/bin/bash /etc/shadow:u2:!!:18509:0:90:7:::说明:
-u是指定了账号的UID,我们可以看到/etc/passwd中的第3栏的UID是我们指定的1009;-g是指定了初始群组,我们可以看到/etc/passwd中的第4栏的GID是群组users对应的100;因为指定了初始群组,/etc/group中就不会主动创建与账号同名的群组,所以在/etc/group和/etc/gshadow中没有查看到u2相关的数据。系统账号:
[root@linux01 ~]# useradd -r u3 [root@linux01 ~]# ll -d /home/u3 ls: 无法访问/home/u3: 没有那个文件或目录 [root@linux01 ~]# grep u3 /etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/passwd:u3:x:996:992::/home/u3:/bin/bash /etc/shadow:u3:!!:18509:::::: /etc/group:u3:x:992: /etc/gshadow:u3:!::说明:
-r参数代表创建一个系统账号;/etc/passwd中的第3栏看到数字为996,符合规定,1000及以后的号为一般账号,1000之前的号为系统账号;由于系统账号主要用于进行运行系统所需服务的权限设置,所以系统账号默认没有创建用户家目录。useradd命令执行后,会涉及到以下文件或目录的变动:
用户账号和密码相关文件:/etc/passwd,/etc/shadow。用户群组和密码相关文件:/etc/group,/etc/gshadow。用户的主文件夹(用户家目录):/home/账号名称。passwd命令是修改账号密码的命令。
无参更改
[root@linux01 ~]# passwd u1 更改用户 u1 的密码 。 新的 密码: 无效的密码: 过短 无效的密码: 过于简单 重新输入新的 密码: 抱歉,密码不匹配。 新的 密码: 无效的密码: 过于简单化/系统化 无效的密码: 过于简单 重新输入新的 密码: 无效的密码: 密码未通过字典检查 - 过于简单化/系统化 重新输入新的 密码: 抱歉,密码不匹配。 新的 密码: 重新输入新的 密码: passwd:所有的身份验证令牌已经成功更新。我们可以看到,不管是过短、还是过于简单都会有提示,一直更改到符合密码规范才会生效。在/etc/login.defs中我们可以看到对于密码的一些要求。
有参更改,通过--stdin参数,从标准输入读取令牌(只有根用户才能进行此操作)。
[root@linux01 ~]# echo "1234qwer" | passwd --stdin u1 更改用户 u1 的密码 。 passwd:所有的身份验证令牌已经成功更新。查询密码状态,通过-S参数,报告已命名帐号的密码状态(只有根用户才能进行此操作)
[root@linux01 ~]# passwd -S u1 u1 PS 2020-09-04 0 90 7 -1 (密码已设置,使用 SHA512 算法。)加解锁密码,通过-l锁定,加锁时,查看状态,会出现LK状态,查看/etc/shadow中的第2个密码栏会发现多了!!两个字符;-u解锁,解锁后恢复PS状态,且/etc/shadow中的第2个密码栏会去掉!!。
[root@linux01 ~]# passwd -l u1 锁定用户 u1 的密码 。 passwd: 操作成功 [root@linux01 ~]# passwd -S u1 u1 LK 2020-09-04 0 90 7 -1 (密码已被锁定。) [root@linux01 ~]# grep u1 /etc/shadow u1:!!$6$bw/GP7Lv$s8fQGoLvGiRK.sgV2KSZ1sUeKUGbgEQH1NzQq9DZ8x1jWbg86wG3aGE25T7f4.77rhRBEIe1eQL55C6ftrmB5/:18509:0:90:7::: [root@linux01 ~]# passwd -u u1 解锁用户 u1 的密码。 passwd: 操作成功 [root@linux01 ~]# passwd -S u1 u1 PS 2020-09-04 0 90 7 -1 (密码已设置,使用 SHA512 算法。) [root@linux01 ~]# grep u1 /etc/shadow u1:$6$bw/GP7Lv$s8fQGoLvGiRK.sgV2KSZ1sUeKUGbgEQH1NzQq9DZ8x1jWbg86wG3aGE25T7f4.77rhRBEIe1eQL55C6ftrmB5/:18509:0:90:7:::chage命令用于展示更详细的密码参数信息。
chage [-ldEImMW] 账号名称
说明:-l参数可以展示出账号密码相关的时间信息。
usermod命令用于修改账号相关配置。
usermod [-cdegGlsuLU] 账号名称
说明:通过-c参数添加说明信息后,我们可以看到/etc/passwd中更新说明生效。
userdel命令用于删除用户账号相关数据。主要涉及如下方面:
使用者账号/密码相关数据:/etc/passwd, /etc/shadow;使用者群组相关数据:/etc/group, /etc/gshadow;使用者个人文件数据:/home/user_name, /var/spool/mail/user_name等。该命令要慎用,真的确认要删除账号及所有数据的时候才使用该命令,否则可以去/etc/shadow账号中的第8个字段进行设置为0,就可以使账号失效,但数据还在。
userdel [-r] 账号名称
不删除用户家目录
[root@linux01 ~]# userdel u1 [root@linux01 ~]# ll -d /home/u1 drwx------ 2 1004 1004 4096 9月 4 17:17 /home/u1删除用户家目录,使用-r参数
[root@linux01 ~]# userdel -r u2 [root@linux01 ~]# ll -d /home/u2 ls: 无法访问/home/u2: 没有那个文件或目录groupadd命令用于添加群组。
groupadd [-g GID] [-r] 群组名称
说明:要注意的是,不带-g时,群组的GID会从1000以上最大的GID+1来创建。
groupmod命令类似于usermod命令,用于修改群组group的相关配置参数。
groupmod [-g 新GID] [-n 新群组名称] 旧群组名称
说明:我们可以看到/etc/group和/etc/group中已经不存在g1了。
groupdel命令用于删除群组。需要注意的是,在/etc/passwd中被使用为有效群组的群组不能被删除。 如:
[root@linux01 ~]# groupdel t1 groupdel:不能移除用户“t1”的主组groupdel [groupname]
参考《鸟哥的Linux私房菜》