用户管理

6474 字
32 分钟
用户管理

用户管理#

[TOC]


01.开机启动流程#

📌 面试题:

  1. 开机BIOS自检

    1. 硬件是否有问题
    2. 磁盘、CPU、内存、主板、电源
    3. 下面有详细介绍
  2. MBR引导

    1. 引导系统启动磁盘
  3. GRUB引导菜单

    1. 选择进入的模式
    2. 选择内核
  4. 加载内核

  5. 启动运行systemd进程

    1. 第一个进程
  6. 读取init运行级别

    • 3 # 表示完全多用户模式、系统默认的模式
    • 5 # 表示桌面模式
  7. 系统初始化过程

    1. 网络
    2. 自动挂载
    3. 主机名
    4. 并行启动, 各种服务
    5. 定时任务、ssh服务…
  8. 运行getty, 显示登录界面

开机BIOS自检(检查硬件)#

服务器出问题最多的硬件:(想象成自己的笔记本)

  1. 磁盘

    (1)第一种情况:保质期内 一般是3年

    1. 联系服务器或者磁盘的售后人员 告诉他们我们公司、磁盘坏了几块、约他们一起去机房
    2. 约定时间明天下午2点半
    3. 约IDC机房、说我们xx公司明天下午2点半有几个人去换硬件 携带身份证

    (2)第二种情况:过保

    1. 问领导合作的厂家还是直接购买
    2. 自己约IDC机房
    3. 自己去自己更换
  2. 内存

    一般不会坏 开机无法正常启动、很多情况都是因为内存不兼容导致的 重新插拔内存、擦拭内存

    可能有一些灰尘, 和静电

  3. CPU

  4. 主板

  5. 电源


02.用户的分类#

🔐 UID 与权限等级说明#

用户类型UID 范围权限说明
root(管理员)0拥有系统的最高权限
系统/傀儡用户1 - 999这些是系统服务运行所需的用户
普通用户1000+由系统管理员创建的真实用户账户
  • 上面都是系统默认的用户ID范围, 但其实我们自己进行创建的时候可以随意创建
    • 我们创建普通用户的UID范围也可以是1-999
    • 自己创建虚拟用户UID是1000+也没问题

📌 /etc/passwd 详解#

passwd文件中以冒号分隔每列的含义

  • /etc/passwd # 用户信息
  • /etc/shadow # 密码文件
