Linux基础知识


MD原文档下载:百度网盘

一、Linux相关概念

Linux是一个开源的操作系统内核

1. 主流服务器发行版

**RHEL系:**RHEL,Rocky

**Debian系:**Ubuntu

**信创系:**KylinOS(银河麒麟),openEuler

GNU项目和GPL协议(通用公共许可证)

2. 操作系统层级

顶层: 应用程序

GNU 工具链(操作系统自带应用程序)

内核 (调取资源(驱动) | 对资源进行管理)

底层: 物理硬件

3. CPU的状态:

  • 用户态
  • 内核态: 执行特权代码需要使用内核调用硬件

CPU的状态切换会产生性能损耗

4. 内存的分区

  • 用户空间

  • 内核空间

    内核缓冲区是内核空间的一块内存区域

二、使用虚拟机安装操作系统

1.使用VMware手动最小安装rocky 10

1.1 安装虚拟化软件Vmware Workstation

官方下载地址(需要登录)
使用默认选项安装

1.2 创建虚拟机

文件 - 新建虚拟机 - 自定义 - 硬件兼容性(默认)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.3 在虚拟机上安装rocky10

获取镜像文件:官方下载
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
至此rocky 10操作系统的虚拟机安装完成

2. 使用VMware手动最小安装Ubuntu 24.04

2.1 安装虚拟化软件和创建虚拟机

同Rocky,仅选择的系统版本不同

在这里插入图片描述

2.2 安装Ubuntu

镜像获取:官方下载

注意选择LTS(长期支持版),这里选择24.04.4
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
至此,Ubuntu 24.04.4服务器版安装完成

三、命令行:Shell与终端

当使用远程连接工具连接服务器后,输入命令的窗口叫终端(Terminal)

Shell负责解释用户输入的命令并执行

真正执行任务的是操作系统内核

四、远程连接服务器

推荐工具:XSHELL

WindTerm

1. XSHELL

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. WindTerm

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、系统初始化

1. Rocky 10

1.1 更改网卡名称为传统的eth0命名格式
cat net_name.sh
#!/bin/bash

# 修改网卡名称为eth0格式
grubby --update-kernel=ALL --args="net.ifnames=0 biosdevname=0"
grub2-editenv - unset kernelopts

# 判断 UEFI 或 BIOS 并更新 grub 配置
ls /boot/efi/EFI/rocky/grub.cfg >/dev/null 2>&1
if [ $? -eq 0 ]; then
    grub2-mkconfig -o /boot/efi/EFI/rocky/grub.cfg
else
    grub2-mkconfig -o /boot/grub2/grub.cfg
fi

# 强制重建 initramfs 内核镜像(必须)
dracut --force

reboot

bash net_name.sh
1.2 初始化服务器

注意:需要提前在XSHELL-工具-用户密码管理者-生产密钥对,然后将脚本中的公钥替换

cat rocky10_chushihua.sh
#!/bin/bash

