Linux 基础入门 第一章
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 表由很多字段和记录组成
字段
-
inode 索引号(编号)
唯一
可定位表里的某一行记录
-
文件类型
-
权限
-
硬链接数
硬链接数不为0不会删除记录
-
属主(UID)
-
属组(GID)
-
大小
-
时间
-
指针
指向记录对应的数据块起始位置,配合文件大小记录即可确定整个文件的数据,前提是数据库是连续存放
数据块分散存放使用多个指针
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 命令(压缩 / 解压缩) | 压缩比 | 压缩速度 | 压缩包后缀 | 用途 |
|---|---|---|---|---|---|
| gzip | tar czvf / tar xzvf | 中 | 快 | .tar.gz | 日志归档(推荐) |
| bzip2 | tar cjvf / tar xjvf | 高 | 慢 | .tar.bz2 | |
| xz | tar 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范围 | 类型 | 说明 |
|---|---|---|
| 0 | root | 超级管理员 |
| 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 | 指定Shell | ubuntu默认使用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 对比
| 对比项 | su | sudo |
|---|---|---|
| 切换方式 | 完全切换用户 | 临时提权 |
| 密码 | 需要目标密码 | 使用自身密码 |
| 审计 | 难以追踪 | 有日志记录 |
| 权限粒度 | 全部权限 | 可精细控制 |
| 推荐程度 | 不推荐 | 推荐 |
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/secureUbuntu:
/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 | - 022 | 644 |
| 目录 | 777 | - 022 | 755 |
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)
| 权限类型 | 表示符号 | 数字值 | 作用位置 | 功能 |
|---|---|---|---|---|
| SUID | s (属主 x 位) | 4 | 文件 | 以文件所有者执行 (通常为root) |
| SGID | s (属组 x 位) | 2 | 目录 | 继承目录属组 |
| Sticky Bit | t (其他 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/O | chattr +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辅助的安全工作流

向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 需求
| 组名 | 组成员 | 权限 |
|---|---|---|
| devops | ruoyi-admin | 可重启 Nginx |
| dba | ruoyi-dba | 可管理 MySQL |
| developer | ruoyi-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/ruoyi | ruoyi | ruoyi | 755 | 应用根目录 |
| /opt/ruoyi/config | ruoyi | ruoyi | 750 | 配置文件(组内可访问) |
| /opt/ruoyi/logs | ruoyi | ruoyi | 755 | 日志目录 |
| /opt/ruoyi/backend/ruoyi-damin.jar | ruoyi | ruoyi | 644 | jar包 |
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 需求
| 角色 | 组名 | 组成员 | 权限 |
|---|---|---|---|
| 运维组 | ops | ruoyi-ops | 可重启 Nginx,可查看应用日志 |
| DBA 组 | dba | ruoyi-dba | 可管理 MySQL |
| 开发组 | dev | ruoyi-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
十五、命令总结
| 目标 | 命令 | 示例 |
|---|---|---|
| 看自己在哪 | pwd | pwd |
| 看目录内容 | ls | ls -la |
| 看目录结构树 | tree | tree /opt/ruoyi |
| 跳转至指定目录 | cd | cd /opt/ruoyi,cd - |
| 创建目录 | mkdir | mkidr -p a/b/c |
| 创建文件 | touch | touch file.txt |
| 复制 | cp | cp -r dir1 dir2 |
| 移动/重命名 | mv | mv file.txt dir/ |
| 删除 | rm | rm -rf dir/ |
| 查看文件内容 | cat | cat /etc/os-release |
| 分页查看大文件 | less | less /var/log/auth.log |
| 查看文件开头部分 | head | head -5 /etc/passwd |
| 查看文件结尾部分 | tail | tail -f /var/log/syslog |
| 搜索关键词 | grep | grep -i error /var/log/auth.log |
| 查看文件类型 | file | file /etc/hosts |
| 查看命令位置 | which | which cat |
| 创建硬链接 | ln | ln a b |
| 创建软链接 | ln -s | ln -s a b |
| 打包 | tar cf | tar cf a.tar dir/ |
| 压缩 | tar caf | tar caf etc-$(date +%F).tar.gz /etc/ |
| 解压 | tar xf | tar xf etc-2026-07-18.tar.gz |
| 命令帮助 | --help/man | date --help |
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)