Terminal window
[root@oldboyedu ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
# 以冒号分隔,共7列

第一列:用户名称

第二列:密码用x展示

  • 真正的密码在/etc/shadow

第三列:用户的UID号

第四列:用户的小组的号GID

  • 组id没有什么意义
  • 见下面的详细解释

第五列:描述、可以没有

第六列:家目录的位置

第七列:命令解释器

  • /bin/bash 可以登录系统
  • /sbin/nologin 不允许登录操作系统的用户为虚拟用户

在Linux中,所属用户组,没什么意义,我们基本不动属组,我们动的最多的就是属主,主人对它有什么权限,那么这个文件就拥有什么权限 因为所属组和其他用户,往往权限一样,都是只读,只能看

在Linux系统中创建一个用户对应默认创建一个组 组的名称是以用户名命名的 比如创建了一个用户为oldboy、系统会自动创建oldboy命名一个小组,这个小组中只有一个用户,它是oldboy

📌 规范一点的创建用户流程就是: ① 创建属组,并指定组ID ② 创建用户,并指定它的用户ID,和组ID


03.创建用户#

useradd#

创建用户

语法结构:

useradd 参数选项 用户名称

参数选项:

参数含义
-u指定UID号码
-g指定GID号码
-s指定解释器,默认是/bin/bash,可以指定/sbin/nologin # 不能登录, 用于虚拟用户
-M不创建家目录 虚拟用户 不加-M默认创建家目录 /home/oldboy
-d指定创建家目录
-G添加附加组 了解,一个人属于多个组,没有意义!
⚠️ 每次只能创建1个用户

🌰 批量创建用户:

Terminal window
# awk输出方式
[root@oldboyedu ~]# echo test{01..10} | xargs -n1 | awk '{print "useradd "$1}'
useradd test01
useradd test02
# ...共10个
'批量生成useradd命令'
# sed后向引用方式
[root@oldboyedu ~]# echo test{01..10} | xargs -n1 | sed -nr 's#(.*)#useradd \1#gp'
useradd test01
useradd test02
# ...共10个
'sed后向引用同样可以实现'

普通用户创建#

案例.创建普通用户oldboy

  • uid和gid都是默认的
  • 默认uid和gid往后排
Terminal window
[root@oldboyedu ~]# useradd oldboy
# 创建普通用户,uid和gid自动分配

案例.创建用户test01指定uid为666,不指定gid则往后排

  • 我们企业中创建一般指定相同的uid和gid
Terminal window
[root@oldboyedu ~]# useradd -u666 test01
# 指定uid为666
[root@oldboyedu ~]# id test01
uid=666(test01) gid=1002(test01) groups=1002(test01)
# uid=666是我们指定的,gid=1002是自动往后排的
[root@oldboyedu ~]# grep test01 /etc/passwd
test01:x:666:1002::/home/test01:/bin/bash
# 确认passwd中的记录

这个用户有家目录,而且能够登录

同时指定-u -g#

案例.创建普通用户test02指定uid为777、gid为777

Terminal window
[root@oldboyedu ~]# useradd -u888 -g888 test02
useradd: group '888' does not exist
# ❌ 提示888这个小组是不存在的
# ⚠️ 指定-g参数、指定用户属于哪个小组、这个小组必须提前存在的
# 如果不指定-g参数、系统会默认创建一个小组
  • 这个小组只有它自己

/etc/group#

查看组名和对应的组id

  • 通常组名要和用户名保持一致
  • 所以我们通常先创建一个组,再去创建用户
  • 这样组id和用户id也保持一致
Terminal window
# 创建gid为888的小组名称叫test02
[root@oldboyedu ~]# groupadd -g888 test02
'这个组名也为test02'
# ✅ 组创建成功
# ⚠️ groupadd一次只能创建一个组
[root@oldboyedu ~]# useradd -u888 -g888 test02
# 现在可以成功创建了,因为888组已存在
[root@oldboyedu ~]# id test02
uid=888(test02) gid=888(test02) groups=888(test02)
# uid和gid都为我们指定的888
[root@oldboyedu ~]# grep test02 /etc/passwd
test02:x:888:888::/home/test02:/bin/bash
# passwd中确认uid和gid均为888

usermod#

修改用户信息 了解

Terminal window
usermod -c "New Name" 用户名 # 修改注释
usermod -u 2000 用户名 # 修改 uid
usermod -g 999 用户名 # 修改 gid
usermod -L 用户名 # 锁定账户
usermod -U 用户名 # 解锁账户

选项同上,很少用.在创建用户的时候,我们就能够创建好了

  • 不如直接userdel -r 删了,重新创建一个
  • -M 家目录信息,没有办法进行修改! 创建了就是创建了
Terminal window
[root@oldboyedu ~]# tail -4 /etc/passwd
test01:x:666:1002::/home/test01:/bin/bash
test02:x:888:888::/home/test02:/bin/bash
test03:x:1002:1003::/home/test03:/sbin/nologin
test04:x:778:778::/home/test04:/sbin/nologin
# 当前4个用户
[root@oldboyedu ~]# usermod -c hehe test04
# 修改test04的描述信息为hehe
[root@oldboyedu ~]# tail -4 /etc/passwd
test01:x:666:1002::/home/test01:/bin/bash
test02:x:888:888::/home/test02:/bin/bash
test03:x:1002:1003::/home/test03:/sbin/nologin
test04:x:778:778:hehe:/home/test04:/sbin/nologin
# 第5列出现了hehe
[root@oldboyedu ~]# usermod -s /bin/bash test04
# 修改test04的登录shell为/bin/bash
[root@oldboyedu ~]# tail -4 /etc/passwd
test01:x:666:1002::/home/test01:/bin/bash
test02:x:888:888::/home/test02:/bin/bash
test03:x:1002:1003::/home/test03:/sbin/nologin
test04:x:778:778:hehe:/home/test04:/bin/bash
# 第7列变成了/bin/bash,可以登录了

虚拟用户创建#

  • 无法登陆 -s /sbin/nologin
  • 没有家目录 -M

案例.创建一个虚拟用户test03

Terminal window
[root@oldboyedu ~]# useradd -s /sbin/nologin -M test03
'没有指定组id也没有指定用户id'
[root@oldboyedu ~]# id test03
uid=1002(test03) gid=1003(test03) groups=1003(test03)
# uid和gid自动分配
[root@oldboyedu ~]# grep test03 /etc/passwd
test03:x:1002:1003::/home/test03:/sbin/nologin
# 虽然显示/home/test03, 但实际/home路径下没有test03这个目录
'因为-M不创建家目录'

案例.指定uid和gid为778的虚拟用户test04

Terminal window
[root@oldboyedu ~]# groupadd -g778 test04
# 先创建组,gid=778
[root@oldboyedu ~]# useradd -u778 -g778 -s /sbin/nologin -M test04
# 相比上面无非是多了组id和用户id
'因为指定了组id, 所以需要先去创建这个组'
[root@oldboyedu ~]# id test04
uid=778(test04) gid=778(test04) groups=778(test04)
[root@oldboyedu ~]# grep test04 /etc/passwd
test04:x:778:778::/home/test04:/sbin/nologin
# uid和gid均为778

标准创建(企业版)#

(1)创建组ID

为了后面用户可以指定组ID

Terminal window
groupadd -g 199 www
# -g GID:指定组的数字ID(Group ID)
# 组名:要创建的用户组名称

(2)查看组信息

Terminal window
cat /etc/group | grep [groupname]
# 或
getent group [groupname]

(3)创建虚拟用户并指定用户id和组id

  • 这里指定的是组名,原理是一样的

这样当我们创建用户的时候, 就可以指定组名了

Terminal window
useradd -u 199 -g www -s /sbin/nologin -M www
# 作用:创建名为www的系统用户(通常用于服务运行,如 Nginx/Apache)
# -u:指定用户的 UID(用户唯一标识),这里设置为199(需确保未被占用)
# -g:指定用户的属组为www(必须是已存在的组,所以先执行groupadd)
# ⚠️ 指定的 GID 必须是已存在的组 ID,否则会报错
# -g是指定主组,若要添加附加组,需用-G选项(同样支持组名或 GID)
# -s:指定用户的登录 Shell,/sbin/nologin表示禁止该用户登录系统(仅作为服务运行身份)
# -M:不创建用户的家目录(默认会生成/home/www,此选项用于系统用户节省空间)
# www:要创建的用户名
# 删除该用户
userdel -r www # -r选项会删除家目录和邮箱文件

(4)验证

删除用户#

语法结构:

userdel -r 用户名称 # 删除用户所有相关的信息

⚠️ -r选项会删除家目录和邮箱文件

案例.删除test01用户

Terminal window
[root@oldboyedu ~]# userdel -r test01
# 没有任何提示就是删除成功了

案例.删除test03虚拟用户

Terminal window
[root@oldboyedu ~]# userdel -r test03
userdel: test03 home directory (/home/test03) not found
# 虚拟用户, 没有家目录,提示找不到家目录!

04.用户相关命令#

查询用户相关命令

Terminal window
[root@Rocky ~]# getent
getent: wrong number of arguments
Try `getent --help' or `getent --usage' for more information.
[root@Rocky ~]# getent passwd
root:x:0:0:Super User:/root:/bin/bash
bin:x:1:1:bin:/bin:/usr/sbin/nologin
daemon:x:2:2:daemon:/sbin:/usr/sbin/nologin
adm:x:3:4:adm:/var/adm:/usr/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/usr/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/usr/sbin/nologin
operator:x:11:0:operator:/root:/usr/sbin/nologin
games:x:12:100:games:/usr/games:/usr/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/usr/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/usr/sbin/nologin
tss:x:59:59:Account used for TPM access:/:/usr/sbin/nologin
systemd-oom:x:999:999:systemd Userspace OOM Killer:/:/sbin/nologin
dbus:x:81:81:System Message Bus:/:/usr/sbin/nologin
sssd:x:998:998:User for sssd:/run/sssd/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/usr/share/empty.sshd:/usr/sbin/nologin
chrony:x:997:997:chrony system user:/var/lib/chrony:/sbin/nologin
systemd-coredump:x:996:996:systemd Core Dumper:/:/usr/sbin/nologin
nginx:x:995:995:nginx user:/var/cache/nginx:/sbin/nologin
www:x:888:888::/home/www:/sbin/nologin
[root@Rocky ~]# getent group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
mem:x:8:
kmem:x:9:
wheel:x:10:
cdrom:x:11:
mail:x:12:
man:x:15:
dialout:x:18:
floppy:x:19:
games:x:20:
tape:x:33:
video:x:39:
ftp:x:50:
lock:x:54:
audio:x:63:
users:x:100:
clock:x:103:
nobody:x:65534:
tss:x:59:
utmp:x:22:
utempter:x:35:
systemd-oom:x:999:
input:x:104:
kvm:x:36:
render:x:105:
sgx:x:106:
systemd-journal:x:190:
dbus:x:81:
sssd:x:998:
sshd:x:74:
chrony:x:997:
systemd-coredump:x:996:
nginx:x:995:
www:x:888:

chown#

chown 是 “change owner” 的缩写 owner = 主人 chown 命令用于更改文件或目录的属主(owner)和属组(group)

chmod 是 “change mode” 的缩写 mode = 权限模式 chmod 命令用于更改文件或目录的权限模式(mode)

语法结构:

chown oldboy:oldboy 1.txt
  • 只有root管理员可以使用这个命令
  • -R 递归修改所有目录和文件的属主属组

案例.使用root用户在/home/oldboy家里面创建a.txt

Terminal window
# 第一步:root创建文件
[root@oldboyedu ~]# touch /home/oldboy/a.txt
[root@oldboyedu ~]# ll /home/oldboy/a.txt
-rw-r--r-- 1 root root 0 Nov 12 15:28 /home/oldboy/a.txt
# 属主属组都是root
# 第二步:使用oldboy登录用户测试写入
[oldboy@oldboyedu ~]$ echo abc >> a.txt
-bash: a.txt: Permission denied
# ❌ 权限拒绝!oldboy不是文件属主
# 第三步:将a.txt属主和属组修改为oldboy
[root@oldboyedu ~]# chown oldboy:oldboy /home/oldboy/a.txt
[root@oldboyedu ~]# ll /home/oldboy/a.txt
-rw-r--r-- 1 oldboy oldboy 7 Nov 12 15:30 /home/oldboy/a.txt
# ✅ 现在属主属组都是oldboy
# 第四步:再次测试通过oldboy用户修改a.txt
[oldboy@oldboyedu ~]$ echo abc >> a.txt
[oldboy@oldboyedu ~]$ cat a.txt
aaaaaa
abc
# ✅ 写入成功!

案例.修改目录及目录下所有目录及文件属主属组为oldboy

Terminal window
[root@oldboyedu ~]# chown -R oldboy:oldboy /data/
# -R 递归修改
[root@oldboyedu ~]# ll /data/
total 4
-rw-r--r-- 1 oldboy oldboy 4 Nov 12 14:56 1.txt
drwxr-xr-x 2 oldboy oldboy 23 Nov 12 14:56 bbs
drwxr-xr-x 2 oldboy oldboy 6 Nov 12 14:56 blog
drwxr-xr-x 2 oldboy oldboy 20 Nov 12 14:57 www
# ✅ 目录和文件都是oldboy了

id 用户名#

查看用户名ID 和组ID

Terminal window
[root@oldboyedu ~]# id oldboy
uid=1001(oldboy) gid=1001(oldboy) groups=1001(oldboy)
# 只创建了这个用户,系统会自动创建oldboy命名一个小组
'这个小组中只有一个用户,它是oldboy'

查看passwd中oldboy用户的信息

Terminal window
[root@oldboyedu ~]# grep oldboy /etc/passwd
oldboy:x:1001:1001::/home/oldboy:/bin/bash

id查看不存在的用户

Terminal window
[root@test ~]# id hhh
id: hhh: no such user
# 这个用户不存在

whoami#

查看当前用户的名字

  • 也可以获取当前的用户名
Terminal window
[root@test ~]# whoami
root
[heima@test ~]$ whoami
heima

w#

  • 也可以用来查看负载
  • w的第一行等于uptime命令
  • 查询谁登陆了系统,并且正在干啥
  • tty终端是本地登录, pts是远程连接
  • -bash表示没事干,空闲,没有执行命令
  • pts/0 远程第一个用户

Terminal window
[heima@test ~]$ w
w: 52 column window is too narrow
# 窗口太小,展示不开!

Kylin v10版

  • 没有FROM
    • 我们可以用last或者lastlog去查看

last#

  • 查看远程用户的来源IP地址
  • 登录时间, 退出时间, 总共运行的时间
  • 每登录一次, 就会重新记录
    • lastlog是每个用户的最后登录时间
      • 先把每个用户列出来,再显示最后的登录时间

云服务器案例#

  • 我们都是在公司去远程连接服务器
  • 通过NAT技术,将我们的私网,转换为公网IP
  • 假设我们公司的公网ip为1.2.3.4
  • 我们在远程服务器上last查看来源IP地址就是1.2.3.4
  • 如果出现别的IP地址11.22.33.44 那么就肯定是异常登录

  • 未来操作的云服务器
  • 这个FROM源IP就是自己当前位置的公网

本地服务器案例#

  • 通过vmnet8,连接我们的虚拟机
  • 我们在自己电脑上操作,就是10.0.0.1也就是Vmnet8这张网卡的IP地址

查看出口公网IP#

(1)Windows查看出口公网IP地址:百度输入ip回车

(2)Linux查看出口公网IP地址:curl ip.sb 或者 curl cip.cc

  • 如果我在我的阿里云服务器上查看,当然是不同的了

lastlog#

  • 显示每个用户最后登录的时间
    • 先把每个用户列出来,再显示最后的登录时间
  • last是每登陆一次, 就进行记录
  • lastlog没有登出时间


05.切换提权#

/etc/skel/#

所有新用户的家目录模版

📌 创建用户的流程:

(1)使用命令useradd oldboy用户

(2)系统创建家目录/home/oldboy

(3)系统会将/etc/skel目录下隐藏文件复制一份到/home/oldboy目录下

(4)将移动过去的文件属主属组修改为oldboy

故障复现:

  • 然后执行rm -rf /*

  • 或者可以执行rm -rf ./.*

-bash-4.2$#

  • 这个报错,以前的Centos会有吧!
  • 我现在是复现不出来了,可能做了补丁

恢复方法:

这个故障的主要原因就是, 你把自己家目录的隐藏文件都删除了,特别是那两个环境变量

  • .bashrc
  • .bash_profile
    • PS1命令提示符不能用了
    • 命令能用, 就是显示的不舒服罢了

每个用户的家目录下都有上面那两个变量文件,如果误删了两个文件从/etc/skel/目录下拷贝过来!

  • 需root权限
  • cp /etc/skel/.* /home/oldboy/
  • 隐藏文件都出现了说明都恢复好了

👑 切换用户(su)#

语法结构:

su - 用户名称
  • - 更新路径、更新变量
  • root切换普通用户不需要密码
  • 普通用户切换到root需要密码
  • 普通用户切换到普通用户需要密码(如果不设置密码无法切换)
  • 当你创建完用户后,别忘记设置密码
    • 虚拟用户除外, 它不用登录
Terminal window
su - 用户名 -c "command"
# 以目标用户执行单条命令后返回
'无需密码!!'
# 用于快速验证用户权限
[root@Rocky10 ~]# id alice
uid=1001(alice) gid=1002(alice) groups=1002(alice),1001(dev)
[root@Rocky10 ~]# su - alice -c "touch ~/test.sh"
# 以alice身份执行touch命令

案例.root用户切换普通用户test01

Terminal window
[root@oldboyedu ~]# su - test01
Last login: Wed Nov 12 10:47:05 CST 2025 from 10.0.0.1 on pts/1
# 切换普通用户不需要密码
[test01@oldboyedu ~]$
# $开头 = 普通用户

案例.test01切换到test02

Terminal window
[test01@oldboyedu ~]$ su - test02
Password:
# 需要test02的密码

案例.test01用户切换root用户

Terminal window
[test01@oldboyedu ~]$ su - root
Password:
# 需要root的密码

案例.当前的test01是由root用户切换过来的、我们还可以直接退回到root用户

Terminal window
[test01@oldboyedu ~]$ exit
logout
[root@oldboyedu ~]#
# #开头 = root用户

  • exit是一层一层的进行退出的
Terminal window
[root@oldboyedu ~]# su - test01
Last login: Wed Nov 12 11:19:00 CST 2025 on pts/0
[test01@oldboyedu ~]$ su - test02
Password:
Last login: Wed Nov 12 10:32:06 CST 2025 on pts/0
[test02@oldboyedu ~]$
[test02@oldboyedu ~]$ su - root
Password:
Last login: Wed Nov 12 09:35:30 CST 2025 from 10.0.0.1 on pts/0
[root@oldboyedu ~]#
[root@oldboyedu ~]# exit
logout
# 退到test02
[test02@oldboyedu ~]$ exit
logout
# 退到test01
[test01@oldboyedu ~]$ exit
logout
# 退到root
[root@oldboyedu ~]#
'一层一层退出'

📌 企业中使用用户的方式

(1)以自己的账号登录系统 zhangsan

(2)使用su方式切换到root管理系统

(3)部分公司直接用root管理系统、管理业务(不推荐使用)

sudo提权#

企业中登录系统都使用普通用户登录! 只有运维有root的权限

工作过程中开发人员偶尔可能会用一些命令 但他们是普通用户,处处受限,这些命令只有在家目录拥有权限

从而出现了sudo提权功能!

  • 以管理员root身份运行
  • sudo创建的文件中属主是root
  • 这条命令成为了root执行的了

需求:开发人员使用cat命令查看系统日志!

创建用户

Terminal window
[root@oldboyedu ~]# useradd oldboy
[root@oldboyedu ~]# echo test123.com|passwd --stdin oldboy
Changing password for user oldboy.
passwd: all authentication tokens updated successfully.
# ✅ 用户创建并设置密码

第一步: 打开两个窗口

第一个窗口:root登录

Terminal window
[root@oldboyedu ~]#

第二个窗口:oldboy登录

普通用户

Terminal window
[root@oldboyedu ~]# su - oldboy
Last login: Thu Nov 13 09:06:00 CST 2025 on pts/0
[oldboy@oldboyedu ~]$

第二步: oldboy普通用户执行cat命令查看日志

Terminal window
[oldboy@oldboyedu ~]$ cat /var/log/messages
cat: /var/log/messages: Permission denied
# ❌ 现在oldboy用户还没有cat命令的root权限
# 只能在自己的家目录玩耍

sudo -l#

普通用户查看是否拥有sudo权限

Terminal window
[oldboy@oldboyedu ~]$ sudo -l
[sudo] password for oldboy: # 输入oldboy的密码
Sorry, user oldboy may not run sudo on oldboy.
# ❌ 这里我们没有设置oldboy的sudo权限

第三步: 给oldboy用户进行授权

  • 切管理员root登录

查看cat的绝对路径

Terminal window
[root@oldboyedu ~]# which cat
/usr/bin/cat
# /bin/cat 也是可以的
Terminal window
[root@oldboyedu ~]# visudo
# 有语法检测功能
# 只有配置正确才能让你出来
# 推荐使用visudo
# 实际相当于编辑的就是/etc/sudoers

或者使用 vim /etc/sudoers 编辑完成保存退出

...
用户名 不动它 命令位置(which查看)
oldboy ALL=(ALL) /usr/bin/cat

下面有详细的授权方式介绍!

Terminal window
# visudo -c可以进行校验,编辑的是否正确!!
[root@localhost ~]# visudo -c
/etc/sudoers: parsed OK
# ✅ 校验通过!

第四步: 切换oldboy普通用户

查看拥有sudo权限

Terminal window
[oldboy@oldboyedu ~]$ sudo -l
[sudo] password for oldboy: # 输入oldboy的密码
User oldboy may run the following commands on oldboyedu:
(ALL) /usr/bin/cat # 拥有一个cat命令的root权限
# ✅ sudo权限已生效
[oldboy@oldboyedu ~]$ sudo cat /var/log/messages
# ✅ 使用sudo命令执行cat
# 别忘了加sudo
'oldboy用户以管理员身份运行'

visudo授权方式#

(1)授权单个命令

oldboy ALL=(ALL) /usr/bin/cat

(2)授权多个命令

逗号隔开

oldboy ALL=(ALL) /usr/bin/cat,/usr/bin/touch

(3)授权所有命令

oldboy ALL=(ALL) ALL
Terminal window
# 当oldboy用户获得所有权限后, sudo su - 就相当于管理员root执行 su -
# oldboy用户通过sudo提权方式执行su命令 切换root
[oldboy@oldboyedu ~]$ sudo su -
Last login: Thu Nov 13 09:48:26 CST 2025 on pts/1
[root@oldboyedu ~]#
# ✅ 以root身份登录

(4)普通用户使用sudo相关命令时不需要输入个人密码

oldboy ALL=(ALL) NOPASSWD: ALL

NOPASSWD和命令部分是连在一起的!!!

(5)对ALL进行取反

oldboy ALL=(ALL) NOPASSWD: ALL,!/usr/bin/su,!/usr/bin/vim

!取反 ,逗号进行多个命令分割 所有命令都能执行,但su不能执行,vim不能执行


06.密码管理#

交互式修改密码#

语法格式:

passwd
  • 直接回车 修改当前登录用户的密码
passwd 用户名
  • 指定修改哪个用户的密码
  • 只有root管理员才能指定用户
Terminal window
passwd -l 用户名 # 锁定账户(Lock)
passwd -u 用户名 # 解锁账户(Unlock)
passwd -d 用户名 # 删除密码(无密码登录,危险)

案例.修改root的密码

Terminal window
[root@oldboyedu ~]# passwd
Changing password for user root.
New password: # 输入的是test123.com
Retype new password: # 再输入一次密码 test123.com
passwd: all authentication tokens updated successfully.
# ✅ 密码更新修改成功

案例.修改test01用户的密码为oldboy123.com

Terminal window
[root@oldboyedu ~]# passwd test01
# 指定修改某个用户的密码
Changing password for user test01.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
# ✅ 密码修改成功

常见修改密码的报错信息

Terminal window
[root@oldboy ~]# passwd oldboy
Changing password for user oldboy.
New password:
BAD PASSWORD: The password is shorter than 8 characters
passwd: Authentication token manipulation error
# ❌ 密码太短,少于8个字符
[root@oldboy ~]# passwd oldboy
Changing password for user oldboy.
New password: oldboy123.com # 包含用户名oldboy
BAD PASSWORD: The password contains the user name in some form
passwd: Authentication token manipulation error
# ❌ 密码包含用户名

🧣 非交互式#

语法结构:

echo '密码' | passwd --stdin 用户名
  • 这个密码尽量用单引号包括起来
  • 必须掌握这种方式
  • 原样输出

案例.修改用户test01的密码为test123.com

Terminal window
[root@oldboyedu ~]# echo 'test123.com' | passwd --stdin test01
# 并不包含用户名test01
Changing password for user test01.
passwd: all authentication tokens updated successfully.
# ✅ 非交互式修改密码成功

❗chage#

Terminal window
# 查看当前策略
chage -l 用户名
# 设置策略
chage -M 90 用户名 # 密码最长有效期(天)
chage -m 7 用户名 # 密码最短有效期(天,防止频繁修改)
chage -W 7 用户名 # 密码过期前警告天数(Warning)
chage -I 30 用户名 # 密码过期后宽限天数(-1 表示无限制)
chage -d 0 用户名 # 强制下次登录修改密码
# 可以用于强制下次登录修改密码!!!
'看这个强制修改密码的!!!'
# 密码策略要求:密码最长有效期90天,提前7天警告,过期后30天内仍可登录
[root@localhost ~]# id lisi
uid=1002(lisi) gid=1501(developers) groups=1501(developers)
[root@localhost home]# tail -1 /etc/passwd
lisi:x:1002:1501::/home/lisi:/bin/bash
[root@localhost home]# chage -M 90 -W 7 -I 30 lisi
# 设置lisi用户的密码策略
[root@localhost home]# chage -l lisi
Last password change : Mar 04, 2026
Password expires : Jun 02, 2026
Password inactive : Jul 02, 2026
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 90
Number of days of warning before password expires : 7
# ✅ 策略已生效:最长90天,提前7天警告,过期后30天宽限

Xshell会话#

Xshell已经保存了我们的用户名和密码了

  • 保存在Windows本地
  • 只要把会话发给你
  • 黏贴到自己目录下
  • 你的会话就有了这些东西了
C:\Users\LENOVO\Documents\NetSarang Computer\6\Xshell\Sessions
复制它们
发给宿主机B
黏贴到主机B的相同位置
主机B就有了一样的会话了
双击打开就能使用了
无需用户名和密码!

复杂密码设置#

(1)要求复杂度

(公网服务器)

  • 通过命令行设置复杂密码
I*<>a{m]|`li!z@h%e$-n+ya<.+I?am_18

手动设置一个非常难的密码

Terminal window
[root@oldboyedu ~]# echo 'I*<>a{m]|`li!z@h%e$-n+ya<.+I?am_18' | passwd --stdin test02
# 通过echo管道设置复杂密码
  • 通过命令生成
pwgen#
Terminal window
[root@oldboyedu ~]# yum -y install pwgen
[root@oldboyedu ~]# pwgen -s -y 18 1
v&GpUjeT0,"/mD[LLz
# ✅ -s:生成安全(secure)的随机密码
# ✅ -y:包含至少一个特殊字符(symbols)
# ✅ 18:密码长度为 18 个字符
# ✅ 1:只生成 1 个密码
  • 通过工具生成

⚠️ 生成一个复杂的密码 不要太复杂,你的Xshell不识别!!!

(2)密码管理工具

(公司通过文档、LDAP)

🧣 MD5校验#

  • 根据文件内容生成特定的MD5值
  • 内容变化则MD5会变

语法格式:

md5sum 文件名
md5sum -c 校验文件
  • OK 匹配成功
  • FAILED 匹配失败
md5sum --quiet 校验文件

同理如果我修改了一处地方,那么肯定验证不通过.—quiet 只显示错误的部分

Terminal window
[root@oldboyedu ~]# echo aa > 1.txt
[root@oldboyedu ~]# md5sum 1.txt
d404401c8c6495b206fc35c95e55a6d5 1.txt
[root@oldboyedu ~]# md5sum 1.txt
d404401c8c6495b206fc35c95e55a6d5 1.txt
# 没有改变内容,MD5值没有发生改变
[root@oldboyedu ~]# echo bb >> 1.txt
# 修改文件内容
[root@oldboyedu ~]# md5sum 1.txt
9e0186db9525655612e39dd2921b4e8a 1.txt
# 改变内容后,MD5值发生改变

-c校验#

Terminal window
[root@oldboyedu ~]# md5sum 1.txt > md5.log
# 将生成md5结果放到md5.log中
[root@oldboyedu ~]# cat md5.log
9e0186db9525655612e39dd2921b4e8a 1.txt
[root@oldboyedu ~]# md5sum -c md5.log
1.txt: OK
# ✅ 直接使用命令检查文件是否被修改
[root@oldboyedu ~]# echo cc >> 1.txt
# 模拟修改文件内容
[root@oldboyedu ~]# md5sum -c md5.log
1.txt: FAILED
md5sum: WARNING: 1 computed checksum did NOT match
# ❌ 再重新检测文件是否被修改

(1)先去找log文件中的原文件1.txt 重新生成一个MD5值

(2)拿这个值和log文件中的MD5值作对比

一定能找到这个原文件1.txt吗???

因为当前目录下有这个1.txt自然是能找到的,如果换个新的目录就不一定能找到了!

  • 认识到相对路径的局限性!
  • 可能找不到原文件, 也无法重新生成MD5值
    • 自然也无法校验
  • 把md5值写入校验文件时
    • 主要是这个原文件1.txt, 使用绝对路径
Terminal window
[root@oldboyedu ~]# md5sum /root/1.txt > /opt/md5.log
# ✅ 使用绝对路径!
[root@oldboyedu ~]# cat /opt/md5.log
91ab632491c73ba1e0414196f9f98f63 /root/1.txt
# 记录的是绝对路径
[root@oldboyedu ~]# md5sum -c /opt/md5.log
/root/1.txt: OK
# 当前目录下校验,OK
[root@oldboyedu ~]# cd /tmp/
[root@oldboyedu tmp]# md5sum -c /opt/md5.log
/root/1.txt: OK
# 切换到其他目录再校验,仍然OK!
# ✅ 使用绝对路径后,无论在哪里都能找到原文件

综合案例#

将/data目录下所有的文件做md5值写入到/opt/md5.log

准备环境

Terminal window
[root@oldboyedu ~]# mkdir -p ./data/{www,blog,bbs}
[root@oldboyedu ~]# tree ./data/
/data/
├── bbs
├── blog
└── www
3 directories, 0 files
[root@oldboyedu ~]# echo 123 > ./data/1.txt
[root@oldboyedu ~]# echo www.oldoy.com > ./data/bbs/index.txt
[root@oldboyedu ~]# echo www.oldoy.com > ./data/www/1.html
[root@oldboyedu ~]# tree ./data/
./data/
├── 1.txt
├── bbs
└── index.txt
├── blog
└── www
└── 1.html
# ✅ 环境准备完毕

第一步: 给所有的文件做md5值

Terminal window
[root@oldboyedu ~]# find /home/data -type f | xargs md5sum
59e6650d2b2466dc854193d138dc1831 /home/data/www/1.html
59e6650d2b2466dc854193d138dc1831 /home/data/bbs/index.txt
ba1f2511fc30423bdbb183fe33f3dd0f /home/data/1.txt
# find 找的时候一定要使用绝对路径 /home/data
# 这样找到的文件就会自动带上这个前缀了

第二步: 写入到文件中

Terminal window
[root@oldboyedu ~]# find /home/data -type f | xargs md5sum > /opt/md5.log
# 覆盖写入

第三步: 检测

Terminal window
[root@oldboy home]# md5sum -c /opt/md5.log
/home/data/www/1.html: OK
/home/data/bbs/index.txt: OK
/home/data/1.txt: OK
# ✅ 全部校验通过

第四步: 模拟篡改

Terminal window
[root@oldboyedu ~]# echo aaa >> /home/data/www/1.html
# 模拟修改文件
[root@oldboyedu ~]# md5sum -c /opt/md5.log
/home/data/www/1.html: FAILED
/home/data/bbs/index.txt: OK
/home/data/1.txt: OK
md5sum: WARNING: 1 computed checksum did NOT match
# ❌ 被篡改的1.html校验失败,其他文件正常

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

用户管理
https://www.kpyun.fun/posts/basics/core/core14/
作者
久棹
发布于
2025-08-13
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
久棹
只要胆子大,天天寒暑假!
公告
欢迎来到久棹的技术小站!本站专注 Linux 运维学习笔记分享,如有问题欢迎交流探讨 🎉
分类
标签
站点统计
文章
98
分类
11
标签
203
总字数
244,453
运行时长
0
最后活动
0 天前
站点信息
构建平台
Local
博客版本
Firefly v6.13.5
文章许可
CC BY-NC-SA 4.0

文章目录