if [ $# -ne 1 ]; then
    echo "用法: $0 <主机名后缀>"
    exit 1
fi

HOSTNAME=rocky-$1
TIMEZONE=Asia/Shanghai
IP=10.0.0.$1
SUBMASK=24
GATEWAY=10.0.0.2
DNS1=223.5.5.5
DNS2=114.114.114.114

# 关闭默认的防火墙策略和Selinux
systemctl disable --now firewalld
setenforce 0
sed -Ei.bak 's/^(SELINUX=).*/\1disabled/' /etc/selinux/config

# 配置yum源
mkdir -p /etc/yum.repos.d/backup >/dev/null 2>&1
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup
cat >  /etc/yum.repos.d/dnf-aliyun.repo << 'EOF'
[BaseOS]
name=BaseOS
baseurl=https://mirrors.aliyun.com/rockylinux/$releasever/BaseOS/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-$releasever

[AppStream]
name=AppStream
baseurl=https://mirrors.aliyun.com/rockylinux/$releasever/AppStream/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-$releasever

[CRB]
name=CRB
baseurl=https://mirrors.aliyun.com/rockylinux/$releasever/CRB/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-$releasever

[extras]
name=extras
baseurl=https://mirrors.aliyun.com/rockylinux/$releasever/extras/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-$releasever

[epel]
name=epel
baseurl=https://mirrors.aliyun.com/epel/$releasever/Everything/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-$releasever
EOF

dnf clean all
dnf makecache
wait

# 安装常用软件包
dnf install -y vim bash-completion iptables tree lrzsz chrony rsync

# 美化终端提示符(永久生效)
echo "PS1='\[\033[1;36m\][\u@\h \t \w]\\$\[\033[0m\]'" >> ~/.bashrc && source ~/.bashrc

# 配置时间同步服务器
sed -Ei.bak -e '/^pool/s/^/#/' -e '/^#pool/apool cn.pool.ntp.org iburst' /etc/chrony.conf && systemctl restart chronyd

# 修改主机名和时区
hostnamectl set-hostname $HOSTNAME
echo "$IP $HOSTNAME" >> /etc/hosts
timedatectl set-timezone $TIMEZONE

# 配置静态 IP
nmcli c modify eth0 \
ipv4.method manual \
ipv4.addresses $IP/$SUBMASK \
ipv4.gateway $GATEWAY \
ipv4.dns "$DNS1 $DNS2" \
autoconnect yes

# 配置XSHELL key验证,注意需要使用哪个用户登录就写入对应用户的家目录下authorized_keys文件
mkdir /root/.ssh -m 700
cat > /root/.ssh/authorized_keys <<EOF
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICacy2k2oMDWzhko6Yr7r5Pi9j1Cggx2jzA3kLVBcKer work # XHSELL公钥
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAm3egpgnwA82/27WwziiQvxnDQeZwr8DkMFzi7QureH home # XHSELL公钥
EOF
chmod 600 /root/.ssh/authorized_keys

# 执行脚本,后方跟需要配置的静态IP
bash rocky10_chushihua.sh 210

脚本执行后XSHELL需要重新配置,修改主机名为静态IP,用户身份保留登录用户名,无需密码,方法选择Pulib Key,点击Pulib Key-设置,密钥文件选择前面手动生成的私钥,即可实现基于key远程连接服务器

VMware可使用快照功能将该状态备份,方便测试结束恢复干净环境

2. ubuntu 24.04

cat ubuntu24.04_chushihua.sh
#!/bin/bash

if [ $# -ne 1 ]; then
    echo "用法: $0 <主机名后缀>"
    exit 1
fi

HOSTNAME=ubuntu-$1
TIMEZONE=Asia/Shanghai
IP=10.0.0.$1
SUBMASK=24
GATEWAY=10.0.0.2
DNS1=223.5.5.5
DNS2=114.114.114.114

# 安装常用工具
apt update && apt install -y bash-completion iptables tree lrzsz chrony network-manager vim wget curl rsync iputils-ping net-tools psmisc tcpdump rsyslog telnet netcat-openbsd

# 美化终端提示符(永久生效)
echo "PS1='\[\033[1;36m\][\u@\h \t \w]\\$\[\033[0m\]'" >> ~/.bashrc && source ~/.bashrc

# 配置时间同步服务器
sed -Ei.bak -e '/^pool/s/^/#/' -e '/^#pool/a#server 10.0.0.210 iburst\npool cn.pool.ntp.org iburst' /etc/chrony/chrony.conf && systemctl restart chronyd

# 修改主机名和时区
hostnamectl set-hostname $HOSTNAME
echo "$IP $HOSTNAME" >> /etc/hosts
timedatectl set-timezone $TIMEZONE

# 开启root登录(生产环境不建议开启)并配置key验证
echo root:123456 | chpasswd #配置root用户密码
sed -i.bak '/PermitRootLogin prohibit-password/s/.*/PermitRootLogin yes/' /etc/ssh/sshd_config
mkdir /root/.ssh -m 700
cat > /root/.ssh/authorized_keys <<EOF
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICacy2k2oMDWzhko6Yr7r5Pi9j1Cggx2jzA3kLVBcKer deng@work
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAm3egpgnwA82/27WwziiQvxnDQeZwr8DkMFzi7QureH deng@home
EOF
chmod 600 /root/.ssh/authorized_keys

# 修改网卡名称为eth0格式
sed -i.bak '/^GRUB_CMDLINE_LINUX=/s#"$#net.ifnames=0"#' /etc/default/grub
grub-mkconfig -o /boot/grub/grub.cfg

# 创建网卡配置文件
rm -rf /etc/netplan/*
cat > /etc/netplan/99_config.yaml <<EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      addresses:
        - $IP/$SUBMASK
      routes:
        - to: default
          via: $GATEWAY
      nameservers:
          addresses: 
            - $DNS1
            - $DNS2
EOF

# 提示重启
echo "==== 初始化完成 ===="
echo "当前主机名: $(hostname)"
echo "apt 源已切换为阿里云"
echo "网卡名称修改 + 静态IP配置完成!"
echo "IP:$IP"
echo "系统将在 3 秒后重启生效……"
echo "====================================="
sleep 3
reboot

sudo bash ubuntu24.04_chushihua.sh 240

六、Linux 文件管理基础

1. Linux文件系统(FHS标准)

1.1 常见位置及用途
/boot 启动Linux系统所需的核心文件
/etc 程序配置文件
/var 日志文件,缓存目录,邮件目录
	/var/log 日志目录
	/var/tmp 缓存目录,30天未访问的文件自动删除
/root 超级管理员的主目录
      只有root用户可以访问
/home 普通用户家目录的父目录,存储个人数据和配置文件
	  创建需要创建家目录的普通用户,未指定家目录默认在该目录下创建与用户名相同的家目录
	  只有root用户和用户本身可以访问
/tmp 临时文件目录,10天未访问的文件自动删除
/usr 用户安装软件目录
	/usr/bin 用户命令目录
	/usr/sbin 系统管理员命令目录
	/usr/local 第三方软件安装目录
	/usr/src 内核源代码默认存储目录
/proc 虚拟目录,是系统内存的映射,保存系统运行时的一些信息
/sys 虚拟目录,内核信息,硬件驱动相关信息
/run 程序运行时的数据目录,如进程PID,锁定文件,此目录在启动时自动创建,与/var/run是同一目录
/dev 外部设备
	/dev/null 黑洞目录,存入数据全部丢失
/bin 存储普通用户可执行的程序或命令
	 软链接指向/usr/bin
/sbin 存储管理员可执行的程序或命令
	  软链接指向/usr/sbin
/srv 服务启动后访问的数据目录
/lib和/lib64 动态链接库
			软链接指向/usr/lib和/usr/lib64
/mnt 临时挂载点
/media U盘和光驱的挂载目录
/opt 第三方软件保存目录
1.2 终端文件颜色显示意义
蓝色 目录
白色 文件
浅蓝色 链接
绿色 可执行程序
红色 压缩文件
黄色 设备
红色闪烁 链接不可用
1.3 ls -l 判断文件类型

ls-l 命令输出结果第一个字符可以判断文件类型

      ls -l -d /boot
      dr-xr-xr-x.   5   root root  4096 Jul 14 16:25 boot
#     ↑    ↑        ↑     ↑   ↑     ↑        ↑        ↑
# 文件类型 权限   硬链接数 属主 属组 文件大小 修改时间   文件名

常见文件类型

- 普通文件
  内容是文件的数据
  存放在硬盘
d 目录
  内容是inode编号和文件名的映射关系
  存放在硬盘
l 链接文件
c 字符设备文件
  以字符为单位接收/传输数据
  终端属于字符设备
  ll /dev/pts/0
b 块设备文件
  存储接口设备,如硬盘光盘
  以块为单位接收/传输数据
  硬盘上数据存储以块(block)为最小单位,默认块大小4KB
p 管道文件
  用于进程间数据单向传输
  使用1个内核缓冲区,对一个进程是写空间,对另一个进程是读空间
  放置在内存中
s 套接字文件
  用于进程间数据双向传输
  使用2个内核缓冲区,实现双向传输
  放置在内存中
1.4 文件的三个时间
mtime 修改时间,默认显示时间
ctime 文件属性修改时间
atime 访问时间
1.5 inode索引编号机制

inode是Linux文件系统中的"文件身份证",记录文件的元数据: 权限、属主、大小、时间戳、数据块位置

  • 文件名 → inode 编号 → inode → 数据块
  • 同一硬盘分区,inode编号唯一
# 查看文件inode编号
ls -li 或 ll -i

inode 表

  • 每个分区有一个inode表,表容量有限

  • inode记录可用数量决定分区可创建多少个文件

  • inode 表由很多字段记录组成

    字段

    1. inode 索引号(编号)

      唯一

      可定位表里的某一行记录

    2. 文件类型

    3. 权限

    4. 硬链接数

      硬链接数不为0不会删除记录

    5. 属主(UID)

    6. 属组(GID)

    7. 大小

    8. 时间

    9. 指针

      指向记录对应的数据块起始位置,配合文件大小记录即可确定整个文件的数据,前提是数据库是连续存放

      数据块分散存放使用多个指针

    inode位图

    可以存放多少条记录意味着有多少位,当指定位有记录置为1,无记录置为0

    当某条记录数据块硬链接数归0,将该记录对应位图位置0

1.6 硬链接与软链接
1.6.1 硬链接
  • 硬链接本质是起一个新的文件名,实质是同一个文件
  • 多个文件名对应一个inode,对原文件名删除移动不影响硬链接
  • 只能链接文件,不能跨硬盘分区
  • 目录不能手动创建硬链接,防止循环检索
  • 硬链接数不为0时,inode记录不会被删除,数据块不会被标记为可用
  • . 和 … 是目录的硬链接
  • 文件的起始名也是一个硬链接
  • 用途: 关键文件多路径保护
# 创建硬链接命令
ln 源文件 链接文件
1.6.2 软链接
  • 类似快捷方式
  • 软链接目标使用绝对路径
  • 软链接文件可改名,不改名则为源文件名
  • 可链接目录,可跨分区链接
  • 源文件移动删除,链接失效
  • 软链接是一个独立的文件,拥有独立的inode
  • 软链接文件存放内容为创建软链接时指定的源文件路径
  • 本质是记录怎么找到源文件,类似地图
  • 用途: 创建主程序软链接,常用于软件升级或者回滚;日志统一路径
  • 删除软链接时注意是否后方有 / ,有 / 会删除源目录下文件
# 创建软链接命令
ln -s 源文件或者源目录 链接文件

2. pwd 查看当前工作路径

[root@ubuntu-240 22:12:12 /var/log]#pwd
/var/log

pwd -P # 显示真实路径,例如链接的真实路径
[root@ubuntu-240 22:09:51 ~]#cd /sbin
[root@ubuntu-240 22:10:14 /sbin]#pwd -P
/usr/sbin

登录Linux后,初始位置默认为该用户的家目录

3. ls 查看目录内容

常用选项
-l :以长格式显示内容列表,简写为ll(操作系统初始设置别名alias ll=‘ls -alF’)
-a :显示当前路径所有文件,包括以.开头的隐藏文件
-h :以人类可读方式显示文件大小
-t :按mtime(修改时间)排序
-S :文件从大到小排序
-d :只显示目录本身,不显示目录里的文件

# 显示隐藏文件
ls -a
.  ..  .bash_logout  .bashrc  .cache  .profile  .ssh

# 只显示目录
ls -d /etc/*/
/etc/alternatives/       /etc/ca-certificates/      /etc/cron.monthly/          /etc/dpkg/    /etc/initramfs-tools/  ...

# 以长格式显示
ls -l /var/log

# ll,别名,alias ll='ls -alF'
[root@ubuntu-240 22:24:47 ~]#ll
total 32
drwx------  5 root root 4096 Jul 15 00:25 ./
drwxr-xr-x 23 root root 4096 Jul 13 22:23 ../
-rw-------  1 root root 1047 Jul 15 00:25 .bash_history
-rw-r--r--  1 root root 3153 Jul 14 17:52 .bashrc
drwx------  2 root root 4096 Jul 14 17:55 .cache/
drwx------  3 root root 4096 Jul 15 00:01 .config/
-rw-r--r--  1 root root  161 Apr 22  2024 .profile
drwx------  2 root root 4096 Jul 13 22:34 .ssh/

# 以人类可读方式显示文件大小
ll -h /var/log/syslog
-rw-r-----   1 syslog    adm             237K Jul 13 15:15 syslog

# 以文件大小排序且以人类可读方式显示文件大小
ll -Sh /var/log

4. cd 切换工作目录

Linux路径分为 绝对路径 和 相对路径

绝对路径:/(根) 开始的路径

相对路径: 相对当前工作目录的路径

# 使用绝对路径切换
test@ubuntu:~$ cd /etc/netplan/

# 使用相对路径切换
test@ubuntu:/opt$ cd /var/
test@ubuntu:/var$ cd tmp/
[root@ubuntu-240 22:12:15 /var/log]#cd /
[root@ubuntu-240 22:17:45 /]#cd etc/

# 切换到当前用户家目录
test@ubuntu:/etc/netplan$ cd
test@ubuntu:/etc/netplan$ cd ~

# 去到指定用户家目录,一般仅root用户可用,普通用户仅可访问自身家目录
cd ~用户名
[root@ubuntu-240 22:19:58 /etc]#cd ~test
[root@ubuntu-240 22:20:03 /home/test]#

# 进入当前目录
cd .

# 进入上级目录
cd ..

# 进入上上级目录
cd ../..

# 切换到上一个工作目录
test@ubuntu:~$ cd -
/etc/netplan
test@ubuntu:/etc/netplan$ 

5. mkdir 创建目录和touch 创建文件

5.1 创建目录

规则:

  • 同目录不能创建相同目录
  • 目录名称也不能与同目录文件名称相同
  • 不能包含/
  • 不能超过255个字符
  • 区分大小写
# 在当前目录创建目录test并切换到test目录
test@ubuntu:/var/tmp$ mkdir test
test@ubuntu:/var/tmp$ cd test/

# 在当前目录创建1和2两个目录
test@ubuntu:/var/tmp/test$ mkdir {1,2}

# 在当前目录创建3到5三个目录,并显示创建过程
test@ubuntu:/var/tmp/test$ mkdir -v {3..5}
mkdir: created directory '3'
mkdir: created directory '4'
mkdir: created directory '5'

# 递归创建目录,不存在的目录自动创建
test@ubuntu:/var/tmp/test$ mkdir -pv 6/{1..3}
mkdir: created directory '6'
mkdir: created directory '6/1'
mkdir: created directory '6/2'
mkdir: created directory '6/3'

# 显示目录结构
test@ubuntu:/var/tmp/test$ tree
.
├── 1
├── 2
├── 3
├── 4
├── 5
└── 6
    ├── 1
    ├── 2
    └── 3

touch 已存在文件 刷新文件的时间

# 创建空文件
touch /var/tmp/test.txt
# 批量创建
touch dir1/test{1,2} # 创建test1和test2
touch dir1/file{1..10} # 创建file1 ~ file 10

6. cp 复制文件或目录(支持对复制后文件或目录重命名)

选项
-i # 提示是否覆盖
-f # 强制
-a # 归档,相当于-dR --preserv=all,常用于备份功能
-r # 递归,复制目录
-v # 显示过程
--backup=numbered # 目标存在时,覆盖前先备份加数字后缀,形式为 filename.~#~ ,可以保留多个版本

# 复制test1.txt test2.txt到目录dir1,复制多个文件时最后参数必须是目录
cp test1.txt test2.txt dir1/

# 将test1.txt复制到当前目录并重命名为test1.txt.bak
cp test1.txt test1.txt.bak

# 备份目录及所有文件到指定目录并重命名
cp -a /etc/  /opt/test/etc-`date +%F_%H-%M-%S`

# .[^.]*复制目录下所有隐藏文件而不包括父目录(..)
cp -r /etc/skel/.[^.]* /home/test

# 复制目录下所有文件,包括隐藏文件,不会复制父目录
cp -r /etc/skel/. /home/test

# 复制目录到指定路径并改名,也可实现复制目录下所有文件
cp -r /etc/skel /home/test

7. mv 移动或重命名文件或目录

# 移动
mv test1.txt dir1/ # 移动test10.txt到目录dir1
mv *.txt /var/tmp/ # 移动所有.txt后缀文件
# 重命名
mv test10.txt tasr.txt # 将test10.txt重命名为tasr.txt
# 加后缀
mv test10.txt{,.bak} # 等效于mv test10.txt test10.txt.bak
# 移动并重命名
mv test1.txt.bak dir1/aaa.txt # 将test1.txt.bak移动到目录dir1并重命名为aaa.txt

8. rm 删除文件或目录

选项
-i # 交互式,RHEL默认选项,因为alias rm='rm -i'
-f # 强制删除
-r # 递归

# Ubuntu使用rm命令不询问,直接删除
rm 1.txt 
rm -rf # 递归删除目录或者文件,强制删除,不确认,通用

# 生产环境rm解决方案一,将文件放入tmp目录,过一段时间系统自动删除
mv 文件或目录 /tmp
# 生产环境rm解决方案二,并不真删除文件,而是移动到临时文件夹
alias rm='DIR=/data/backup`date +%F%T`;mkdir $DIR;mv -t $DIR'

9. rmdir 删除空目录

-r # 递归删除

10. tree 文件树

tree # 以树状图列出当前目录结构
tree -d # 只显示目录
tree -L 3 # 显示3层目录结构,目录层级很深时使用

11. dirname 取目录名和 basename 取文件名

七、查看文件内容

1. cat 查看文件内容

一次性显示文件所有内容,只适合查看小文件

选项
-n # 内容显示行号
-b # 非空行编号,等同 nl 命令
-s # 压缩连续的空行成一行
-A # 查看文件中的不可见字符,例如行尾显示$,Tab显示为^I

# 示例
cat /etc/hosts
cat /etc/os-release

cat > 文件名 # 直接将输入内容 覆盖写入 文件
cat >> 文件名 # 追加写入
Ctrl+d # 结束输入
Ctrl+退格键 # 退格删除

# 删除被占用的大文件释放磁盘空间
cat /dev/null > 待删除大文件 # 清空大文件
rm -f 大文件 # 删除大文件

# cat命令配合重定向多行写入文件,shell脚本常用于写服务文件
cat > f3.txt << EOF
> deng
> tian
> wen
> EOF

# cat -b等同于nl
cat -b /etc/passwd
     1  root:x:0:0:root:/root:/bin/bash
     2  daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin

nl /etc/passwd
     1  root:x:0:0:root:/root:/bin/bash
     2  daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin

2. less 或 more 分页查看文件内容

2.1 more

一页一页显示文件内容

more 会把文件所有内容加载到内存中,不适合浏览大文件

空格键或者Ctrl+F # 翻页
b或者Ctrl+B # 返回上一页
上下键 # 逐行查看
q # 退出
/ # 搜索 n/N 搜索下一个/搜索上一个
2.2 less

一页一页显示文件内容

操作方式与 more 一致

查看大文件时不会读完整个文件,加载速度更快

less 退出后查看的内容会从终端显示清除

# 示例
less /var/log/syslog

3. head 查看文件开头部分

head # 默认显示前10行
head -n 8 # 显示文件前8行的内容,-n 8可简写为-8
head -5 # 取前5行

# 示例
head -5 /etc/passwd

4. tail 查看文件末尾部分

tail # 显示最后10行
tail -n? # 显示最后?行
tail -? # 显示最后?行
tail -n+? # 显示从第?行到结尾
tail -n+2 # 从第二行开始显示,常用于去除标题行
tail -f 文件名 # 实时显示文件最新内容,跟踪的是文件描述符,并不是文件名
tail -F 文件名 # 实时显示文件最新内容,跟踪的是文件名
tail -0f # 不输出任何历史内容,只打印之后新增行

# 示例
tail -5 /var/log/auth.log
tail -0f /var/log/syslog

5. grep 在文件中搜索过滤指定字符

这里只是介绍一些简单用法,配合正则表达式可实现更丰富用法

# 搜索包含"accept"的行,忽略大小写
grep -i "accept" /var/log/auth.log
# 搜索包含"fail"的行,忽略大小写
grep -i "fail" /var/log/auth.log
# 显示匹配行及上下各3行
grep -C3 -i "accept" /var/log/auth.log
# 统计匹配行数
grep -c -i "accept" /var/log/auth.log
# 从最近的日志中找错误
tail -100 /var/log/auth.log | grep "fail"

八、文件编辑

8.1 vi 和 vim

vim 是 vi 的增强版,最小安装操作系统默认不带 vim,需要手动安装

# 这里只列举了部分常用指令,实际用法十分丰富

命令模式
vim 文件名 # 进入命令模式
VIM 文件 +行号 # 打开待编辑文件并跳转到指定行
ZZ # 如果有修改保存退出
ZQ # 不保存退出
hjkl # 左/下/上/右移动光标
gg # 跳转至第一行
G # 跳转至最后一行
dw # 删除后方一个单词
d$ # 删除到行尾
dG # 删除到文末
dd # 剪切光标所在行
:%d # 删除全文
yy # 复制光标所在行
p # 缓冲区存的如果为整行,则粘贴当前光标所在行的下方;否则,粘贴至当前光标所在处的后面
P # 缓冲区存的如果为整行,则粘贴当前光标所在行的上方;否则,粘贴至当前光标所在处的前面
/ # 查找/搜索,n 下一个,N 上一个
u # 撤销
Ctrl+r # 重做

编辑模式
i # 在光标所在处输入
a # 在光标所在处后方输入
I # 在光标所在处行首输入
A # 在光标所在处行尾输入
o # 在光标所在处下方打开一个新行
O # 在光标所在处上方打开一个新行
按esc退出编辑模式

扩展命令模式 # 按 : 进入
w # 保存
w! # 强制保存
wq # 保存退出
q # 退出
q! # 强制退出,修改文件后不想保存使用
r 文件 # 读取指定文件内容到当前文件中
w 文件 # 当前文件另存为
:w !sudo tee % # 非root用户保存文件
:r!命令 # 读入命令的输出
:% s/old/new/g # 全局替换,将文件中所有的 old 替换为 new
:% s/^#// # 删除行首的#

可视化模式
Ctrl+v # 按矩形选取

可视化模式示例
# 所有行首加#
gg # 跳转至第一行的行首
Ctrl-v # 进入可视模式
G # 跳转至最后一行,选中所有行第一个字符
I # 在光标所在处行首输入
#
Esc

8.2 vim 定制用户工作特性

8.2.1 临时修改

: 扩展命令模式 输入

常用的工作特性设置
# 显示行号
set nu
set nonu 取消

# 显示Tab ^I和换行符 $
set list
set nolist 禁用

# 搜索忽略大小写
set ic
set noic 不忽略

# 自动缩进
set ai
set noai 禁用

# 复制保留格式
set paste
set nopaste 禁用

# 高亮搜索
set hlsearch
set nohlsearch 禁用

# 语法高亮
syntax on
syntax off 禁用

# 启用windows格式
set ff=dos
# 启用unix格式
set ff=unix
# 用来转换文件

# Tab用空格代替,默认为8个空格代替Tab
set expandtab
set noexpandtab 禁用
# Tab用指定个数空格代替
set tabstop=4
set ts=4 # 简写
# 设置缩进为4个字符
set shiftwidth=4

# 高亮光标行
set cul
set nocul 禁用

# 高亮光标列
set cuc

# 加密
set key=
# 解密
set key=

# 启用语法和文件类型检测
filetype on
# 启用基于文件类型的缩进规则
filetype indent on
# 启用基础自动缩进
set autoindent

# 查看vim支持的工作特性
set all
8.2.2 永久生效
vim ~/.vimrc

set expandtab        " 用空格替代 Tab 
filetype on          " 启用语法和文件类型检测
filetype indent on   " 启用基于文件类型的缩进规则
set autoindent       " 启用基础自动缩进(保底方案)
set nu               " 显示行号
set cuc              " 高亮光标列
set ic               " 搜索 / 查找时忽略大小写
autocmd BufNewFile *.sh exec ":call SetTitle()" " 新建 .sh 文件自动执行SetTitle函数
func SetTitle()
    if expand("%:e") == 'sh'
        " 逐行插入内容
        call setline(1,"#!/bin/bash")
        call setline(2,"#")
        call setline(3,"#*****************************************************************")
        call setline(4,"#Author:        test")
        call setline(5,"#QQ:            XXXXXXXX")
        call setline(6,"#Date:          ".strftime("%Y-%m-%d"))
        call setline(7,"#FileName:      ".expand("%"))
        call setline(8,"#URL:           http://")
        call setline(9,"#Description:   The")
        call setline(10,"#Copyright (C): ".strftime("%Y")." All rights reserved")
        call setline(11,"#*****************************************************************")
        call setline(12,"")
    endif
endfunc
autocmd BufNewFile normal G " 自动跳转到最后一行

8.3 意外中断处理

在使用 vi/vim 时,如遇网络中断、宕机等意外编辑中断,会保留 .swp 结尾的交换文件,重新编辑该文件时,系统会出现提示,按 r 可以恢复编辑,编辑完视情况保存。确认文件无误后,在文件所在目录输入 ll -a 查找以 . 开头,以 swp 结尾的对应文件,将其删除。否则后续编辑该文件还会出现提示

九、tar或zip 打包及压缩

不要压缩散文件,应将文件放入目录,压缩目录

压缩包名一般与被压缩文件有关

9.1 tar

三种压缩工具对比

工具tar 命令(压缩 / 解压缩)压缩比压缩速度压缩包后缀用途
gziptar czvf / tar xzvf.tar.gz日志归档(推荐)
bzip2tar cjvf / tar xjvf.tar.bz2
xztar cjvf / tar xjvf最高最慢.tar.xz备份(节省空间)
选项
-c # 压缩
-v # 显示执行过程
-f # 指定备份文件
-x # 解压
-C # 解压到指定路径,
-z # 使用gzip压缩,必须要安装gzip压缩工具,否则无效
-j # 使用bzip2压缩,必须要安装bzip2压缩工具,否则无效
-J # 使用xz压缩,必须要安装xz压缩工具,否则无效
-a # 自动匹配压缩(根据后缀自动选择工具)
--exclude= # 排除指定文件压缩

# gzip压缩
tar zcf 压缩包名.tar.gz 目录

# 解压
tar xf 压缩包名.tar.gz

# 解压到指定路径
tar xf 压缩包名.tar.gz -C /opt/test 

# 只打包目录内的文件,不包括目录本身,注意解压时需要解压到空目录
cd /etc
tar zcvf /root/etc.tar.gz ./


# 打包/归档(不压缩)示例

# 打包
tar -cvf etc.tar /etc
# 查看包内容
tar -tf etc.tar
# 解包到当前目录
tar -xvf etc.tar
# 解包到指定目录
tar -xvf etc.tar -C /tmp

# 压缩
# 推荐使用gzip和xz压缩
# 如果使用bzip2可能需要手动安装

# gzip压缩
tar -czvf etc.tar.gz /etc

# 自动匹配压缩
tar -caf etc1.tar.gz /etc
tar -caf etc1.tar.bz2 /etc
tar -caf etc1.tar.xz /etc

# 解包解压
tar -xf etc.tar.gz
tar -xf etc.tar.gz -C /tmp/
9.2 zip

会丢失文件属性

# 压缩
zip -r 压缩包名.zip 文件夹

# 解压
unzip 压缩包名.zip
# 解压到指定路径
unzip 压缩包名.zip -d 目录
9.3 校验文件完整性
# MD5哈希值(32位)
md5sum etc.tar.gz

# SHA-256哈希值(64位)
sha256sum etc.tar.gz

十、用户和用户组管理

10.1 Linux 用户和用户组相关文件

10.1.1 /etc/passwd 用户账户文件

用户名、UID、GID、家目录、Shell

# 字段详解
以:分隔,共七个字段
第一个字段:UserName,用户名
第二个字段:PassWord,密码占位符,实际保存在/etc/shadow文件,默认都是x
第三个字段:UID,用户身份编号
第四个字段:GID,用户所属主组GID
第五个字段:用户全名或描述信息
第六个字段:用户的家目录
第七个字段:用户登录系统所用的shell,为/sbin/nologin不能登录,shell为用户登录时启动的第一个程序

UID分配规则:

UID范围类型说明
0root超级管理员
1-999系统用户系统进程使用,无法登录
1000+普通用户可登录用户
10.1.2 /etc/shadow 账户密码文件

加密密码、密码过期策略

# 字段详解
以:分隔,共九个字段
第一个字段:用户名
第二个字段:用户密码,一般用sha512加密并加盐(salt)
第三个字段:从1970年1月1日起到最后修改天数
第四个字段:修改密码最小间隔()(0表示随时可被变更)
第五个字段:密码有效期(天)(99999表示永不过期)
第六个字段:密码过期前几天警告用户(默认为一周)
第七个字段:密码过期几天后锁定帐号
第八个字段:从1970年1月1日算起帐号失效天数
第九个字段:保留字段
10.1.3 /etc/group 用户组文件

组名、GID、组成员

# 字段详解
以:分隔,共四个字段
第一个字段:组名
第二个字段:密码占位符
第三个字段:GID
第四个字段:组成员列表(附加组成员,以逗号分隔),主组不显示
10.1.4 /etc/gshadow 用户组密码文件

10.2 用户组

生产环境推荐 先建组,再建用户

10.2.1 groupadd 创建用户组
groupadd dev # 创建名为dev的组
groupadd -g # 创建组时指定GID
groupadd -r # 创建系统组

# 创建组并指定GID
groupadd -g 3000 dba
# 创建名为oracle的用户,该用户主组为oinstall,附加组为dev
useraddd oracle -g oinstall -G dev
10.2.2 查看用户组
cat /etc/group # 查看系统所有的用户组
groups 用户名 # 查看指定用户属于哪些组
id 用户名 # 查看用户信息,也可查看用户属于哪些组

# 查看组中的成员
groupmems -l -g wheel 
getent group wheel
10.2.3 gpasswd 管理用户组

常用选项:

选项说明备注
-a添加用户到组
-d从组删除用户
-A设置组管理员可管理该组成员
-r删除组密码
-M覆盖重设组成员
-R限制组阻止新成员加入组
# 交互式设置组密码
gpasswd 组名

# 添加用户到组
gpasswd -a 用户名 组名

# 从组删除用户
gpasswd -d 用户名 组名

# 设置组管理员(可管理该组成员)
gpasswd -A 用户名

# 删除组密码
gpasswd -r 组名

# 覆盖重设组成员
gpasswd -M 用户1,用户2,用户3 组名

# 限制组,阻止新成员加入组
gpasswd -R 组名
10.2.4 groupmod 修改用户组
-n 新名字 原名字 # 修改用户组名称
-g # 修改GID

# 修改组名
groupmod -n ops op
# 修改组GID
groupmod -g 4000 devops
10.2.5 groupdel 删除用户组
groupdel 组名 # 删除用户组
-f # 强制删除,即使是用户的主组也强制删除组,但会导致无主组的用户不可用无法登录

10.3 用户

10.3.1 用户的主组

每个用户只能有一个主组

创建用户不指定主组,自动创建与用户同名的主组

主组是用户的 “默认组”,新建文件时默认属组就是主组

10.3.2 用户的附加组

用户可以加入多个附加组,以获取额外权限

10.3.3 查看用户信息
deng@master1:~$ getent passwd deng
deng:x:1000:1000:deng:/home/deng:/bin/bash
deng@master1:~$ id deng
uid=1000(deng) gid=1000(deng) groups=1000(deng),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),101(lxd)
10.3.4 useradd 创建用户

建议创建用户时指定UID,不同主机创建用户时使用相同UID

常用选项:

选项说明备注
-r创建系统用户UID 1 - 1000,区别于普通用户,用于运行服务,系统用户默认不创建家目录
-u指定UID
-s指定Shellubuntu默认使用bin/sh shell,使用-s /bin/bash指定使用bash
-g指定主组不建议使用
-G指定附加组确保组已存在,多个附加组用 , 隔开
-m创建家目录ubuntu默认不创建家目录,使用-m创建
-M不创建家目录RHEL创建非系统用户默认创建家目录
-d指定家目录通常与 -m 配合使用
-c添加描述信息有空格整个描述用 " " 引起来

Shell可用列表在/etc/shells文件中,不能登录账户设置为/sbin/nologin,登录立即退出且无提示信息设置为/bin/false

默认值设定
/etc/default/useradd 命令默认值设定
/etc/skel/ 家目录初始文件模板,ls -a /etc/skel/
/etc/login.defs

# Rocky创建名为mysql的用户,-u 1001表示UID为1001,-M表示不建立家目录,-s /sbin/nologin表示该用户不能登录
useradd -u 1001 mysql -M -s /sbin/nologin

# 创建名为user4000的用户,-u 4000表示UID为4000,-G user2000表示加入已存在的user2000群组作为该用户的附加组,同时创建名为user4000群组作为主组
useradd -u 4000 -G user2000 user4000

useradd -r -u 49 -s /sbin/nologin -d /var/www -c Apache  apache
# -c Apache 添加用户注释(备注)为 "Apache",方便识别该用户的用途
# apache 最终创建的用户名(注意:Linux 用户名通常小写)

# ubuntu通过openssl passwd自动添加密码创建用户
sudo useradd -p "$(echo 123456|openssl passwd -6 -stdin)" liu # 123456为指定密码
sudo useradd -p "$(openssl passwd -6 123456)" liu
10.3.5 passwd 修改密码

交互式修改密码

常用选项:

选项说明
-d清空用户密码
-l锁定用户
-u解锁用户
-e强制用户下次登录修改密码
-S查看用户账户状态,比如是否被锁定

管理员修改普通用户密码不需要通过原密码,且不强制要求通过密码复杂性要求

普通用户修改自身密码需要提供原密码,且需要通过密码复杂性要求

passwd # 修改当前登录用户密码
passwd 用户名 # 修改指定用户密码,管理员可用,普通用户只能修改自身密码

# 非交互式修改密码
echo 用户名:密码 | chpasswd
echo -e '密码\n密码' | passwd 用户名
	
# 生成随机密码
# 通过/dev/urandom生成随机字符取12位
tr -dc '[:alnum:]' < /dev/urandom | head -c 12
# 生成 9 字节随机数 → 12字节 Base64 字符串
openssl rand -base64 9 
10.3.6 usermod 修改用户

usermod --help

常用选项:

选项说明备注
-G更改附加组原有的附加组配置将会被覆盖,若保留原有,则要同时使用-a选项
-s更改Shell
-l更改用户名
-L锁定用户/etc/shadow 第二个字段密码字段增加 !
-U解锁用户/etc/shadow 第二个字段密码字段的 ! 拿掉
-e YYYY-MM-DD指定账号过期日期
-f宽限期
-u更改用户UID
-g更改用户的主组
-c更改注释
# 修改附加组
usermod -G user2000 user3000 
# 添加附加组
usermod -aG dba user3000
10.3.7 chage 修改用户密码有效期
选项
-d # 需要更改密码的时间
-m # 密码修改间隔
-M # 密码有效天数
-w # 离密码过期多少天警告
-I # 密码过期多少天后不可登录
-E # 用户的有效期
-l # 显示指定用户密码策略

# user001第一次登录时需要更改密码
chage -d 0 user001

# 改变用户user001的密码规则,-m 2表示最短密码修改间隔为2天,-M 90表示密码最大有效期为90天,-W 9表示离密码过期9天警告,-I 3表示密码过期3天后将锁定账户,无法登录
chage -m 2 -M 90 -W 9 -I 3 user001
10.3.8 userdel 删除用户

生产环境一般使用passwd -l锁定用户

# 删除用户(保留家目录和邮箱)
userdel user01
# 手动删除家目录及邮箱
rm -rf /home/user01
rm -rf /var/spool/mail/user01

userdel -f # 强制
userdel -r # 删除用户相关数据,如家目录、邮箱等

10.4 su 和 sudo 权限委派

10.4.1 su 切换用户
su 用户名 # 不会读取目标用户的配置文件和环境变量,不改变当前工作目录,即不完全切换
su - 用户名 # 读取目标用户的配置文件和环境变量,切换至目标用户的家目录,即完全切换,推荐
切换用户后,使用 exit 或 Ctrl+d 退回至之前的用户身份

# 切换并执行一条命令
su - deng -c "ls -la"

# 切换为root,需要root用户密码
su -

普通用户切换用户需要对应用户密码,管理员切换用户不需要

10.4.2 su 和 sudo 对比
对比项susudo
切换方式完全切换用户临时提权
密码需要目标密码使用自身密码
审计难以追踪有日志记录
权限粒度全部权限可精细控制
推荐程度不推荐推荐
10.4.3 sudo 权限委派
10.4.3.1 系统超级用户组
  • RHEL: whell
  • Ubuntu: sudo
  • Windows: Administrators

将普通用户加入超级用户组,即可获得 sudo 执行所有命令的权限,不推荐

10.4.3.2 sudo 权限委派相关概叙
  • udo作用是使普通用户具有管理员权限,执行管理员命令

  • 需要root用户密码,使用用户自身密码

    输入用户密码,默认5分钟内不需要重复输入密码

    可在权限委派配置规则中添加NOPASSWD:不需要输入用户密码

  • 使用sudo执行的命令都会记录在日志文件中

    Rocky: /var/log/secure

    Ubuntu: /var/log/auth.log

10.4.3.3 配置方式
  • 主配置文件: /etc/sudoers
  • 子配置文件目录: `/etc/sudoers.d

推荐根据业务创建子配置文件进行权限委派

使用 visudo 进行配置,保存时带语法校验

# Rocky
visudo -f /etc/sudoers.d/ruoyi


# Ubuntu 默认使用 nano 编辑器,使用以下方式使用 vim 编辑器
# 临时指定
EDITOR=vim visudo
# 当前用户持久修改
echo 'export EDITOR=vim' >> ~/.bashrc
# 编辑命令
visudo -f /etc/sudoers.d/ruoyi
10.4.3.5 配置文件语法及字段解析

用户/组 主机=(运行身份) 命令

四个字段说明

字段说明示例
用户名 / %组名谁可以执行ruoyi-dev , %dev
主机在哪台主机上生效ALL(所有主机) , 10.0.0.206 , db-server
运行身份以哪个身份执行命令ALL(所有用户) , root
命令可以执行哪些命令, NOPASSWD: 使用 sudo 执行命令时不需要输入当前用户密码ALL (所有命令,不推荐) , /usr/bin/systemctl
10.4.3.6 配置规则示例
# 用户授权
user001 ALL=(ALL) ALL

# 组授权
%devops ALL=(ALL) ALL

# 免密提权
user001 ALL=(ALL) NOPASSWD: ALL 

# 限制只能执行特定命令
# 允许用户 deng 在 10.0.0.206 上以 root 身份挂载光驱
deng 10.0.0.206=(root) /usr/bin/mount /dev/sr0 /mnt 
# 允许用户 deng 在 10.0.0.206 上以 root 身份挂载和卸载
deng 10.0.0.206=(root) /usr/bin/mount,/bin/umount
# 允许用户 deng 免输密码执行 nginx 重启和查看状态
deng ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx, /usr/bin/systemctl status nginx
# 运行用户组 dba 执行 mysql 启动和查看状态
%dba ALL=(ALL) /usr/bin/systemctl start mysqld, /usr/bin/systemctl status mysqld

# 允许用户 deng 使用 sudo 免输密码执行所有操作,但禁止修改 root 密码和切换到 root 用户
deng ALL=(ALL) NOPASSWD: ALL, !/usr/bin/passwd root, !/usr/bin/su -
10.4.3.7 配置文件使用别名 Alias

当需要管理多个用户或命令时,使用别名简化配置

四种别名类型

别名类型说明示例
User_Alias用户别名User_Alias ADMINS = jsmith, mikem
Runas_Alias运行身份别名Host_Alias MAILSERVERS = smtp, smtp2
Host_Alias主机别名Host_Alias WEBSERVERS = web1, web2, web3
Cmnd_Alias命令别名Cmnd_Alias SERVICES = /usr/bin/systemctl start nginx, /usr/bin/systemctl status nginx

配置示例见 [14.4.3 sudo 配置](#14.4.3 sudo 配置)

10.4.3.7 sudo 选项
选项说明示例
-u 用户名以指定用户身份运行
-l列出当前用户的权限委派sudo -l
-U 用户名管理员列出指定用户的权限委派sudo -l -U ruoyi-dev

10.5 测试环境启用root用户登录

# 给root用户添加密码
echo root:123456 | chpasswd
# 修改 SSH 配置
sed -i.bak '/PermitRootLogin prohibit-password/s/.*/PermitRootLogin yes/' /etc/ssh/sshd_config
# 重启 SSH 服务
systemctl restart sshd

十一、文件权限管理

11.1 UGO权限基础概念

11.1.1 定义对象

用户: User 属主, u

用户组: Group 属组, g

其他: Other 其他, o

用户的最终权限,是从左向右进行顺序匹配,一旦匹配权限立即生效,不再向右查看其他权限

r和w权限对root用户无效

只要所有者,所属组或other三者之一有x权限,root就可以执行

11.1.2 权限类型
权限符号数字表示对文件的含义对目录的含义
r(读)4读取文件内容(cat)查看目录中的文件列表(ls)
w(写)2修改文件内容(vim)可在目录中创建、删除、重命名文件,和被删除的文件本身权限无关
x(执行)1执行该文件(程序或脚本)进入此目录(cd)
11.1.3 权限表示法
字符表示法: rwxr-xr–

前三位 rwx :属主权限

中三位 r-x :属组权限

后三位 r-- :其他人权限

- 表示没有对应权限

数字(八进制)表示法: 754

将每组 rwx 看成二进制(有权限为1,无则为0),再转换为十进制

rwx = 111 = 7

r-x = 101 = 5

r-- = 100 = 4

因此 rwxr-xr-- = 754

11.2 命令

11.2.1 chown 修改文件属主和属组
chown 用户 文件 # 修改文件属主
chown :组 文件 # 修改文件属组
chown 用户:组 文件 # 修改文件属主和属组
chown --reference=文件1 文件2 # 参考文件1修改文件2所属用和组
chown -R 用户:组 目录 # 递归修改目录及其内所有文件和目录,使用时需注意使用时/前是否有空格,以防修改/下所有文件
11.2.2 chgrp 修改文件属组
chgrp 组 文件
11.2.3 chmod 修改文件权限
  • 非root用户只能修改自身为属主的文件
11.2.3.1 字符模式

操作对象: u (属主), g (属组), o (其他), a (所有)

操作符: + (添加), - (移除), = (精确设置)

权限: r , w , x

选项
-R # 递归修改
--reference # 参考文件修改权限
chmod -R a+X dir # 给目录及目录下的目录和可执行文件赋予x权限
chmod -R g+rwX /testdir # 给目录testdir及目录下的目录和可执行文件属组赋予读写执行权限
11.2.3.2 数字模式
chmod 654 文件 # 指定文件属主可读写,属组可读可执行,其他可读

11.3 umask 权限掩码

umask决定新建文件和目录的默认权限

文件类型起始值减去 umask最终权限
文件666- 022644
目录777- 022755

Rocky 10: root 用户和普通用户 umask 默认都是 0022

Ubuntu: root 用户 0022 , 普通用户 0002

第一个 0 是特殊权限

# 查看umask值
umask

# 临时修改umask
umask 0027

# 持久修改umask
# 写入用户配置文件 ~/.bashrc
echo "umask 0027" >> ~/.bashrc

11.4 增删改文件本质(目录的写权限和底层原理)

增(创建)、删(删除)、改(重命名) 文件本质是修改目录文件中记录的文件名和inode映射关系,因此需要对目录拥有写权限才能增删改目录中的文件

删除文件时,删除目录文件中的映射关联,将inode标记为未使用,数据块标记为待回收

11.5 特殊权限

11.5.1 特殊权限概览

数字表示法第一位即为特殊权限 (如4755)

权限类型表示符号数字值作用位置功能
SUIDs (属主 x 位)4文件以文件所有者执行 (通常为root)
SGIDs (属组 x 位)2目录继承目录属组
Sticky Bitt (其他 x 位)1目录仅属主可删除文件
11.5.2 SUID ( Set User ID )

设置在可执行文件上,当普通用户执行该文件时,以文件所有者 (通常为root) 的权限执行,而不是默认的以执行者的权限运行

SUID 权限 只能设置在二进制文件上,设置在 Shell 脚本上不生效

# passwd 文件带 SUID 权限,所以普通用户可以使用 passwd 命令修改自身密码,实际是以 root 身份将密码写入 /etc/shadow 文件
which passwd
/usr/bin/passwd

ll /usr/bin/passwd 
-rwsr-xr-x 1 root root 64152 May 30  2024 /usr/bin/passwd*
11.5.2.1 案例一: cat 字符设置 SUID
# 普通用户无法使用 cat 查看 其他人 无读取权限的文件
cat /etc/shadow
ll /etc/shadow
-rw-r----- 1 root shadow 1082 Jul 14 17:00 /etc/shadow

# 查看 cat 命令文件的权限,(默认没有 SUID 权限)
which cat
ll /usr/bin/cat
-rwxr-xr-x 1 root root 39384 Jun 23  2025 /usr/bin/cat*

# root 用户给 cat 设置 SUID 权限
chmod u+s /usr/bin/cat

# 再次查看 cat 命令文件的权限,属主的 x 变为 s
ll /usr/bin/cat
-rwsr-xr-x 1 root root 39384 Jun 23  2025 /usr/bin/cat*

# 普通用户可以使用 cat 查看 其他人 无读取权限的文件,此时普通用户实际是以 root 身份运行 cat 命令
cat /etc/shadow

# 测试完成,取消 SUID 权限
chmod u-s /usr/bin/cat
11.5.2.2 案例二: rm 数字设置 SUID
# 以 root 身份创建测试文件
[root@ubuntu-240 12:30:08 ~]#touch test.txt

# 普通用户无法删除自身无权限删除文件
deng@ubuntu-240:~$ rm /root/test.txt
rm: cannot remove '/root/test.txt': Permission denied

# root 用户给 rm 设置 SUID 权限
which rm

ll /usr/bin/rm
-rwxr-xr-x 1 root root 59912 Jun 23  2025 /usr/bin/rm*

chmod 4755 /usr/bin/rm

ll /usr/bin/rm
-rwsr-xr-x 1 root root 59912 Jun 23  2025 /usr/bin/rm*

# 普通用户可以使用 rm 删除自身无权限删除文件
rm /root/test.txt

# 测试完成,取消 SUID 权限
chmod 755 /usr/bin/rm
11.5.2.3 查找系统中所有带有 SUID 权限的文件
# 查找系统中所有带有 SUID 权限的文件
find / -perm -4000 -type f 2> /dev/null

# 查找并显示详细信息
find / -perm -4000 -type f -exec ls -l {} \; 2> /dev/null
11.5.3 SGID

主要是针对目录设置,作用是在具有 SGID 权限的目录下创建文件,继承目录的属组

# 准备测试环境
groupadd dev
mkdir /opt/dev
chown :dev /opt/dev
chmod 775 /opt/dev

# 在 /opt/dev 目录创建文件默认使用创建者属组
touch /opt/dev/file1.txt
ll /opt/dev/file1.txt
-rw-r--r-- 1 root root 0 Jul 23 14:04 /opt/dev/file1.txt

# 给 /opt/dev 目录添加 SGID 权限
# chmod 2755 /opt/dev
chmod g+s /opt/dev
ll -d /opt/dev
drwxrwsr-x 2 root dev 4096 Jul 23 14:04 /opt/dev/

# 创建文件使用目录属组
touch /opt/dev/file2.txt
ll /opt/dev/file2.txt
-rw-r--r-- 1 root dev 0 Jul 23 14:05 /opt/dev/file2.txt

# 取消 SGID 权限
# chmod 755 /opt/dev
chmod g-s /opt/dev
11.5.4 Sticky Bit

针对目录设置,作用是具有 Sticky Bit 权限的目录下文件只有属主或root可以删除重命名,防止误删除

# 系统的临时目录具有 1777 权限,所以所有用户都可在该目录创建文件,但只能删除自身创建的文件
ll -d /tmp/ /var/tmp/
drwxrwxrwt 15 root root 4096 Jul 23 14:14 /tmp/
drwxrwxrwt  8 root root 4096 Jul 23 14:14 /var/tmp/

设置方法:

chmod 1777 目录

chmod +t 目录

取消方法:

chmod 777 目录

chmod -t 目录

11.6 chattr / lsattr 文件扩展属性

11.6.1 文件扩展属性概览

chattr 设置的文件属性比普通权限更底层,对 root 也有效

属性作用适用场景设置命令说明
+i不可修改保护系统关键文件chattr +i /etc/passwd
+a仅追加保护日志文件chattr +a /var/log/secure做日志切割时需要先关闭该权限
+A不更新访问时间减少磁盘 I/Ochattr +A /dir/
11.6.2 +i 不可修改,锁定文件
# 修该 /etc/hosts 文件扩展属性为 不可修改
chattr +i /etc/hosts

# 查看文件扩展属性
[root@ubuntu-240 14:41:44 ~]#lsattr /etc/hosts
----i---------e------- /etc/hosts

# 使用 root 尝试追加一条记录,提示操作不允许
[root@ubuntu-240 14:38:27 ~]#echo "10.0.0.210 rocky1.deng.org" >> /etc/hosts
-bash: /etc/hosts: Operation not permitted

# 删除文件,操作不允许
[root@ubuntu-240 14:39:26 ~]#rm /etc/hosts
rm: cannot remove '/etc/hosts': Operation not permitted

# 取消文件扩展属性设置
chattr -i /etc/hosts

# 查看文件扩展属性
[root@ubuntu-240 14:43:42 ~]#lsattr /etc/hosts
--------------e------- /etc/hosts
11.6.3 +a 仅追加
# 创建测试文件
touch /var/log/test.log

# 修该 /var/log/test.log 文件扩展属性为 仅追加
chattr +a /var/log/test.log
[root@ubuntu-240 14:46:49 ~]#lsattr /var/log/test.log
-----a--------e------- /var/log/test.log

# 覆盖写入失败
[root@ubuntu-240 14:45:47 ~]#echo "text 111" > /var/log/test.log
-bash: /var/log/test.log: Operation not permitted

# 追加写入成功
echo "text 111" >> /var/log/test.log
cat /var/log/test.log

# 删除文件,操作不允许 
[root@ubuntu-240 14:46:42 ~]#rm /var/log/test.log
rm: cannot remove '/var/log/test.log': Operation not permitted

# 取消文件扩展属性设置
chattr -a /var/log/test.log
11.6.4 lsattr 查看常用选项
# 查看文件扩展属性
lsattr /etc/passwd

# 查看目录扩展属性
lsattr -d /var/log

# 递归查询
lsattr -R /opt

十二、命令帮助

12.1 命令的通用格式

command [options] [arguments]
command 命令,核心动作
[options] 选项,[]表示可选,微调行为
[arguments] 参数,[]表示可选,作用对象

命令大小写敏感

命令选项参数之间必须有空格

12.2 命令帮助

12.2.1 --help/-h 快速查看命令帮助
date --help # 查看时间支持的格式
iptables --help
iptables -h
12.2.2 man 完整手册

注意最小安装不带man手册

man手册分为多个章节,运维常用章节:

  • 1 用户命令 查询命令用法和示例
  • 5 文件格式与配置 查询配置文件的格式说明
  • 8 系统管理命令 fdisk等系统管理命令查参数
mandb # 手动更新man手册数据库

# 查询命令man手册可用章节
whatis 命令
man -f 命令

# 示例
whatis passwd
man -f passwd
man -f fdisk
查看手册时可用操作
空格 下一页
page up和page down 上下翻页
q 退出
/ 字符 向下搜索指定字符
? 字符 向上搜索指定字符
n 搜索下一个匹配项
man -k 字符 搜索所有与指定字符相关的帮助
12.2.3 AI大模型

借助各个大模型快速查询命令用法

AI辅助的安全工作流

image-20260716215800292

向AI描述需求时应尽可能详细具体,以缩小范围,输出结果更可用

十三、命令辅助

1. file 确定文件类型

确定文件的真实类型,不依赖文件扩展名

file /bin/cat
/bin/cat: ELF 64-bit LSB pie executable, x86-64

file /bin
/bin: symbolic link to usr/bin

file /dev/sda
/dev/sda: block special (8/0)

2. type 确定命令类型

确定命令的类型,并显示其具体定义或路径

命令的类型: 外部程序、Shell内置命令、别名、函数或关键字

内部命令: Shell 自带的命令

外部命令:PATH 环境变量 指定的路径寻找,优先级从左到右;type 外部命令时,显示外部命令的路径

type -a 命令 查看所有同名的命令

type -a ls
ls is aliased to `ls --color=auto'
ls is /usr/bin/ls
ls is /bin/ls

3. which 查看外部命令路径

基于 PATH 环境变量 查找

which ls
/usr/bin/ls

也可使用 whereis

whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz

4. Tab键 命令行补全

  • 命令行支持按 Tab键 自动补全命令或参数
  • 有多个匹配项时,按2次〈Tab键〉显示所有匹配的可能
  • 命令的子命令也支持补全,需要安装bash-completion包,并重新登录

5. 历史命令

  • 当用户正常退出时,会将内存的命令历史存放到历史命令文件中
  • 登录shell时,会读取历史命令文件中记录的命令加载到内存中
  • 登录进shell后新执行的命令只会记录在内存的缓存区中,这些命令会在用户正常退出时追加至历史命令文件
  • 历史命令文件:~/.bash_history
  • 删除历史命令文件重新登录后清空历史命令记录

历史命令使用

!! # 上一次执行的命令
!行号 # 执行历史记录对应行的命令
!字符 # 执行以指定字符开头的上一个命令
!^ # 使用上一条命令第一个参数
!$ # 使用上一条命令最后一个参数
!* # 使用上一条命令全部参数
!:n # 使用上一条命令第n个参数
history -w # 将缓存中的命令写入历史命令文件
history -c # 清除内存中的历史命令,可以使本次登录操作命令不被记录进历史命令
history -s 命令 # 将命令写入历史命令,并不执行
Ctrl+r # 输入关键词查找,在历史命令中查找对应命令,按回车执行

修改历史命令配置

# 历史命令显示时间和执行用户
echo 'HISTTIMEFORMAT="%F %T "' >> ~/.bash_profile
# 记录上限调整到10000
echo "export HISTSIZE=10000" >> ~/.bash_profile
# 重新载入历史命令配置文件以生效
source ~/.bash_profile

十四、项目实战案例

14.1 案例一: 若依项目目录治理

14.1.1 创建标准化目录结构
# 创建项目目录
mkdir -pv /opt/ruoyi/{backend,frontend,logs,config,backup}

# 验证目录结构
tree /opt/ruoyi
14.1.2 创建配置文件模板
vim /opt/ruoyi/config/application.yml
spring:
  application:
    name: ruoyi-admin
  profiles:
    active: druid
      
server:
  port: 8080
  
cat /opt/ruoyi/config/application.yml
14.1.3 硬链接保护配置文件
ln /opt/ruoyi/config/application.yml /opt/ruoyi/backup/application.yml.bak
ll -i /opt/ruoyi/config/application.yml /opt/ruoyi/backup/application.yml.bak
14.1.4 软链接统一日志路径
ln -s /opt/ruoyi/logs /var/log/ruoyi
ll /var/log/ruoyi
14.1.5 压缩归档日志
tar caf /opt/ruoyi/backup/ruoyi-logs-$(date +%F).tar.gz /opt/ruoyi/logs/
tar tvf /opt/ruoyi/backup/ruoyi-logs-2026-07-18.tar.gz

14.2 案例二: 创建标准化用户体系

14.2.1 需求
组名组成员权限
devopsruoyi-admin可重启 Nginx
dbaruoyi-dba可管理 MySQL
developerruoyi-dev可查看日志
14.2.2 实施步骤
# 创建组
groupadd devops
groupadd dba
groupadd developer
tail -3 /etc/group

# 创建用户
useradd -m -s /bin/bash -G devops ruoyi-admin
useradd -m -s /bin/bash -G dba ruoyi-dba
useradd -m -s /bin/bash -G developer ruoyi-dev

# 验证
id ruoyi-admin
id ruoyi-dba
id ruoyi-dev

# 设置密码
echo "ruoyi-admin:Wangxin2019" | chpasswd
echo "ruoyi-dba:Wangxin2019" | chpasswd
echo "ruoyi-dev:Wangxin2019" | chpasswd

# Ubuntu 切换 vim 编辑器
echo 'export EDITOR=vim' >> ~/.bashrc
source ~/.bashrc

# 创建子配置文件配置sudo
visudo -f /etc/sudoers.d/ruoyi
%devops ALL=(ALL) /usr/bin/systemctl restart nginx, /usr/bin/systemctl status nginx
%dba ALL=(ALL) /usr/bin/systemctl start mysqld, /usr/bin/systemctl stop mysqld, /usr/bin/systemctl status mysqld
%developer ALL=(ALL) /usr/bin/tail -f /var/log/ruoyi/*, /usr/bin/cat /var/log/ruoyi/*

# 验证
sudo -l -U ruoyi-admin
sudo -l -U ruoyi-dba
sudo -l -U ruoyi-dev

14.3 案例三: 为若依项目配置权限

14.3.1 需求

为若依项目配置合理的权限:

目录/文件属主属组权限说明
/opt/ruoyiruoyiruoyi755应用根目录
/opt/ruoyi/configruoyiruoyi750配置文件(组内可访问)
/opt/ruoyi/logsruoyiruoyi755日志目录
/opt/ruoyi/backend/ruoyi-damin.jarruoyiruoyi644jar包
14.3.2 实施步骤
# 第1步:创建用户和组
useradd ruoyi

# 第2布: 创建目录结构
mkdir -p /opt/ruoyi/{config,logs,backend,backup}

# 第3步: 设置属主属组
chown -R ruoyi:ruoyi /opt/ruoyi/

# 第4步: 设置权限
chmod 755 /opt/ruoyi/
chmod 750 /opt/ruoyi/config
chmod 755 /opt/ruoyi/logs
chmod 644 /opt/ruoyi/backend

# 第5步: 验证
ls -ld /opt/ruoyi
ls -la /opt/ruoyi

14.4 案例四: 为若依项目团队配置 sudo 权限

案例二的更高级和更完整案例

14.4.1 需求
角色组名组成员权限
运维组opsruoyi-ops可重启 Nginx,可查看应用日志
DBA 组dbaruoyi-dba可管理 MySQL
开发组devruoyi-dev可查看应用日志(免密码)
14.4.2 环境准备
# 创建用户组
groupadd ops
groupadd dba
groupadd dev
tail -3 /etc/group

# Rocky 创建用户
useradd ruoyi-ops -G ops
useradd ruoyi-dba -G dba
useradd ruoyi-dev -G dev

# Ubuntu 创建用户
useradd -m -s /bin/bash -G ops ruoyi-ops
useradd -m -s /bin/bash -G dba ruoyi-dba
useradd -m -s /bin/bash -G dev ruoyi-dev

# 修改用户密码
echo "ruoyi-ops:Test1234" | chpasswd
echo "ruoyi-dba:Test1234" | chpasswd
echo "ruoyi-dev:Test1234" | chpasswd

# 验证用户
id ruoyi-ops
id ruoyi-dba
id ruoyi-dev

# Rocky 安装 nginx 和 mariadb
dnf install -y mariadb-server nginx
systemctl enable --now nginx mariadb

# Ubuntu 安装 nginx 和 mysql
apt update;apt install -y nginx mysql-server

# Rocky 验证服务启动
systemctl status nginx mariadb
ss -ntlp | grep -E 'nginx|mariadb'
ps aux | grep -E 'nginx|mariadb'

# Ubuntu 验证服务启动
systemctl status nginx mysql
ss -ntlp | grep -E 'nginx|mysql'
ps aux | grep -E 'nginx|mysql'
14.4.3 sudo 配置
# Rocky 配置
visudo -f /etc/sudoers.d/ruoyi

# 配置文件内容
# ========== 用户别名 ==========
User_Alias OPS = ruoyi-ops
User_Alias DBA = ruoyi-dba
User_Alias DEV = ruoyi-dev

# ========== 命令别名 ==========
Cmnd_Alias NGINX_CMDS = /usr/bin/systemctl restart nginx, /usr/bin/systemctl status nginx
Cmnd_Alias MYSQL_CMDS = /usr/bin/systemctl start mariadb, /usr/bin/systemctl stop mariadb, /usr/bin/systemctl status mariadb
Cmnd_Alias LOG_CMDS = /usr/bin/tail -f /var/log/ruoyi/access.log, /usr/bin/tail -f /var/log/ruoyi/error.log, /usr/bin/cat /var/log/ruoyi/access.log, /usr/bin/cat /var/log/ruoyi/error.log

# ========== 权限配置 ==========
# 运维组:管理 Nginx + 查看日志(需要密码)
OPS ALL=(ALL) NGINX_CMDS, LOG_CMDS
# DBA 组:管理 MySQL(需要密码)
DBA ALL=(ALL) MYSQL_CMDS
# 开发组:查看日志(免密码,低风险)
DEV ALL=(ALL) NOPASSWD: LOG_CMDS


# Ubuntu 配置
# Ubuntu 切换 vim 编辑器
echo 'export EDITOR=vim' >> ~/.bashrc
source ~/.bashrc
visudo -f /etc/sudoers.d/ruoyi

# 配置文件内容
# ========== 用户别名 ==========
User_Alias OPS = ruoyi-ops
User_Alias DBA = ruoyi-dba
User_Alias DEV = ruoyi-dev

# ========== 命令别名 ==========
Cmnd_Alias NGINX_CMDS = /usr/bin/systemctl restart nginx, /usr/bin/systemctl status nginx
Cmnd_Alias MYSQL_CMDS = /usr/bin/systemctl start mysql, /usr/bin/systemctl stop mysql, /usr/bin/systemctl status mysql
Cmnd_Alias LOG_CMDS = /usr/bin/tail -f /var/log/ruoyi/access.log, /usr/bin/tail -f /var/log/ruoyi/error.log, /usr/bin/cat /var/log/ruoyi/access.log, /usr/bin/cat /var/log/ruoyi/error.log

# ========== 权限配置 ==========
# 运维组:管理 Nginx + 查看日志(需要密码)
OPS ALL=(ALL) NGINX_CMDS, LOG_CMDS
# DBA 组:管理 MySQL(需要密码)
DBA ALL=(ALL) MYSQL_CMDS
# 开发组:查看日志(免密码,低风险)
DEV ALL=(ALL) NOPASSWD: LOG_CMDS
14.4.4 验证配置
sudo -l -U ruoyi-ops
sudo -l -U ruoyi-dba
sudo -l -U ruoyi-dev

# Rocky 验证
su - ruoyi-ops
sudo -l
sudo /usr/bin/systemctl status nginx
sudo /usr/bin/systemctl restart nginx
sudo /usr/bin/systemctl status nginx

# Ubuntu 验证
su - ruoyi-dba
sudo -l
sudo /usr/bin/systemctl status mysql
sudo /usr/bin/systemctl stop mysql
sudo /usr/bin/systemctl start mysql
sudo /usr/bin/systemctl status mysql
14.4.5 日志审计
# Rocky 日志位置
tail /var/log/secure

# Ubuntu 日志位置
tail /var/log/auth.log

# 过滤 sudo 相关日志
grep sudo /var/log/auth.log

十五、命令总结

目标命令示例
看自己在哪pwdpwd
看目录内容lsls -la
看目录结构树treetree /opt/ruoyi
跳转至指定目录cdcd /opt/ruoyi,cd -
创建目录mkdirmkidr -p a/b/c
创建文件touchtouch file.txt
复制cpcp -r dir1 dir2
移动/重命名mvmv file.txt dir/
删除rmrm -rf dir/
查看文件内容catcat /etc/os-release
分页查看大文件lessless /var/log/auth.log
查看文件开头部分headhead -5 /etc/passwd
查看文件结尾部分tailtail -f /var/log/syslog
搜索关键词grepgrep -i error /var/log/auth.log
查看文件类型filefile /etc/hosts
查看命令位置whichwhich cat
创建硬链接lnln a b
创建软链接ln -sln -s a b
打包tar cftar cf a.tar dir/
压缩tar caftar caf etc-$(date +%F).tar.gz /etc/
解压tar xftar xf etc-2026-07-18.tar.gz
命令帮助--help/mandate --help
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