从“会敲命令”到“懂管理”:Linux用户权限与Shell变量实战手册

📅 2026/7/19 8:25:53
从“会敲命令”到“懂管理”:Linux用户权限与Shell变量实战手册
系统里这么多用户谁有权做什么为什么有的命令只能用root执行为什么我定义的变量换个终端就没了今天的内容正好回答这些问题。课程分两大部分用户和组管理——理解Linux的“身份系统”学会创建、修改、删除用户管理密码策略控制谁有权访问什么Shell变量深化——从变量定义到环境变量、命令替换、引号规则为后续Shell脚本编程打基础这两块内容有一个共同特点它们是Linux日常运维中使用频率最高的操作。学会它们你就从“命令执行者”变成了“系统管理者”。一、用户和组管理Linux的“身份系统”1.1 用户的三种类型Linux系统中有三种用户用户类型特点示例超级用户rootUID0拥有系统最高权限root系统用户UID1-999用于运行守护进程通常不允许登录postfix、sshd普通用户UID≥1000用于日常工作user、user01# 查看当前终端登录用户whoami# 查看所有登录用户whow# 更详细含负载、运行命令等# 只看用户名列表users1.2 /etc/passwd —— 用户账户数据库每行代表一个用户用冒号分隔7个字段name:password:UID:GID:GECOS:directory:shell示例user:x:1000:1000:software admin:/home/user:/bin/bash各字段含义name登录名passwordx表示密码存储在/etc/shadow中UID用户唯一IDGID用户主组IDGECOS用户描述信息通常为真实姓名directory用户主目录shell登录后默认执行的Shell程序⚠️注意系统用户的shell通常是/sbin/nologin表示该账户不能交互式登录。1.3 /etc/group —— 组账户数据库格式group_name:password:GID:user_list示例wheel:x:10:user字段说明group_name组名passwordx表示组密码存储在/etc/gshadowGID组唯一IDuser_list该组的补充成员列表用逗号分隔1.4 组的类型类型说明存储位置主要组每个用户只有一个新建文件默认归属此组/etc/passwd 的 GID 字段补充组用户可以属于多个用于扩展权限/etc/group 的 user_list 字段# 查看用户的所有组信息id# uid1000(user) gid1000(user) groups1000(user),10(wheel)# 只查看UIDid-uuser# 只查看GIDid-guser# 查看用户所属的所有组id-Guser二、用户管理实操2.1 useradd —— 创建用户# 最简单创建自动分配UID、家目录、同名的组useradduser01# 查看结果grepuser01 /etc/passwd# user01:x:1003:1003::/home/user01:/bin/bash# 带参数创建useradd-u8888-d/opt/user02-csoftware manager-gwheel-s/sbin/nologin user02# 参数说明# -u UID# -d 主目录路径# -c 描述信息GECOS# -g 主组# -s 登录Shell# -p 加密后的密码不推荐建议用passwd命令创建用户时发生了什么/etc/passwd、/etc/shadow、/etc/group增加记录创建用户主目录默认/home/username从/etc/skel/复制初始配置文件到主目录ls-a/etc/skel/# . .. .bash_logout .bash_profile .bashrc .mozilla默认配置来源/etc/login.defsvim/etc/login.defs# UID_MIN 1000 → 普通用户起始UID# UID_MAX 60000 → 普通用户最大UID# CREATE_HOME yes → 默认创建家目录2.2 usermod —— 修改用户属性# 修改UID并移动家目录usermod-u1008-md/home/user02 user02# -m 表示将原家目录内容移动到新位置# 添加补充组注意不加 -a 会覆盖原有补充组usermod-aGuser01 user02# 锁定用户禁止登录usermod-Llaowang# 解锁用户usermod-Ulaowang# 修改登录Shell禁止登录的经典方式usermod-s/sbin/nologin laowang# 设置账户过期时间usermod-e2024-07-18 laowang易错提示-aG才是追加单独-G是覆盖。-g是强制改变主组2.3 userdel —— 删除用户# 普通删除保留家目录userdeluser01# 强制删除即使正在登录userdel-fuser02# 删除用户并删除家目录和邮件池userdel-ruser032.4 综合案例手动创建一个用户# 1. 在 /etc/passwd 末尾添加用户记录echozhangsan:x:1002:1002::/home/zhangsan:/bin/bash/etc/passwd# 2. 在 /etc/group 末尾添加组记录echozhangsan:x:1002:/etc/group# 3. 在 /etc/shadow 末尾添加密码记录密文从别的用户复制echozhangsan:$6$...加密密码...::0:99999:7:::/etc/shadow# 4. 准备家目录cp-r/etc/skel/ /home/zhangsanchown-Rzhangsan:zhangsan /home/zhangsan# 5. 测试登录sshzhangsanlocalhost2.5 常见故障及修复故障现象原因解决方案Could not chdir to home directory家目录被删除cp -r /etc/skel /home/username 修改权限Permission denied家目录权限错误chown -R user:group /home/userchmod 700 /home/user提示符变成bash-4.2$/etc/bashrc缺失或损坏恢复/etc/bashrc文件三、组管理实操3.1 groupadd —— 创建组# 创建普通组groupaddadmin# 创建指定GID的组groupaddsysadmin-g20003.2 groupmod —— 修改组# 修改组名groupmod--new-name admins admin# 修改GIDgroupmod-g2002admins3.3 groupdel —— 删除组groupdelsysadmin3.4 groupmems —— 管理组成员# 添加成员到组groupmems-gadmins-auser# 列出组成员groupmems-gadmins-l# 从组中删除成员groupmems-gadmins-duser# 清空组中所有成员groupmems-gadmins-p补充四、用户密码管理4.1 /etc/shadow —— 密码数据库每行9个字段用冒号分隔login_name:password:last_change:min:max:warn:inactive:expire:reserved 用户名:密码哈希:最后修改日:最小间隔:最大间隔:警告期:失效期:保留字段字段说明login_name登录名password加密密码last_change上次密码修改距1970-1-1的天数min最小密码有效期天数max最大密码有效期天数warn过期前警告天数inactive过期后非活跃天数expire账户过期日期距1970-1-1天数许多用户的密码哈希字段是*或者!!密码哈希字段是 *表示该用户被锁定无法通过密码登录这些是系统服务账号bin、daemon、adm 等通常用于运行系统服务它们没有交互式登录权限这是安全设计密码哈希字段是 !!表示该用户没有设置密码且账号被锁定20648 是最后修改日从1970-01-01起的天数后面字段为空或默认值0:99999:7::: 等4.2 chage —— 修改密码策略# 查看密码策略chage-luser# 设置密码最大有效期100天chage-M100user# 设置最小有效期10天期间不能改密码chage-m10user# 强制下次登录改密码最常用chage-d0user# 锁定账户设置账户过期日期为过去chage-E1970-01-01 user4.3 密码管理命令对比命令作用示例passwd修改密码passwd userpasswd -d删除密码passwd -d userpasswd -l锁定用户passwd -l userpasswd -u解锁用户passwd -u userchage -d 0强制下次改密码chage -d 0 userusermod -L锁定用户usermod -L userusermod -U解锁用户usermod -U user五、Shell变量深化5.1 变量定义与引用复习深化# 变量名规则字母/数字/下划线不能数字开头# 定义变量等号两边不能有空格var1hello# 标准定义方式declarevar1hello# 引用变量使用$echo$var1echo${var1}_suffix# {}防止歧义# 查看所有变量set# 删除变量unsetvar1# 变量大小写转换declare-lnameJames# → jamesdeclare-unameJames# → JAMES5.2 环境变量系统预设变量作用PATH命令搜索路径HOME当前用户家目录USER当前用户名PWD当前工作目录LANG系统语言en_US.utf8/zh_CN.utf8PS1命令提示符格式EDITOR默认编辑器影响visudo等命令HISTTIMEFORMAT历史命令时间格式特别关注PATHecho$PATH# /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin# 临时追加PATHexportPATH$PATH:/my/custom/path# 注意如果把ls移走会出现什么mv/usr/bin/ls.ls# 报错command not found# 原因PATH中找不到ls了特别关注PS1# 查看当前提示符格式echo$PS1# [\u\h \W]\$# 常用符号# \u 用户名 \h 主机名 \w 完整路径 \W 当前目录 \t 时间 \$ 提示符# 彩色提示符颜色代码\e[颜色m# 30黑 31红 32绿 33黄 34蓝 35紫 36青 37白PS1[\[\e[32m\]\u\[\e[0m\]\h \W]\$ 特别关注HISTTIMEFORMAT# 让history显示执行时间exportHISTTIMEFORMAT%F %T history# 1000 2024-10-24 15:30:45 ls -l5.3 变量的持久化保存读取顺序Shell类型加载顺序按优先级Login Shell①/etc/profile→ ②~/.bash_profile→ ③~/.bashrc→ ④/etc/bashrcNon-Login Shell①~/.bashrc→ ②/etc/bashrc# 让所有用户永久生效 → /etc/profileechoexport LANGen_US.utf8/etc/profile# 只对当前用户永久生效 → ~/.bash_profile 或 ~/.bashrcechoexport EDITORvim~/.bashrcsource~/.bashrc# 立即生效5.4 命令替换命令替换是Shell中一种常用的功能用于将命令的输出结果作为值插入到命令行或赋值给变量。它允许在执行命令时动态获取结果并将其用于后续操作。# 两种写法等价$(COMMAND)COMMAND# 示例#假设我们执行的时间是 2026年7月18日星期六touchfile-$(date%Y%m%d)#生成一个名为file-20260718的文件echoToday isdate%A#输出Today is Saturday# 扩展计算1-100的和echo$[$(echo{1..100}|tr )]# 输出50505.5 引号与转义符号作用示例\转义单个字符echo \$PATH→ 输出$PATH保留变量替换和命令替换echo 今天是 $(date)保留所有字符原意echo $PATH→ 输出$PATHusernameJack# 无引号空格被压缩echoHello$username# Hello Jack多个空格变一个# 双引号保留空格$变量被替换echoHello$username# Hello Jack# 双引号转义$被转义不替换echoHello \$username# Hello $username# 单引号所有都保留原意echoHello $username# Hello $username5.6 其他Shell# 查看系统支持的所有Shellcat/etc/shells# /bin/sh# /bin/bash# /usr/bin/sh# /usr/bin/bash# 安装额外Shellyuminstall-ytmux# 终端复用器yuminstall-ytcsh# C Shell# tmux快捷键Ctrlb# c → 新建会话# 数字 → 切换到对应编号会话写在最后到今天为止我们已经学了四天Linux了。回头看看Day 1认识Linux装系统敲基本命令Day 2文件管理通配符批量操作Day 3查帮助Vim编辑器重定向与管道Day 4用户权限管理 Shell变量深化核心命令速查# 用户管理useradd|usermod|userdel|id|who|w|chage# 组管理groupadd|groupmod|groupdel|groupmems# 密码管理passwd|chage|usermod-L/-U/-s/-e# Shell变量declare|export|unset|set|echo$变量名# 配置文件/etc/passwd|/etc/shadow|/etc/group|/etc/login.defs|/etc/skel/