Linux Shell 基础与用户组管理完全指南
2026/7/19 12:28:34 网站建设 项目流程

shell 基础

变量定义和查看

  1. Linux 使用变量临时存储字符串值,便于后续引用。变量值存储在当前会话内存中。

  2. 变量命名规范:

    • 变量名只能包含:字母、数字、下划线。
    • 变量名不能以数字开头。
    • shell 中变量的类型,一般不需要明确指明。
# 变量定义(简易写法)[zhuyy06@centos7 ~]$var1=key1# 标准格式如下[zhuyy06@centos7 ~]$declarevar1=key1# 使用$引用变量值[zhuyy06@centos7 ~]$echo$var1key1# 示例2[zhuyy06@centos7 ~]$first_name=facai[zhuyy06@centos7 ~]$last_name=zhang[zhuyy06@centos7 ~]$echo$last_name$first_namezhang facai# 空格分隔拼接,多空格自动压缩为单个空格[zhuyy06@centos7 ~]$echo$last_name$first_namezhang facai# 使用引号保留多个空格[zhuyy06@centos7 ~]$echo"$first_name$last_name"zhang facai# 可使用-连接[zhuyy06@centos7 ~]$echo$last_name-$first_namezhang-facai# 使用_连接会出现识别错误# Shell把 last_name_ 识别成完整变量,该变量不存在,取值为空[zhuyy06@centos7 ~]$echo$last_name_$first_namefacai# 使用{}限定变量范围[zhuyy06@centos7 ~]$echo${last_name}_$first_namezhang_facai# 当前shell中所有变量[zhuyy06@centos7 ~]$set# 搭配管道过滤,快速查找目标变量[zhuyy06@centos7 ~]$set|grepfirst_namefirst_name=facai# 取消变量定义[zhuyy06@centos7 ~]$unsetfirst_name# 再次打印变量,输出空值[zhuyy06@centos7 ~]$echo$first_name# declare可给变量增加属性,转换变量大小写# -l 小写属性:存入值自动转换为全小写[zhuyy06@centos7 ~]$declare-lname=James[zhuyy06@centos7 ~]$echo$namejames# -u 大写属性:存入值自动转换为全大写[zhuyy06@centos7 ~]$declare-uname=James[zhuyy06@centos7 ~]$echo$nameJAMES

⚠️等号左右不能加空格,否则会报错

环境变量

根据变量是否是用户定义:

  • shell 环境内置变量:设置shell的运行环境,全部大写命名,全局可读取。
  • 用户自定义变量:用户自己定义的变量,也就是普通变量,需export导出才可全局使用。

部分shell环境变量如下:

环境变量名作用
EDITOR默认编辑器
HISTFILE历史文件位置
HISTFILESIZE历史命令个数
HISTTIMEFORMAT历史命令时间格式
PS1命令行提示符
LANGshell 环境语言
PATH命令搜索路径
HOME当前用户家目录
USER当前用户
PWD当前 shell 路径

EDITOR

[root@centos7 ~]# visudo# 以上命令默认使用vi 编辑文件/etc/sudoers,不显示语法高亮[root@centos7 ~]# export EDITOR=/bin/vim# 或者[root@centos7 ~]# EDITOR=/bin/vim visudo# 以上命令使用vim 编辑文件/etc/sudoers,显示语法高亮

LANG

# 默认中文环境[root@centos7 ~]# date202211月 07日 星期一13:38:31 CST# 临时切换英文编码[root@centos7 ~]# export LANG=en_US.utf8[root@centos7 ~]# dateMon Nov713:38:55 CST2022# 切回简体中文[root@centos7 ~]# export LANG=zh_CN.utf8[root@centos7 ~]# date202211月 07日 星期一13:40:49 CST

常见 LANG代码:

  • 英语:en_US.utf8
  • 简体中文:zh_CN.utf8
  • 繁体中文:zh_TW.utf8

PATH

  • 执行命令时,bash 从左到右遍历PATH:分隔的目录,匹配到可执行文件即停止;若所有目录都找不到,提示command not found
