顿悟时刻|Shell + 用户组管理通关

Shell 基础

变量定义和查看

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

变量名只能包含:字母、数字、下划线。变量名不能以数字开头。

shell中变量的类型,一般不需要明确指明。

# 变量定义 [deng@centos7 ~ 19:04:32]$ var1=key1 # 标准格式如下 [deng@centos7 ~ 19:05:17]$ declare var1=key1 # 使用$引用变量值 [deng@centos7 ~ 19:05:44]$ echo $var1 key1 # 示例2 [deng@centos7 ~ 19:06:23]$ first_name=facai [deng@centos7 ~ 19:06:58]$ last_name=zhang [deng@centos7 ~ 19:07:35]$ echo $last_name $first_name zhang facai # 使用多个空格,效果一样 [deng@centos7 ~ 19:08:12]$ echo $last_name $first_name zhang facai # 使用引号保留多个空格 [deng@centos7 ~ 19:08:47]$ echo "$first_name $last_name" zhang facai [deng@centos7 ~ 19:09:33]$ echo $last_name-$first_name zhang-facai [deng@centos7 ~ 19:10:08]$ echo $last_name_$first_name facai # 使用{}限定变量范围 [deng@centos7 ~ 19:10:45]$ echo ${last_name}_$first_name zhang_facai # 当前shell中所有变量 [deng@centos7 ~ 19:11:22]$ set # set命令还会显示函数 [deng@centos7 ~ 19:12:05]$ set | grep first_name first_name=facai # 取消变量定义 [deng@centos7 ~ 19:12:47]$ unset first_name [deng@centos7 ~ 19:13:23]$ echo $first_name # 定义变量时候,转换变量大小写 [deng@centos7 ~ 19:14:05]$ declare -l name=James [deng@centos7 ~ 19:14:38]$ echo $name james [deng@centos7 ~ 19:15:12]$ declare -u name=James [deng@centos7 ~ 19:15:47]$ echo $name JAMES

环境变量

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

  • shell 环境内置变量:设置shell的运行环境。

  • 用户自定义变量:字面意思,用户自己定义的变量,也就是普通变量。

部分shell环境变量如下:

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

完整的shell 环境变量参考bash(1)。

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 ~]# date 2026年 07月 17日 星期五 19:16:32 CST [root@centos7 ~]# export LANG=en_US.utf8 [root@centos7 ~]# date Fri Jul 17 19:16:55 CST 2026 [root@centos7 ~]# export LANG=zh_CN.utf8 [root@centos7 ~]# date 2026年 07月 17日 星期五 19:17:18 CST

常见 LANG代码:

  • 英语:en_US.utf8

  • 简体中文:zh_CN.utf8

  • 繁体中文:zh_TW.utf8

PATH

