赞
踩
su 切换用户
useradd 新建用户
userdel 删除用户
passwd 修改用户密码
usermod 修改用户属性
chage 修改用户属性
root 用户可以访问系统配置文件。
普通用户无法访问其他用户的家目录。
su 用户名 # 账号切换到用户名身份,但shell环境仍为当前环境
su - 用户名 # 账号切换到用户名身份,shell环境也变更为该用户身份
su kevin
su - kevin
su # 账号切换为root身份,shell环境还是变更前的用户身份
su - # 账号切换为root身份,shell环境也切换为root身份
su
命令和su -
命令最大的本质区别就是:前者只是切换了 root 身份,但 Shell 环境仍然是普通用户的 Shell;而后者连用户和 Shell 环境一起切换成 root 身份了。
“-”
这里说的切换环境,不单单是指登录后切换到该用户的家目录;还指(更重要的)环境变量也会切换当该用户的环境变量。这才是真正的“环境切换”。
useradd 用户名
useradd kevin # 新建的用户为 kevin 同时 用户组也为 kevin,家目录也为 /home/kevin
useradd -g 指定用户组 用户名
useradd -g testgroup kevin
# 新建用户 kevin 并同时将其初始组设置为 testgroup(将不会生成一个叫 kevin 的用户组)
新建用户,系统实际进行了如下操作:
在/home/
目录下新建了与用户名同名的家目录,并在家目录下安放了与用户相关的几个隐藏配置文件。如:
.bash_logout
.bash_profile
.bashrc
用户会被记录到 /etc/passwd
文件中
/etc/passwd
文件,是系统用户配置文件,存储了系统中所有用户的基本信息,并且所有用户都可以对此文件执行读操作。
kevin:x:1000:1000:centos7:/home/kevin:/bin/bash
只要有包含 kevin 的这一行,就说明系统里有 kevin 这个用户用户名 | 密码 | UID(用户ID) | GID(组ID) | 描述性信息 | 主目录 | 默认Shell |
---|---|---|---|---|---|---|
kevin | x | 1000 | 1000 | centos7 | /home/kevin | /bin/bash |
用户名、UID:用户名仅是为了方便用户记忆,Linux 系统是通过 UID 来识别用户身份,分配用户权限的。
密码: “x” 表示此用户设有密码,但不是真正的密码,真正的密码加密后保存在 /etc/shadow 文件中。
- 虽然 “x” 并不表示真正的密码,但也不能删除,如果删除了 “x”,那么系统会认为这个用户没有密码,从而导致只输入用户名而不用输入密码就可以登陆(只能在使用无密码登录,远程是不可以的),除非特殊情况(如破解用户密码),这当然是不可行的。【经测试,即将x删除后,可以在当前电脑其他用户切换为这个用户时不再使用密码(图形界面重启也能免密进入该用户),但远程ssh是需要这个用户本身有密码才行的,没了密码压根不允许登录】
UID 范围 用户身份 0 超级用户。UID 为 0 就代表这个账号是管理员账号。在 Linux 中,如何把普通用户升级成管理员呢?只需把其他用户的 UID 修改为 0 就可以了,这一点和 Windows 是不同的。不过不建议建立多个管理员账号。 1~499 系统用户(伪用户)。也就是说,此范围的 UID 保留给系统使用。其中,1~99 用于系统自行创建的账号;100~499 分配给有系统账号需求的用户。
其实,除了 0 之外,其他的 UID 并无不同,这里只是默认 500 以下的数字给系统作为保留账户,只是一个公认的习惯而已。500~65535 普通用户。通常这些 UID 已经足够用户使用了。但不够用也没关系,2.6.x 内核之后的 Linux 系统已经可以支持 232 个 UID 了。 描述性信息:这个字段并没有什么重要的用途,只是用来解释这个用户的意义而已。
/etc/passwd 记录的用户中的绝大多数是系统或服务正常运行所必需的用户,这种用户通常称为系统用户或伪用户。系统用户无法用来登录系统,但也不能删除,因为一旦删除,依赖这些用户运行的服务或程序就不能正常执行,会导致系统问题。
默认的shell:可以把这个字段理解为用户登录之后所拥有的权限。如果这里使用的是 bash(
/bin/bash
) 命令解释器,就代表这个用户拥有权限范围内的所有权限(即其所在用户组的权限,它都可以正常使用,之所以这么说,是因为可能其权限还会被进一步缩减,即便在这个组也是用不了这个组的所有权限)。
/sbin/nologin
:用户禁止登录/usr/bin/passwd
:用户可以登录,但登录后只能修改自己的密码。- 注意:这里不能随便写入和登录没有关系的命令(如 ls),系统不会识别这些命令,同时也就意味着这个用户不能登录。
别作死去把 root 或系统用户删除,Kevin实际测试过:另外建一个普通用户,把其uid改为0,该用户登录后实际上是使用root来登录的,于是尝试把root那行注释了,想着是否会直接用该用户代替root,结果重启后进不了系统,虚拟机被迫重新安装了centos7。
如果是基于安全原因禁用root,而用另外的账号名(比如说:kevin)来取代root的权限,更合适的方式是将 kevin 的 UID 改为 0,然后把 root 用户的 shell 改为/sbin/nologin
,这样 root 用户就会被禁用掉,但用 kevin 来登录的话,仍然会显示为 root。
用户还会记录到 /etc/shadow
文件中
/etc/shadow
文件,用于存储 Linux 系统中用户的密码信息,又称为“影子文件”。由于/etc/passwd 文件允许所有用户读取,易导致密码泄露,因此 linux 系统将用户的密码信息从 /etc/passwd 文件中分离出来,并单独放到了
/etc/shadow
中。/etc/shadow
文件只有 root 用户拥有读权限,其他用户没有任何权限,这样就保证了用户密码的安全性。
kevin:$1$$WS/hPpd37txc0rKsvCMvl.:19006:0:99999:7:::
同样会有由 kevin 开头的一行信息。
用户名 加密密码 最后一次修改时间 最小修改时间间隔 密码有效期 密码需要变更前的警告天数 密码过期后的宽限天数 账号失效时间 保留字段 kevin $1$$WS/hPpd37txc0rKsvCMvl. 19006 0 99999 7 用户名:同 /etc/passwd 文件的用户名有相同的含义。
加密密码:这里保存的是真正加密的密码。目前 Linux 的密码采用的是 SHA512 散列加密算法,原来采用的是 MD5 或 DES 加密算法。SHA512 散列加密算法的加密等级更高,也更加安全。
注意,这串密码产生的乱码不能手工修改,如果手工修改,系统将无法识别密码,导致密码失效。很多软件透过这个功能,在密码串前加上 “!”、"*" 或 “x” 使密码暂时失效。(经过 Kevin 实验,失效之后是登录不了系统,而非没有密码)
所有伪用户的密码都是 “!!” 或 “*”,代表没有密码是不能登录的。当然,新创建的用户如果不设定密码,那么它的密码项也是 “!!”,代表这个用户没有密码,不能登录。
经过测试,即便两个用户的密码相同,在/etc/shadow 中的加密密码字符串都会显示为不同。
最后一次修改时间:Linux 计算日期的时间是以 1970 年 1 月 1 日作为 1 不断累加得到的时间,到 1971 年 1 月 1 日,则为 366 天。这里显示 19006 天,也就是说,此 root 账号在 1970 年 1 月 1 日之后的第 19006 天修改的 root 用户密码。(可使用
date -d "1970-01-01 19006 days"
命令来查看该日期具体是哪一天)kevin@localhost ~]$ date -d "1970-01-01 19006 days" Fri Jan 14 00:00:00 PST 2022
- 1
- 2
最小修改时间间隔:该字段规定了从第 3 字段(最后一次修改密码的日期)起,多长时间之内不能修改密码。如果是 0,则密码可以随时修改;如果是 10,则代表密码修改后 10 天之内不能再次修改密码。(此字段是为了针对某些人频繁更改账户密码而设计的。)
密码有效期:经常变更密码是个好习惯,为了强制要求用户变更密码,这个字段可以指定距离第 3 字段(最后一次更改密码)多长时间内需要再次变更密码,否则该账户密码进行过期阶段。
- 该字段的默认值为 99999,也就是 273 年,可认为是永久生效。如果改为 90,则表示密码被修改 90 天之后必须再次修改,否则该用户即将过期。管理服务器时,通过这个字段强制用户定期修改密码。
密码需要变更前的警告天数:与第 5 字段相比较,当账户密码有效期快到时,系统会发出警告信息给此账户,提醒用户 “再过 n 天你的密码就要过期了,请尽快重新设置你的密码!”。
- 该字段的默认值是 7,也就是说,距离密码有效期的第 7 天开始,每次登录系统都会向该账户发出 “修改密码” 的警告信息。
密码过期后的宽限天数:也称为“口令失效日”,简单理解就是,在密码过期后,用户如果还是没有修改密码,则在此字段规定的宽限天数内,用户还是可以登录系统的;如果过了宽限天数,系统将不再让此账户登陆,也不会提示账户过期,是完全禁用。
- 比如说,此字段规定的宽限天数是 10,则代表密码过期 10 天后失效;如果是 0,则代表密码过期后立即失效;如果是 -1,则代表密码永远不会失效。
账号失效时间:同第 3 个字段一样,使用自 1970 年 1 月 1 日以来的总天数作为账户的失效时间。该字段表示,账号在此字段规定的时间之外,不论你的密码是否过期,都将无法使用!
- 该字段通常被使用在具有收费服务的系统中。
保留字段:该字段目前还没有具体用途。
为用户分配一个用户id,系统通过用户id来区分用户。
创建用户组(如果创建用户时没有指定组,则创建与用户同名的组)
注意:创建用户后,如果不给这个用户设置密码,那么其他普通用户是无法切换到这个用户上的,因为会询问密码,但不输入密码就回车又会说验证失败。同样,重启用图形界面去登录这个新用户也是需要密码,并且空密码回车会报验证失败,反正就是登录不了。【但root用户是可以不用密码就能切换到其他用户的,所有此时只有root用户能切换到该用户】
id 用户名
id kevin
uid=1000(kevin) gid=1000(kevin) groups=1000(kevin)
新创建的用户需要指定密码才能登录
# root修改其他用户密码
passwd 用户名
passwd kevin
# 修改自己用户密码
passwd
参考: http://c.biancheng.net/view/840.html
普通用户:可以通过 root 账户解决,它会重新给你配置好指定账户的密码,而不需知道你原有的密码(利用 root 的身份使用 passwd 命令即可)。
root用户:则需要重新启动进入单用户模式,系统会提供 root 权限的 bash 接口,此时可以用 passwd 命令修改账户密码;也可以通过挂载根目录,修改 /etc/shadow,将账户的 root 密码清空的方法,此方式可使用 root 无需密码即可登录,建议登录后使用 passwd 命令配置 root 密码。
userdel 用户名
userdel kevin
userdel -r kevin # -r 会删除 /home/ 目录下与用户名同名的家目录
# 通常会使用 -r 选项,因为如果不使用 -r 选项,该用户的家目录会被保留下来。并且除了root没人可以访问这个家目录。但有个很严重的问题,就是如果之后新建的用户沿用了这个被删除用户(又保留了家目录)的uid,那么这个新用户无论是否会另外新建一个家目录,都将同时继承这个之前用户的家目录,可以访问里面的数据。(新用户与被删用户的名字是否相同并不是取决因素,uid相同才是取决因素)
# 一旦由于上面的因素,导致比如有一个遗留的家目录叫“test”,后面新建的用户“test”又没有沿用之前test用户的uid,导致没有继承这个家目录的话,userdel -r 就会出问题,因为既删不掉test用户目前使用的家目录(因为目录与用户不同名),又删不掉那个叫“test”的家目录(因为test用户没有这个目录的权限)。
# 另外,当这种删除用户又不删除家目录的奇怪操作多了之后,难免会出现新建一个用户,对多个家目录的情况,这个时候,对这几个家目录中的任意一个家目录操作,都同时对其他家目录进行操作。比如test有两个家目录test与abc,则userdel -r test 会删除的是test家目录,保留abc,但abc内容也会被清空,就好像是一个家目录分了几个入口的感觉。显然这样是很混乱的。
usermod 用户名称 # 仅修改家目录(原家目录会重命名并移动到新的目录下成为新的家目录) usermod -d 新家目录 -m 用户名 usermod -d /home/abc kevin # 这里漏了-m 实测操作无效 usermod -d /home/abc -m kevin usermod -d /haha -m kevin # 也是成功的,新的家目录可以是在任意设定的位置,而不一定需要在home目录下。 # 这里改变的只是家目录,并不改变用户名,也不改变用户组 # 仅修改用户名 usermod -l 新用户名 旧用户名 usermod -l mark kevin # 用户名从kevin改为mark # 用户组不变,用户家目录不变 # 修改用户名及其家目录 usermod -l 新用户名 -d /home/新用户名 -m 以前的用户名 # -l 是小写字母L,上面的命令执行完之后会立即把就用户名改为新用户名,旧家目录改为新家目录(不另外建新目录,而是直接将旧家目录名称变更) # 这里改变了用户名和家目录,单用户组是没有变更的。 # 修改用户组 usermod -g 新用户组 用户名 usermod -g testgroup kevin # 为用户添加附加组(不影响初始组) usermod -a -G 新添加的附加组(多个附加组用逗号隔开) 用户名 usermod -a -G testgroup1,testgroup2 kevin # 此时,kevin同时属于testgroup1、testgroup2、kevin组。 # 为用户替换附加组(不影响初始组) usermod -G 附加组(多个附加组用逗号隔开) usermod -G testgroup3 kevin # 原本kevin属于testgroup1,testgroup2,kevin 3个组,现在,kevin属于 testgroup3,kevin两个组。【即,若原本所在的附加组不在此组列表中,用户将被移出该附加组】。 # 锁定用户(已经登录无影响,未登录无法登录) usermod -L kevin # 解锁用户 usermod -U kevin
设置用户密码修改的间隔时间、密码过期时间、用户账号过期时间。
chage [选项] 用户名
-m:密码可更改的最小天数。为零时代表任何时候都可以更改密码。
-M:密码保持有效的最大天数。
-w:用户密码到期前,提前收到警告信息的天数。
-E:帐号到期的日期。过了这天,此帐号将不可用。
-d:上一次更改的日期。
-i:停滞时期。如果一个密码已过期这些天,那么此帐号将不可用。
-l:列出当前的设置。由非特权用户来确定他们的密码或帐号何时过期。
# 注意:有两种让账号在指定日期失效的方式:
# 1. -E 设置账户有效期
# 2. 不设置账户有效期,但设置密码有效期,并 -i 设置停滞时间,如果密码过期后限期内不修改,也会对账号禁用。
chage -M 99999 用户名 # 基本等于设置这个用户的密码永久有效了。
groupadd 新建用户组
groupmod 修改用户组
groupdel 删除用户组
groupadd 新用户组名
查看当前系统中的用户组信息
/etc/group
更多详情参考:http://c.biancheng.net/view/841.html
如:
kevin:x:1000:
组名 组密码 组id(group id) 组中的用户 kevin x 1000 实际的组密码保存在
/etc/gshadow
中,/etc/passwd
中只有group id ,可以在这里找到对应的组名。组名
组名不能重复
组密码
和 /etc/passwd 文件一样,这里的 “x” 仅仅是密码标识,真正加密后的组密码默认保存在 /etc/gshadow 文件中。
用户组密码主要是用来指定组管理员的,由于系统中的账号可能会非常多,root 用户可能没有时间进行用户的组调整,这时可以给用户组指定组管理员,如果有用户需要加入或退出某用户组,可以由该组的组管理员替代 root 进行管理。但是这项功能目前很少使用,我们也很少设置组密码。如果需要赋予某用户调整某个用户组的权限,则可以使用 sudo 命令代替。
组id
就是群组的 ID 号,Linux 系统就是通过 GID 来区分用户组的,同用户名一样,组名也只是为了便于管理员记忆。
这里的组 GID 与 /etc/passwd 文件中第 4 个字段的 GID 相对应,实际上,/etc/passwd 文件中使用 GID 对应的群组名,就是通过此文件对应得到的。
组中的用户
此字段列出每个群组包含的所有用户。需要注意的是,如果该用户组是这个用户的初始组,则该用户不会写入这个字段,可以这么理解,该字段显示的用户都是这个用户组的附加用户。
每个用户都可以加入多个附加组,但是只能属于一个初始组。所以我们在实际工作中,如果需要把用户加入其他组,则需要以附加组的形式添加。例如,我们想让 kevin 也加入 root 这个群组,那么只需要在第一行的最后一个字段加入 kevin,即 root : x : 0 : kevin 就可以了。
/etc/gshadow
更多详情参考:http://c.biancheng.net/view/842.html
如:
kevin:!::
组名 组密码 组管理员 组中的附加用户 kevin !
/etc/passwd
文件存储用户基本信息,同时考虑到账户的安全性,将用户的密码信息存放另一个文件/etc/shadow
中。/etc/gshadow
文件也是如此,组用户信息存储在/etc/group
文件中,而将组用户的密码信息存储在/etc/gshadow
文件中。组名
同
/etc/group
文件中的组名相对应。组密码
对于大多数用户来说,通常不设置组密码,因此该字段常为空,但有时为 “!”,指的是该群组没有组密码,也不设有群组管理员。
组管理员
从系统管理员的角度来说,该文件最大的功能就是创建群组管理员。那么,什么是群组管理员呢?
考虑到 Linux 系统中账号太多,而超级管理员 root 可能比较忙碌,因此当有用户想要加入某群组时,root 或许不能及时作出回应。这种情况下,如果有群组管理员,那么他就能将用户加入自己管理的群组中,也就免去麻烦 root 了。
不过,由于目前有 sudo 之类的工具,因此群组管理员的这个功能已经很少使用了。
组中的附加用户
该字段显示这个用户组中有哪些附加用户,和 /etc/group 文件中附加组显示内容相同。
groupmod 用户组名
# 修改组名
groupmod -n 新组名 旧组名
groupmod -n newgroup oldgroup # 将 oldgroup 重命名为 newgroup
# 修改组id
groupmod -g 新组id 用户组名
groupmod -g 1004 testgroup
su # 切换用户
sudo # 以自己的身份执行其他用户身份的指令
之所以有这两种命令的区分,是因为su
的话,比如说su
默认切换为 root,就得暴露 root 的密码给这个普通用户,但事实上我只是想把 root 的部分命令临时给予这个普通用户执行而已,并不希望这个用户有机会为所欲为拥有所有命令的权限。
sudo
则能实现这种场景,不把 root 的密码暴露,不把 root 的所有权限给出去,而是让普通用户能临时用自己的身份来执行原本只有 root 身份才能执行的若干命令。
su # 切换为root
su 用户名 # 切换为该用户
su - # 切换为root,并将当前目录切换到/root,将login shell 切换为root的login shell(环境变量变为root的环境变量)
su - 用户名 # 切换为该用户,并将当前目录切换到该用户的家目录,将login shell 切换为该用户的login shell(环境变量变为该用户的环境变量)
visudo
# 或 vim /etc/sudoers
两者其实都是在编辑 /etc/sudoers
这个文件。
进入该文件后,可以看到很多以井号(#)开头的描述,以井号开头的就是被注释掉的样例说明,不会起作用。修改时,只需要在文件最下方开始添加设置即可。
修改完后保存退出即可,并不需要额外去重启终端,或者退出那个已经登录的用户重新登录,而是马上就能实现命令的授权或限制的。
# 命令格式:3个字段 用户(组) 主机=可执行命令 指定普通用户适用sudo时是否需要密码 # 用户(组): # 前面加百分号(%)是用户组,没有百分号,则是指用户 # 主机: # 本地登录(字符界面登录:localhost),有说法是讲本地的图形界面登录算远程,但实际测试,图形界面使用terminal还是可以通过localhost来设置的。 # 远程登录(远程的ssh登录) # ALL代表 “本地+远程” 的所有主机都适用 # 可执行命令: # ALL 为所有命令 # 多条命令用逗号隔开 # ----------------------------------------------------- # 样例: %testgroup localhost=/sbin/shutdown, /sbin/mount NOPASSWD:ALL # 不建议nopasswd 因为不安全。 即应该写成: %testgroup localhost=/sbin/shutdown 就可以了 # 注意,这里的shutdown支持了所有选项,如果想进一步限制,比如我只想让这个普通用户组使用shutdown -c,而不希望其使用其他选项,可以像下面这样写。 %testgroup localhost=/sbin/shutdown -c # 另外,如果是想实现同一个命令的多个选项,比如说shutdown的-c与-h,经过实验,并不能直接像下面这样写: %testgroup 172.29.6.111=/sbin/shutdown -ch 或 %testgroup ALL=/sbin/shutdown -c -h 而是需要写两条独立的命令 %testgroup ALL=/sbin/shutdown -c, /sbin/shutdown -h # 另外还支持对选项进行限制,比如说该用户只能控制10分钟后关机,不能20分钟,也不能是now,那么就这么写: %testgroup ALL=/sbin/shutdown -h 10
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。