# 查看PATH原始值[root@centos7 ~]# echo $PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin# 将ls命令移动到/root目录,/usr/bin中无ls[root@centos7 ~]# mv /usr/bin/ls .# PATH不含/root,找不到程序[root@centos7 ~]# lsbash: ls:commandnot found... Similarcommandis:'lz'[root@centos7 ~]# which lsaliasls='ls --color=auto'Similarcommandis:'lz'# 设置为原来的值[root@centos7 ~]# PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin# 将/root目录追加到PATH中[root@centos7 ~]# export PATH=$PATH:/root# 再次执行ls正常,系统在/root找到ls程序[root@centos7 ~]# lsanaconda-ks.cfg initial-setup-ks.cfgls[root@centos7 ~]# which lsaliasls='ls --color=auto'/root/ls# ls移动到原来位置[root@centos7 ~]# mv ./ls /usr/bin

PS1

[zhuyy06@centos7 ~]$echo$PS1[\u@\h\W]\$manbash搜索PROMPTING# 扩展说明:\h 主机名,第一个 `.' 之前的部分 \H 主机名 \n 新行符 \t 当前时间,采用 24小时制的 HH:MM:SS 格式 \T 当前时间,采用 12小时制的 HH:MM:SS 格式 \@ 当前时间,采用 12小时制上午/下午 (am/pm) 格式 \A 当前时间,采用 24小时制上午/下午格式 \u 当前用户的用户名 the username of the current user \w 当前工作目录 \W 当前工作目录的基本部分 \$ 如果有效 UID 是 0,就是 #, 其他情况下是 $ # 提示符变为了'HELLO' [zhuyy06@centos7 ~]$ PS1='HELLO' HELLO echo hello world hello world # 提示符带时间 [zhuyy06@centos7 ~]$ PS1='[\u@\h\W\t]\$' [zhuyy06@centos7 ~ 13:52:08]$ # 显示完整工作目录 [zhuyy06@centos7 ~ 13:52:08]$ PS1='[\u@\h\w\t]\$ '[zhuyy06@centos7 ~13:52:56]$cd/usr/share/doc[zhuyy06@centos7 /usr/share/doc13:53:04]$

彩色提示符

# 代码:# \[\e[0;30m\]:黑色# \[\e[0;31m\]:红色# \[\e[0;32m\]:绿色# \[\e[0;33m\]:黄色# \[\e[0;34m\]:蓝色# \[\e[0;35m\]:紫色# \[\e[0;36m\]:青色# \[\e[0;37m\]:白色# \[\e[0m\]:恢复默认颜色

示例:

# vim /etc/bashrc 文件末尾添加一行PS1='[\[\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\] '# 或者 echo 追加echo"PS1='[\[\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\] '">>/etc/bashrc# 注意 echo追加的PS1与直接vim的是不一致的,体现在\\\$。

HISTTIMEFORMAT

控制历史命令时间格式。通过设置该变量,可以在执行history命令时显示每条历史命令的执行时间。

常用配置示例

  1. 显示年月日时分秒(如2024-10-24 15:30:45):

    exportHISTTIMEFORMAT="%F %T "

    效果:history输出会类似1000 2024-10-24 15:30:45 ls -l

  2. 显示更简洁的时间格式(如10-24 15:30):

    exportHISTTIMEFORMAT="%m-%d %H:%M "

HISTTIMEFORMAT支持的常见时间格式符:

符号含义
%F完整日期(年 - 月 - 日,如2024-10-24
%T完整时间(时:分: 秒,如15:30:45
%Y四位年份(如2024
%m两位月份(01-12)
%d两位日期(01-31)
%H24 小时制小时(00-23)
%M分钟(00-59)
%S秒(00-59)

变量持久化保存

  • login shell 启动的时候,会按顺序加载以下配置文件中配置:
    1. /etc/profie,限定所有用户,设置操作系统级别。
    2. ~/.bash_profile,只限定特定用户
    3. ~/.bashrc,只限定特定用户
    4. /etc/bashrc,限定所有用户
  • nologin shell启动的时候,会按顺序加载以下配置文件中配置:
    1. ~/.bashrc,只限定特定用户,例如限定laoma用户 /home/laoma/.bashrc。
    2. /etc/bashrc,限定所有用户
# login shell 示例[root@centos7 ~]# echo 'export LANG=en_US.utf8' >> /etc/profile# 验证[c:\~]$sshzhuyy06@10.1.8.10 Connecting to10.1.8.10:22... Connection established. To escape tolocalshell, press'Ctrl+Alt+]'.Last login: Mon Nov714:19:572022from10.1.8.1[zhuyy06@centos7 ~]$dateMon Nov714:20:42 CST2022# nologin shell 示例[root@centos7 ~]# echo 'export EDITOR=vim' >> /etc/bashrc# 验证[zhuyy06@centos7 ~]$bash[zhuyy06@centos7 ~]$echo$EDITORvim

命令替换

格式如下:

  • $(COMMAND)
  • `COMMAND`

效果如下:

[zhuyy06@centos7 ~]$echoToday is`date+%A`[zhuyy06@centos7 ~]$echoThetimeis$(date+%M)minutes past$(date+%l%p).[zhuyy06@centos7 ~]$touchfile-$(date+%Y%m%d)# 或者[zhuyy06@centos7 ~]$touchfile-`date+%Y%m%d`[zhuyy06@centos7 ~]$lsfile-20221107

如何计算 1+2+…+99+100的值?

# 计算数值[zhuyy06@centos7 ~]$echo$[1+2+3]6# 获取序列[zhuyy06@centos7 ~]$echo{1..3}123# 替换空格为+号[zhuyy06@centos7 ~]$echo{1..3}|tr' ''+'1+2+3# 计算结果[zhuyy06@centos7 ~]$echo$[$(echo{1..100}|tr' ''+')]5050

保留字符字面含义

许多字符在bash中有特殊的意义,忽略这些含义,使用引号和转义字符。

  • \,取消后面单个字符的特殊含义。
  • 双引号(“”),压缩shell扩展含义,不压缩命令替换、变量替换和转义字符(\)。
  • 单引号(‘’),可以压缩单引号内部的所有字符含义。
# \ 示例[zhuyy06@centos7 ~]$echo$PATH/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/laoma/.local/bin:/home/laoma/bin[zhuyy06@centos7 ~]$echo\$PATH$PATH# "" 示例[zhuyy06@centos7 ~]$username=XieBaiQi[zhuyy06@centos7 ~]$echo******* Welcome$usernameto Linux Classroom On$(date+%F)******* 公共 模板 视频 图片 文档 下载 音乐 桌面 Welcome XieBaiQi to Linux Classroom On2025-07-23 公共 模板 视频 图片 文档 下载 音乐 桌面[zhuyy06@centos7 ~]$echo"******* Welcome$usernameto Linux Classroom On$(date+%F)*******"******* Welcome XieBaiQi to Linux Classroom On2025-07-23 *******# \和"" 示例[zhuyy06@centos7 ~]$echo"******* Welcome \$usernameto Linux Classroom On$(date+%F)*******"******* Welcome$usernameto Linux Classroom On2025-07-23 *******# '' 示例[zhuyy06@centos7 ~]$echo'******* Welcome $username to Linux Classroom On $(date +%F) *******'******* Welcome$usernameto Linux Classroom On$(date+%F)*******

思考:

# 下面命令的输出[zhuyy06@centos7 ~]$echo\\# 最终输出一个 \ 符号[zhuyy06@centos7 ~]$echo\\\# 最终输出一个 \ 符号# 下面命令的输出[zhuyy06@centos7 ~]$echo'Let\'s go' > 'Let\s go# 使用 echo 一次性在文件中输入多行字符串[zhuyy06@centos7 ~]$echo"hello 1 hello 2 hello 3">hello.txt[zhuyy06@centos7 ~]$cathello.txt hello1hello2hello3

课后练习

  1. 变量名规范。
  2. 变量如何定义和查看,举例说明。
  3. 如何扩展变量范围,举例说明。
  4. 解释以下环境变量作用,举例说明。
    • EDITOR
    • PS1
    • LANG
    • PATH
  5. 命令替换作用,举例说明。
  6. 解释以下符号作用,举例说明。
    • 转义符号(\)
    • 双引号(“”)
    • 单引号(‘’)

Linux 用户和组管理

用户和组介绍

用户介绍

用户帐户是系统安全的基础。 系统上的每个进程(运行程序)都以特定用户身份运行。 每个文件都有一个特定用户作为其所有者。 文件所有权有助于系统对文件用户实施访问控制。正在运行的进程关联的用户确定该进程可访问的文件和目录。用户使用username标识并使其更易于使用。在内部,系统通过分配给它们的唯一标识号,用户ID或UID来区分用户帐户。 如果用户使用用户帐户,则通常会为其分配一个密码,用户在登录时将使用该密码来证明他们是实际的授权用户。

用户帐户主要有三种类型:

  • superuser:用于管理系统,用户名称为root,UID为0,对系统具有完全访问权限。
  • system users:系统具有系统用户帐户,由提供支持服务的进程使用。 这些进程或守护进程通常不需要以超级用户身份运行。 它们是非特权帐户,用户保护自己文件和其他资源。系统用户帐户不用于交互方式登录系统。
  • regular users:大多数用户拥有常规用户帐户,用于日常工作。

passwd 文件

/etc/passwd文件保存操作系统登录用户信息。每行包含一个登录用户信息,以冒号分隔七个域。

格式:

name:password:UID:GID:GECOS:directory:shell

示例:

zhuyy06:x:1000:1000:software admin:/home/zhuyy06:/bin/bash

解释如下:

  • name:用户登录名

  • password:用户密码,以x表示

  • UID:用户ID

  • GID:用户主组ID

  • GECOS:用户描述信息,通常为用户的真实姓名

  • directory:用户主目录,启动shell时的工作目录,默认位于/home/username

  • shell:用户打开终端时运行的程序,默认是shell。

    对于system user,它的shell是/sbin/nologin。

    示例:

    [zhuyy06@centos7 ~]$greppostfix /etc/passwd postfix:x:89:89::/var/spool/postfix:/sbin/nologin

group 文件

**组是用户的集合,组中用户继承组权限。**与用户一样,组具有组名称以使其更易于使用。系统通过分配给它们的唯一标识号,组ID或GID来区分组。

/etc/group文件保存操作系统组信息。每行包含一个组信息,以冒号分隔4个域。格式:

group_name:password:GID:user_list

示例:

[zhuyy06@centos7 ~]$grepwheel /etc/group wheel:x:10:zhuyy06

解释如下:

  • group_name:组名称
  • password:组密码,用x表示
  • GID:组ID,唯一表示组
  • user_list:作为补充的成员

组的类型

  • 主要组:每个用户只有一个主要组,/etc/passwd 文件中的GID编号定义。 默认情况下,**用户创建的新文件组所有者为用户的主要组。**通常,在创建新的常规用户时,会创建一个与该用户同名的新组。该组用作新用户的主要组,该用户是此用户专用组的唯一成员,有助于简化文件权限管理。
  • 补充组:用户还可以拥有补充组。 补充组的成员资格由/etc/group文件确定。 根据用户的任何组是否具有访问权限,授予用户访问权限的权限。例如,如果用户user01具有主要组user01和补充组wheel和webadmin,则该用户可以读取这三个组中任何一个组可读的文件。
# 查看用户信息[zhuyy06@centos7 ~]$iduid=1000(zhuyy06)gid=1000(zhuyy06)groups=1000(zhuyy06),10(wheel)# 查看用户 uid[zhuyy06@centos7 ~]$id-uzhuyy061000

课后练习

  1. 哪一项表示在最基本的层面上标识用户的编号?
    a. 主要用户
    b. UID
    c. GID
    d. 用户名
  2. 哪一项表示提供用户命令行提示符的程序?
    a. 主 shell
    b. 主目录
    c. 登录 shell
    d. 命令名称
  3. 哪一项目或文件表示本地组信息的位置?
    a. 主目录
    b. /etc/passwd
    c. /etc/GID
    d. /etc/group
  4. 哪一项目或文件表示用户个人文件的位置?
    a. 主目录
    b. 登录 shell
    c. /etc/passwd
    d. /etc/group
  5. 哪一项表示在最基本的层面上标识组的编号?
    a. 主要组
    b. UID
    c. GID
    d. groupid
  6. 哪一项目或文件表示本地用户帐户信息的位置?
    a. 主目录
    b. /etc/passwd
    c. /etc/UID
    d. /etc/group
  7. /etc/passwd 文件的第四个字段是什么?
    a. 主目录
    b. UID
    c. 登录 shell
    d. 主要组

本地用户管理

whoami 命令

查看当前终端中登录的用户。

[root@centos7 ~]# whoamiroot

who 和 w 命令

查看当前系统中所有终端上登录的用户,以及用户登录的时间。

[zhuyy06@centos7 ~]$whoroot pts/0 Dec2208:43(10.1.8.1)zhuyy06 pts/1 Dec2209:23(10.1.8.1)zhuyy06 pts/2 Dec2209:07(10.1.8.1)[zhuyy06@centos7 ~]$ w 09:23:19 up1:10,3users, load average:0.00,0.01,0.05USERTTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/010.1.8.1 08:4339:270.06s0.06s-bashzhuyy06 pts/110.1.8.1 09:232.00s0.05s0.01s w zhuyy06 pts/210.1.8.1 09:077.00s0.05s0.05s-bash

users 命令

查看当前系统中所有终端上登录的用户名。

[root@centos7 ~]# userszhuyy06 zhuyy06 root

useradd 命令

作用:创建用户

# 用户1[root@centos7 ~]# useradd user01[root@centos7 ~]# grep user01 /etc/passwduser01:x:1003:1003::/home/user01:/bin/bash# 用户2[root@centos7 ~]# useradd -u 8888 -d /opt/user02 -c "user for software manage" -g wheel -s /sbin/nologin user02# -u uid# -d 用户的家目录# -c 描述信息# -g 用户的主组# -s 用户shell程序[root@centos7 ~]# grep user02 /etc/passwduser02:x:8888:10:userforsoftware manager:/opt/user02:/sbin/nologin[root@centos7 ~]# ls -d /opt/user02//opt/user02/# 创建一个没有密码的账户,该用户在图形化界面中可以直接登录[root@centos7 ~]# useradd -p '' tom

新用户家目录中的文件来源于/etc/skel/目录。

[root@centos7 ~]# ls -a ~tom....bash_logout .bash_profile .bashrc .mozilla[root@centos7 ~]# ls -a /etc/skel/....bash_logout .bash_profile .bashrc .mozilla

创建用户的时候,用户属性默认参数配置在/etc/login.defs文件。

[root@centos7 ~]# vim /etc/login.defsMAIL_DIR /var/spool/mail UMASK 022 HOME_MODE 0700 PASS_MAX_DAYS99999PASS_MIN_DAYS0PASS_MIN_LEN5PASS_WARN_AGE7# Min/max values for automatic uid selection in useraddUID_MIN1000UID_MAX60000# System accountsSYS_UID_MIN201SYS_UID_MAX999# Min/max values for automatic gid selection in groupaddGID_MIN1000GID_MAX60000# System accountsSYS_GID_MIN201SYS_GID_MAX999CREATE_HOMEyesUSERGROUPS_ENAByes...

usermod 命令

作用:修改用户属性。

[root@centos7 ~]# usermod user02 -u 1008 -md /home/user02 -s /bin/bash# -m 移动家目录到新的位置[root@centos7 ~]# grep user02 /etc/passwduser02:x:1008:10:userforsoftware manager:/home/user02:/bin/bash[root@centos7 ~]# ls -d /home/user02//home/user02/[root@centos7 ~]# su - user02Last login: Mon Nov717:08:58 CST2022on pts/2[user02@centos7 ~]$# 添加补充组,如果没有-a选项,则代表将补充组设置为user01,原先的补充组就被覆盖了。[root@centos7 ~]# usermod -aG user01 user02[root@centos7 ~]# id user02uid=1008(user02)gid=10(wheel)groups=10(wheel),1003(user01)

userdel 命令

# 正常删除[root@centos7 ~]# useradd user03[root@centos7 ~]# userdel user03# 强制删除[root@centos7 ~]# userdel user02userdel: user user02 is currently used by process9071[root@centos7 ~]# id user02uid=1008(user02)gid=10(wheel)groups=10(wheel),1003(user01)# 尽量不要强制删除,要找到无法删除的原因[root@centos7 ~]# userdel -f user02userdel: user user02 is currently used by process9071[root@centos7 ~]# id user02id: user02: no such user

课后作业

  1. 创建 operator1 用户
  2. 使用 id 验证 operator1 用户信息
  3. 查看 /etc/passwd 中对应条目
  4. 密码设置为 redhat
  5. 修改 operator1 用户uid为1088
  6. 修改 operator1 用户描述信息为"Operator One"
  7. 将 wheel 组作为补充组添加给 operator1 用户
  8. 查看 /etc/group 中对应条目
  9. 删除 operator1 用户

综合案例

手动创建一个用户
# 1 添加账户[root@centos7 ~]# vim /etc/passwd# 最后一行添加如下内容,注意uid要在原有的基础上增加1zhangsan:x:1002:1002::/home/zhangsan:/bin/bash# 2 添加组[root@centos7 ~]# vim /etc/group# 最后一行添加如下内容zhangsan:x:1002:# 3 添加密码[root@centos7 ~]# vim /etc/shadow# 最后一行添加如下内容zhangsan:$6$FgUNKn74yoEDbcXD$pxDk9AEhsxkJGYi76Rv91zLy5LRns8olgAyGuNssQYG07ypaidhuX0gHAU4hrNi9Zp9A7vtMEvbyzCQ0e/gbk1::0:99999:7:::# 4 准备家目录[root@centos7 ~]# cp -r /etc/skel/ /home/zhangsan# 修改zhangsan家目录所属有zhangsan用户和组[root@centos7 ~]# chown zhangsan:zhangsan /home/zhangsan[root@centos7 ~]# ll -d /home/zhangsandrwxr-xr-x.16zhangsan zhangsan409671914:00 zhangsan# 测试[root@centos7 ~]# ssh zhangsan@localhost
bash 提示符变为初始字符

提示符如下:bash-4.2$

模拟:

[root@centos7 ~]# mv /etc/bashrc{,.ori}[root@centos7 ~]# bashbash-4.2#

原因:nologin shell打开的时候执行/etc/bashrc配置。

恢复:

bash-4.2# mv /etc/bashrc{.ori,}bash-4.2# bash[root@centos7 ~]#
误删用户家目录

故障:

[root@centos7 ~]# ssh zhangsan@localhostzhangsan@localhost's password: Activate the web console with: systemctlenable--nowcockpit.socket Last login: Fri Jul1914:13:472024from ::1 Could not chdir to home directory /home/zhangsan: No suchfileor directory -bash-4.2$

模拟:

[root@centos7 ~]# rm -fr /home/zhangsan

解决

[root@centos7 ~]# cp -r /etc/skel/ /home/zhangsan[root@centos7 ~]# chown zhangsan:zhangsan /home/zhangsan
没有权限切换家目录

故障

Could not chdir to home directory /home/zhangsan: Permission denied -bash: /home/zhangsan/.bash_profile: 权限不够

模拟

[root@centos7 ~]# chmod u=- /home/zhangsan

解决

[root@centos7 ~]# chown -R zhangsan:zhangsan /home/zhangsan[root@centos7 ~]# chmod u=rwx /home/zhangsan[root@centos7 ~]# ll -d /home/zhangsandrwx------.3zhangsan zhangsan7871914:17 /home/zhangsan

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询