[root@centos7 ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin [root@centos7 ~]# mv /usr/bin/ls . [root@centos7 ~]# ls bash: ls: command not found... Similar command is: 'lz' [root@centos7 ~]# which ls alias ls='ls --color=auto' Similar command is: 'lz' # 设置为原来的值 [root@centos7 ~]# PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin # 将/root目录追加到PATH中 [root@centos7 ~]# export PATH=$PATH:/root [root@centos7 ~]# ls anaconda-ks.cfg initial-setup-ks.cfg ls [root@centos7 ~]# which ls alias ls='ls --color=auto' /root/ls # ls移动到原来位置 [root@centos7 ~]# mv ./ls /usr/bin

PS1

[deng@centos7 ~ 19:17:55]$ echo $PS1 [\u@\h \W]\$ man bash 搜索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 ' [deng@centos7 ~ 19:18:32]$ PS1='HELLO ' HELLO echo hello world hello world # 提示符带时间 [deng@centos7 ~ 19:19:17]$ PS1='[\u@\h \W \t]\$ ' [deng@centos7 ~ 19:19:25]$ # 显示完整工作目录 [deng@centos7 ~ 19:19:42]$ PS1='[\u@\h \w \t]\$ ' [deng@centos7 ~ 19:20:05]$ cd /usr/share/doc [deng@centos7 /usr/share/doc 19:20:18]$

彩色提示符

# 代码: # \[\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):

bash export HISTTIMEFORMAT="%F %T "

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

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

bash export HISTTIMEFORMAT="%m-%d %H:%M "

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

  • %F:完整日期(年 - 月 - 日,如2024-10-24

  • %T:完整时间(时:分: 秒,如15:30:45

  • %Y:四位年份(如2024

  • %m:两位月份(01-12)

  • %d:两位日期(01-31)

  • %H:24 小时制小时(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:\~]$ ssh deng@10.1.8.88 Connecting to 10.1.8.88:22... Connection established. To escape to local shell, press 'Ctrl+Alt+]'. Last login: Fri Jul 17 14:19:57 2026 from 10.1.8.1 [deng@centos7 ~ 19:25:44]$ date Fri Jul 17 19:26:32 CST 2026 # nologin shell 示例 [root@centos7 ~]# echo 'export EDITOR=vim' >> /etc/bashrc # 验证 [deng@centos7 ~ 19:27:17]$ bash [deng@centos7 ~ 19:27:35]$ echo $EDITOR vim

命令替换

格式如下:

  • $(COMMAND)

  • `COMMAND`

效果如下:

[deng@centos7 ~ 19:28:55]$ echo Today is `date +%A` [deng@centos7 ~ 19:29:32]$ echo The time is $(date +%M) minutes past $(date +%l%p). [deng@centos7 ~ 19:30:47]$ touch file-$(date +%Y%m%d) # 或者 [deng@centos7 ~ 19:31:25]$ touch file-`date +%Y%m%d` [deng@centos7 ~ 19:32:08]$ ls file-20260717

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

# 计算数值 [deng@centos7 ~ 19:33:22]$ echo $[ 1+2+3 ] 6 # 获取序列 [deng@centos7 ~ 19:34:08]$ echo {1..3} 1 2 3 # 替换空格为+号 [deng@centos7 ~ 19:34:52]$ echo {1..3} | tr ' ' '+' 1+2+3 # 计算结果 [deng@centos7 ~ 19:35:33]$ echo $[ $(echo {1..100} | tr ' ' '+') ] 5050

保留字符字面含义

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

  • **,取消后面单个字符的特殊含义。

  • 双引号(“”),压缩shell扩展含义,不压缩命令替换、变量替换和转义字符(**** )。

  • 单引号(‘’),可以压缩单引号内部的所有字符含义。

# \ 示例 [deng@centos7 ~ 19:36:55]$ echo $PATH /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/deng/.local/bin:/home/deng/bin [deng@centos7 ~ 19:37:42]$ echo \$PATH $PATH # "" 示例 [deng@centos7 ~ 19:38:25]$ username=XieBaiQi [deng@centos7 ~ 19:39:08]$ echo ******* Welcome $username to Linux Classroom On $(date +%F) ******* 公共 模板 视频 图片 文档 下载 音乐 桌面 Welcome XieBaiQi to Linux Classroom On 2025-07-23 公共 模板 视频 图片 文档 下载 音乐 桌面 [deng@centos7 ~ 19:39:52]$ echo "******* Welcome $username to Linux Classroom On $(date +%F) *******" ******* Welcome XieBaiQi to Linux Classroom On 2025-07-23 ******* # \和"" 示例 [deng@centos7 ~ 19:40:37]$ echo "******* Welcome \$username to Linux Classroom On $(date +%F) *******" ******* Welcome $username to Linux Classroom On 2025-07-23 ******* # '' 示例 [deng@centos7 ~ 19:41:22]$ echo '******* Welcome $username to Linux Classroom On $(date +%F) *******' ******* Welcome $username to Linux Classroom On $(date +%F) *******

思考:

# 下面命令的输出 [deng@centos7 ~ 19:42:38]$ echo \\ # 最终输出一个 \ 符号 [deng@centos7 ~ 19:43:17]$ echo \\\ # 最终输出一个 \ 符号 # 下面命令的输出 [deng@centos7 ~ 19:44:05]$ echo 'Let\'s go' > ' Let\s go # 使用 echo 一次性在文件中输入多行字符串 [deng@centos7 ~ 19:45:22]$ echo "hello 1 hello 2 hello 3"> hello.txt [deng@centos7 ~ 19:46:08]$ cat hello.txt hello 1 hello 2 hello 3

Linux 用户和组管理

用户和组介绍

用户介绍

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

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

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

passwd 文件

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

格式:

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

示例:

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

解释如下:

  • name:用户登录名
  • password:用户密码,以x表示
  • UID:用户ID
  • GID:用户主组ID
  • GECOS:用户描述信息,通常为用户的真实姓名
  • directory:用户主目录,启动shell时的工作目录,默认位于/home/username
  • shell:用户打开终端时运行的程序,默认是shell。

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

示例:

[deng@centos7 ~ 19:47:22]$ grep postfix /etc/passwd postfix:x:89:89::/var/spool/postfix:/sbin/nologin

group 文件

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

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

group_name:password:GID:user_list

示例:

[deng@centos7 ~ 19:48:35]$ grep wheel /etc/group wheel:x:10:deng

解释如下:

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

组的类型

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

本地用户管理

whoami 命令

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

[root@centos7 ~]# whoami root

who 和 w 命令

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

[deng@centos7 ~ 19:51:45]$ who root pts/0 Jul 17 08:43 (10.1.8.1) deng pts/1 Jul 17 09:23 (10.1.8.1) deng pts/2 Jul 17 09:07 (10.1.8.1) [deng@centos7 ~ 19:52:17]$ w 09:23:19 up 1:10, 3 users, load average: 0.00, 0.01, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 10.1.8.1 08:43 39:27 0.06s 0.06s -bash deng pts/1 10.1.8.1 09:23 2.00s 0.05s 0.01s w deng pts/2 10.1.8.1 09:07 7.00s 0.05s 0.05s -bash

users 命令

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

[root@centos7 ~]# users deng deng root

useradd 命令

作用:创建用户

# 用户1 [root@centos7 ~]# useradd user01 [root@centos7 ~]# grep user01 /etc/passwd user01: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/passwd user02:x:8888:10:user for software 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.defs MAIL_DIR /var/spool/mail UMASK 022 HOME_MODE 0700 PASS_MAX_DAYS 99999 PASS_MIN_DAYS 0 PASS_MIN_LEN 5 PASS_WARN_AGE 7 # Min/max values for automatic uid selection in useradd UID_MIN 1000 UID_MAX 60000 # System accounts SYS_UID_MIN 201 SYS_UID_MAX 999 # Min/max values for automatic gid selection in groupadd GID_MIN 1000 GID_MAX 60000 # System accounts SYS_GID_MIN 201 SYS_GID_MAX 999 CREATE_HOME yes USERGROUPS_ENAB yes ...

usermod 命令

作用:修改用户属性。

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

userdel 命令

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

课后练习

  1. 创建 operator1 用户

    [root@centos7 ~]# useradd iperator1
  2. 使用 id 验证 operator1 用户信息

    [root@centos7 ~]#id operator1
  3. 查看 /etc/passwd 中对应条目

    [root@centos7 ~]# grep operator1 /etc/passwd
  4. 密码设置为 redhat

    [root@centos7 ~]#passwd operator1
  5. 修改 operator1 用户uid为1088

    [root@centos7 ~]#usermod -u 1088 iperator1
  6. 修改 operator1 用户描述信息为"Operator One"

    [root@centos7 ~]usermod-c"Operator One"iperator1
  7. 将 wheel 组作为补充组添加给 operator1 用户

    [root@centos7 ~]usermod-aGwheel operator
  8. 查看 /etc/group 中对应条目

    [root@centos7 ~]grep operator1 /etc/group
  9. 删除 operator1 用户

    [root@centos7 ~]userdel-riperator1