Linux Shell基础与用户组管理实战指南 Linux Shell基础与用户/组管理详解从入门到实战本文基于课堂笔记整理涵盖 Shell 变量、环境变量、命令替换、引号使用以及 Linux 用户和组管理的完整操作适合初学者系统学习。一、Shell 基础1.1 变量定义与查看在 Linux Shell 中变量用于临时存储字符串值变量值保存在当前会话的内存中退出终端即丢失。命名规则只能包含字母、数字、下划线不能以数字开头变量类型通常不需要显式声明基本操作# 定义变量两种方式等价var1key1declarevar1key1# 引用变量使用 $echo$var1# 输出 key1# 拼接字符串first_namefacailast_namezhangecho$last_name$first_name# zhang facai# 使用花括号限定变量名范围避免歧义echo${last_name}_$first_name# zhang_facai# 查看当前 Shell 中所有变量含函数setset|grepfirst_name# 过滤查看# 取消变量unsetfirst_nameecho$first_name# 空关于空格和引号多个空格在输出时会被压缩为一个使用双引号可保留空格echo$first_name$last_name# zhang facai变量大小写转换declare特有declare-lnameJames# 转为小写echo$name# jamesdeclare-unameJames# 转为大写echo$name# JAMES1.2 环境变量环境变量是 Shell 内置的、用于控制运行环境的变量。常见的环境变量如下变量名作用EDITOR默认编辑器PATH命令搜索路径HOME当前用户家目录USER当前用户名PWD当前工作目录LANG系统语言PS1命令行提示符格式HISTTIMEFORMAT历史命令时间格式示例EDITORvisudo# 默认使用 vi无语法高亮exportEDITOR/bin/vim visudo# 现在使用 vim# 或临时指定EDITOR/bin/vim visudo示例LANGdate# 中文输出exportLANGen_US.utf8date# Mon Nov 7 13:38:55 CST 2022示例PATHecho$PATH# 误将 ls 移走导致命令找不到mv/usr/bin/ls.ls# 报错command not found# 恢复 PATH临时PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin# 将当前目录追加到 PATHexportPATH$PATH:/rootls# 现在可以用当前目录下的 ls示例PS1提示符echo$PS1# 查看当前提示符格式PS1[\u\h \W \t]\$ # 显示用户名、主机、当前目录、时间彩色提示符写入/etc/bashrc或~/.bashrcPS1[\[\e[91m\]\u\[\e[0m\]\[\e[93m\]\[\e[0m\]\[\e[92;1m\]\h\[\e[0m\]\[\e[94m\] \W\[\e[0m\] \[\e[35m\]\t\[\e[0m\]]\[\e[93m\]\$\[\e[0m\] 示例HISTTIMEFORMATexportHISTTIMEFORMAT%F %T history# 显示每条命令的执行时间1.3 变量持久化保存变量默认只在当前 Shell 生效若希望永久保存需写入配置文件。Login Shell 加载顺序如通过 SSH 登录/etc/profile系统级所有用户~/.bash_profile用户级~/.bashrc用户级/etc/bashrc系统级所有用户Non-login Shell 加载顺序如执行bash命令~/.bashrc/etc/bashrc# 系统级持久化echoexport LANGen_US.utf8/etc/profile# 用户级持久化echoexport EDITORvim~/.bashrc1.4 命令替换使用$(command)或反引号command将命令输出作为字符串。echoToday is$(date%A)echoThetimeis$(date%M)minutes past$(date%l%p).# 创建带日期的文件touchfile-$(date%Y%m%d)经典计算 12…100# 生成序列并替换空格为 echo{1..100}|tr # 交给 $[] 计算echo$[$(echo{1..100}|tr )]# 输出 50501.5 保留字符字面含义许多字符在 Shell 中有特殊含义如需原样输出可使用转义或引号。\取消后面单个字符的特殊含义双引号保留变量替换、命令替换和转义但压缩空格扩展单引号保留所有字符的字面含义不进行任何替换echo\$PATH# 输出 $PATHusernameXieBaiQiechoWelcome$usernameon$(date%F)# 正常替换echoWelcome $username on $(date %F)# 原样输出# 多行输入引号内可换行echohello 1 hello 2 hello 3hello.txt二、Linux 用户和组管理2.1 用户概念Linux 中的每个进程都以特定用户身份运行每个文件都有属主和属组。系统通过UIDUser ID唯一标识用户用户名为辅助标识。三种用户类型超级用户rootUID0拥有最高权限系统用户由系统服务使用通常 UID 1~999CentOS 7不能交互登录普通用户UID 1000日常操作使用2.2/etc/passwd文件每行代表一个用户冒号分隔 7 个字段name:password:UID:GID:GECOS:directory:shell示例xianyu:x:1000:1000:software admin:/home/xianyu:/bin/bashpassword实际密码加密后存在/etc/shadow这里用x占位GID用户主要组的 IDGECOS用户描述信息如全名directory用户家目录shell登录后执行的程序如/bin/bash系统用户通常为/sbin/nologin2.3/etc/group文件每行代表一个组冒号分隔 4 个字段group_name:password:GID:user_list示例wheel:x:10:xianyupassword组密码通常用x表示实际加密在/etc/gshadowuser_list属于该组的补充成员用逗号分隔主要组用户创建文件时的默认属组由/etc/passwd中的 GID 决定。补充组用户额外加入的组记录在/etc/group的user_list中。查看用户所属组idxianyu# uid1000(xianyu) gid1000(xianyu) groups1000(xianyu),10(wheel)2.4 用户管理命令whoami, who, w, userswhoami# 当前登录用户who# 所有登录会话w# 详细信息含负载、空闲时间users# 仅列出用户名useradd创建用户# 默认创建UID自动分配家目录 /home/用户名useradduser01# 指定选项useradd-u8888-d/opt/user02-cuser for software-gwheel-s/sbin/nologin user02# -u UID# -d 家目录# -c 描述信息# -g 主要组# -s 登录 shell# 创建无密码用户图形界面可直接登录useradd-ptom新用户家目录模板来自/etc/skel/创建时会复制其中的隐藏文件.bashrc等。默认创建参数配置在/etc/login.defs。usermod修改用户# 修改 UID、家目录、shellusermoduser02-u1008-md/home/user02-s/bin/bash# usermod 修改已存在用户的属性# user02 要修改的目标用户名# -u 1008 修改用户 UID 为 1008# -md /home/user02 -m (与 -d 搭配使用) 将原家目录内容移动到新目录并创建新家目录-d 指定新的家目录为 /home/user02# -s /bin/bash 修改用户登录后使用的默认 Shell 为 /bin/bash# 添加补充组-a 表示追加否则覆盖usermod-aGuser01 user02# usermod 修改已存在用户的属性# -aG user01 -a (append) 表示以“追加”的方式修改附加组-G 用于指定附加组附属组。两者结合意为把用户 user02 追加到附加组 user01 中注意如果只用 -G 会覆盖掉之前所有的附加组-aG 则是增加一个而不丢失原有的组iduser02userdel删除用户userdeluser03# 正常删除userdel-fuser02# 强制删除即使进程占用2.5 综合案例手动创建用户不借助useradd手动添加用户zhangsan编辑/etc/passwd添加一行zhangsan:x:1002:1002::/home/zhangsan:/bin/bash编辑/etc/group添加组zhangsan:x:1002:编辑/etc/shadow添加密码条目可复制其他用户的加密密码或使用openssl passwd生成准备家目录cp-r/etc/skel/ /home/zhangsanchown-Rzhangsan:zhangsan /home/zhangsan测试登录sshzhangsanlocalhost2.6 本地组管理groupaddgroupaddadmingroupaddsysadmin-g2000# 指定 GIDgroupmodgroupmod--new-name admins admin# 重命名groupmod-g2002admins# 修改 GIDgroupdelgroupdelsysadmingroupmems管理组成员# 添加成员groupmems-gadmins-axianyu# 列出成员groupmems-gadmins-l# 删除成员groupmems-gadmins-dxianyu# 清空所有成员groupmems-gadmins-p2.7 管理用户密码/etc/shadow文件每行 9 个字段冒号分隔login:encrypted_password:last_change:min:max:warn:inactive:expire:reservedlast_change上次修改日期距 1970-1-1 的天数min最小修改间隔天max最大有效期天warn过期前警告天数inactive过期后仍可使用的宽限天数expire账户绝对过期日期chage修改密码策略chage-lxianyu# 查看当前策略chage-M100xianyu# 最大有效期 100 天chage-m10xianyu# 最小间隔 10 天chage-d0xianyu# 强制下次登录改密码chage-E1970-1-1 xianyu# 账户过期锁定usermod 管理密码# 直接设置密码需用加密字符串可从 /etc/shadow 复制usermod-p$6$...xianyu# 删除密码空密码usermod-pxianyu# 锁定/解锁usermod-Llaowang# 锁定usermod-Ulaowang# 解锁# 限制 shellusermod-s/sbin/nologin laowangpasswd 相关passwd-dlaowang# 删除密码可无密码登录passwd-llaowang# 锁定同 usermod -Lpasswd-ulaowang# 解锁passwd-elaowang# 强制下次登录改密码2.8 常见故障模拟与解决情景1bash 提示符变为bash-4.2$原因/etc/bashrc被移动或损坏导致 PS1 未加载。解决mv/etc/bashrc{.ori,}# 恢复情景2用户家目录被误删登录时提示Could not chdir to home directory解决cp-r/etc/skel/ /home/zhangsanchown-Rzhangsan:zhangsan /home/zhangsan情景3家目录权限错误提示Permission denied或权限不够解决chmodurwx /home/zhangsanchown-Rzhangsan:zhangsan /home/zhangsan2.9 特殊技巧增加一个 UID0 的用户获得 root 权限方法一直接修改/etc/passwd将用户的 UID 改为 0方法二useradd-o-u0xianyu# -o 允许重复 UID此时 xianyu 与 root 共享 UID 0拥有 root 权限但仍是两个独立账户。三、课后练习自测变量命名规范有哪些如何定义和查看变量举例。环境变量PATH、PS1、LANG的作用是什么命令替换如何使用举例计算 1~100 的和。单引号、双引号、反斜杠的区别是什么/etc/passwd和/etc/group各包含哪些字段如何创建用户并指定 UID、家目录、描述信息、shell如何修改用户的主要组和补充组如何强制用户下次登录修改密码如何锁定用户手动创建用户需要修改哪几个文件如何准备家目录