学习笔记

  • 总览
派系 包管理器 核心特点 代表系统
Debian 系 apt/dpkg 软件生态极丰富,新手友好 Ubuntu、统信 UOS、麒麟、Mint
RHEL 红帽系 dnf/rpm 企业稳定,服务器生态强 RHEL、Rocky、龙蜥
SUSE 系 zypper 独立 rpm,YaST 图形管理工具 openSUSE、SLES
Arch 系 pacman 滚动更新,软件永远最新 Arch、Manjaro
独立特殊 apk/emerge 容器 / 源码编译专用 Alpine、Gentoo
  • 补充说明
    虽然Ubnutu有服务器版本和桌面版本,但本质上是同一个系统,内核同源但裁剪、预装完全不同。二者底层内核、apt 包管理器、软件源完全一模一样,只是预装软件和默认配置有区别:
# 桌面改服务器
sudo apt install openssh-server nginx
# 服务器改桌面
sudo apt install ubuntu-desktop

快速侦察:拿到 Linux 系统后如何快速了解系统状态?

当你需要快速了解一个 Linux 系统的详细状态时(例如接手新服务器、排查问题或安全评估),可以执行以下命令来获取关键信息:

1. 确定系统派系与内核版本

# 查看系统发行版信息(最准确的方法)
cat /etc/os-release

# 查看内核版本与架构
uname -a
# 或单独查看内核版本
uname -r

# 对于 Debian/Ubuntu 系,还可以用
lsb_release -a

# 对于 RHEL/CentOS/Rocky 系
cat /etc/redhat-release

2. 查看已安装软件

# Debian/Ubuntu 系(apt/dpkg)
dpkg -l | head -20        # 查看前20个已安装包
apt list --installed | head -20

# RHEL/CentOS/Rocky/Fedora 系(dnf/rpm)
rpm -qa | head -20        # 查看前20个已安装RPM包
dnf list installed | head -20

# Arch/Manjaro 系(pacman)
pacman -Q | head -20

# openSUSE/SLES 系(zypper)
zypper se --installed-only | head -20

3. 检查系统性能与硬件

# 查看CPU信息(核心数、型号、频率)
lscpu
# 或
cat /proc/cpuinfo | grep -E "processor|model name|cores" | head -10

# 查看内存使用情况
free -h

# 查看磁盘使用情况
df -h

# 查看系统负载(1分钟、5分钟、15分钟平均负载)
uptime

# 实时监控系统性能(按q退出)
top -n 1 | head -20
# 或使用更友好的htop(如果已安装)
# htop

4. 检测外联设备与网络

# 查看网络接口与IP地址
ip addr show
# 或传统命令
ifconfig

# 查看网络连接状态
ss -tulnp | head -20        # 显示监听端口和进程
# 或使用netstat(如果ss不可用)
# netstat -tulnp | head -20

# 查看USB设备
lsusb

# 查看PCI设备
lspci

# 查看块设备(硬盘、U盘等)
lsblk

5. 查看正在运行的软件与进程

# 查看所有进程(完整格式)
ps aux | head -20

# 查看特定进程(如nginx、mysql、docker)
ps aux | grep -E "nginx|mysql|docker|ssh"

# 查看系统服务状态(systemd系统)
systemctl list-units --type=service --state=running | head -20

# 查看启动项(systemd)
systemctl list-unit-files --state=enabled | head -20

6. 检查系统任务与计划

# 查看当前用户的计划任务
crontab -l

# 查看系统计划任务
ls -la /etc/cron.*/
cat /etc/crontab

# 查看系统日志最近记录(最近20行)
sudo tail -20 /var/log/syslog        # Debian/Ubuntu
sudo tail -20 /var/log/messages      # RHEL/CentOS

# 查看最近登录用户
last -n 10

7. 一键收集所有信息(脚本示例)

创建一个快速侦察脚本 system_recon.sh

#!/bin/bash
echo "=== 系统侦察报告 ==="
echo "生成时间: $(date)"
echo ""
echo "1. 系统信息:"
cat /etc/os-release
echo ""
echo "2. 内核版本:"
uname -a
echo ""
echo "3. CPU信息:"
lscpu | grep -E "Model name|CPU\(s\)"
echo ""
echo "4. 内存使用:"
free -h
echo ""
echo "5. 磁盘使用:"
df -h | head -10
echo ""
echo "6. 网络接口:"
ip addr show | grep -E "inet|state" | head -10
echo ""
echo "7. 监听端口:"
ss -tulnp | head -10
echo ""
echo "8. 运行进程TOP10:"
ps aux --sort=-%cpu | head -11

给脚本执行权限并运行:

chmod +x system_recon.sh
./system_recon.sh > system_report.txt

总结

这些命令可以帮助你在几分钟内全面了解一个 Linux 系统的状态。建议按需组合使用,对于生产环境,可以先从 cat /etc/os-releaseuname -alscpufree -hdf -hss -tulnp 开始,快速掌握系统的基本情况。

常见问题快速排查

在掌握了系统基本状态后,当遇到具体问题时,可以快速使用以下命令进行排查:

1. 磁盘空间不足的快速定位

当系统提示磁盘空间不足时,可以按以下步骤快速定位大文件:

# 1. 查看各分区使用情况(快速定位哪个分区满了)
df -h

# 2. 查找指定目录下的大文件(例如查找大于100MB的文件)
# 从根目录开始查找(可能需要sudo权限)
sudo find / -type f -size +100M 2>/dev/null | head -20

# 3. 按目录统计磁盘使用情况(查看哪个目录占用最多)
sudo du -sh /* 2>/dev/null | sort -hr | head -10

# 4. 查找最近修改的大文件(可能最近产生的日志或临时文件)
sudo find / -type f -size +50M -mtime -7 2>/dev/null | head -10

# 5. 清理常见临时文件
# 清理apt缓存(Debian/Ubuntu)
sudo apt clean
# 清理yum/dnf缓存(RHEL/CentOS)
sudo yum clean all  # 或 sudo dnf clean all
# 清理journal日志(保留最近7天)
sudo journalctl --vacuum-time=7d

排查思路

  1. 先用 df -h 确认哪个分区空间不足
  2. find 命令定位大文件
  3. 检查 /var/log/(日志)、/tmp/(临时文件)、/var/cache/(缓存)等常见目录
  4. 注意容器相关目录:/var/lib/docker/(Docker)、/var/lib/containers/(Podman)

2. 排查高CPU占用进程

当系统响应变慢,CPU使用率异常高时:

# 1. 实时查看CPU占用最高的进程(按CPU排序)
top
# 或使用更友好的界面(如果已安装htop)
# htop

# 2. 查看进程的详细CPU使用情况(需要安装sysstat)
pidstat -u 1 5  # 每1秒采样一次,共5次

# 3. 查看特定进程的CPU使用详情
pidstat -p <PID> -u 1 3  # 监控指定PID的CPU使用

# 4. 查看CPU使用率最高的前10个进程
ps aux --sort=-%cpu | head -11

# 5. 按用户统计CPU使用
ps -eo user,pcpu,pmem,args --sort=-pcpu | head -20

# 6. 查看进程的线程信息(CPU占用可能来自某个线程)
top -H -p <PID>  # 查看指定进程的所有线程
# 或
ps -eLf | grep <进程名> | head -10

排查步骤

  1. 使用 tophtop 快速识别高CPU进程
  2. pidstat 查看进程的详细CPU统计
  3. 如果是Java/Python等应用,检查是否有死循环或GC问题
  4. 使用 straceperf 进行更深入的性能分析

3. 网络端口冲突检查方法

当服务启动失败,提示"Address already in use"时:

# 1. 查看所有监听端口及对应进程
sudo ss -tulnp
# 或使用netstat
# sudo netstat -tulnp

# 2. 检查特定端口是否被占用(例如检查80端口)
sudo ss -tulnp | grep :80
sudo lsof -i :80  # 另一种检查方式

# 3. 查看端口占用进程的详细信息
sudo lsof -i :<端口号>
# 例如:sudo lsof -i :3306  # 查看MySQL端口

# 4. 根据PID查找进程详情
ps aux | grep <PID>
# 或直接查看进程信息
cat /proc/<PID>/status | head -20

# 5. 查看端口连接状态(ESTABLISHED、TIME_WAIT等)
ss -t state established  # 查看已建立的TCP连接
ss -t state time-wait    # 查看TIME_WAIT状态的连接

# 6. 检查防火墙规则是否阻止了端口
# Ubuntu/Debian (ufw)
sudo ufw status verbose
# RHEL/CentOS (firewalld)
sudo firewall-cmd --list-all

解决步骤

  1. 确认端口确实被占用:ss -tulnp | grep :端口号
  2. 查看占用进程:sudo lsof -i :端口号
  3. 决定处理方式:
    • 如果是预期内的服务,检查配置是否正确
    • 如果是未知进程,考虑停止它:sudo kill <PID>sudo kill -9 <PID>
    • 如果是僵尸进程,可能需要重启相关服务
  4. 检查防火墙设置,确保端口已开放

综合排查示例

# 快速检查系统三大核心问题
echo "=== 系统快速排查 ==="
echo "1. 磁盘空间检查:"
df -h | grep -E "^/dev|Filesystem"
echo ""
echo "2. CPU占用TOP5:"
ps aux --sort=-%cpu | head -6
echo ""
echo "3. 内存占用TOP5:"
ps aux --sort=-%mem | head -6
echo ""
echo "4. 常用端口占用情况:"
sudo ss -tulnp | grep -E ":80|:443|:22|:3306|:6379" 2>/dev/null || echo "需要sudo权限"

掌握这些排查命令,可以在遇到常见系统问题时快速定位原因,提高故障处理效率。

单从上面最基础的操作,就能看到不同的操作系统,命令不一样,处理文件的位置也不一样。

Shell 核心概念:管道、重定向、环境变量与通配符

在深入不同操作系统差异之前,理解 Shell 的核心概念是基础。这些概念在几乎所有 Linux/Unix 系统中都是通用的,掌握它们能让你更高效地使用命令行。

1. 管道(Pipe)|

管道用于将一个命令的输出作为另一个命令的输入,实现命令间的数据传递。

# 基本语法:command1 | command2

# 示例1:查找包含特定关键词的进程
ps aux | grep nginx

# 示例2:统计当前目录下文件数量
ls -la | wc -l

# 示例3:查看占用内存最多的前5个进程
ps aux --sort=-%mem | head -6

# 示例4:多层管道处理
cat /var/log/syslog | grep "error" | sort | uniq -c | sort -nr

管道的特点

  • 数据从左到右流动
  • 前一个命令的输出是后一个命令的输入
  • 可以串联多个管道形成处理流水线

2. 重定向(Redirection)

重定向用于改变命令的输入/输出方向,主要有三种类型:

2.1 输出重定向 >>>
# > 覆盖写入文件(如果文件不存在则创建)
echo "Hello World" > output.txt
ls -la > file_list.txt

# >> 追加到文件末尾
date >> log.txt
echo "New entry" >> log.txt

# 2> 重定向错误输出
ls /nonexistent 2> error.log

# &> 重定向所有输出(标准输出+错误输出)
command &> all_output.txt
2.2 输入重定向 <
# < 从文件读取输入
sort < unsorted.txt
wc -l < data.txt

# << 内联输入(Here Document)
cat << EOF
这是多行文本
可以直接在命令行输入
直到遇到指定的结束标记(EOF)
EOF

# <<< 内联字符串(Here String)
grep "keyword" <<< "这是一行包含keyword的文本"
2.3 特殊重定向
# /dev/null:丢弃输出(黑洞设备)
command > /dev/null 2>&1  # 丢弃所有输出

# /dev/zero:产生空字符流
dd if=/dev/zero of=empty_file bs=1M count=10

# /dev/random:产生随机数据
head -c 100 /dev/random > random_data.bin

3. 环境变量(Environment Variables)

环境变量是存储在系统中的键值对,影响程序行为和系统配置。

3.1 查看环境变量
# 查看所有环境变量
env
printenv

# 查看特定环境变量
echo $PATH
echo $HOME
echo $USER
echo $SHELL

# 查看变量及其定义(包括shell变量)
set | head -20
3.2 设置环境变量
# 临时设置(仅当前shell有效)
export MY_VAR="value"
export PATH=$PATH:/usr/local/bin

# 永久设置(添加到shell配置文件)
# Bash用户:~/.bashrc 或 ~/.bash_profile
echo 'export MY_VAR="value"' >> ~/.bashrc
source ~/.bashrc  # 立即生效

# 查看变量值
echo $MY_VAR
3.3 常用环境变量
变量名 用途 示例值
PATH 命令搜索路径 /usr/local/bin:/usr/bin:/bin
HOME 用户家目录 /home/username
USER 当前用户名 username
SHELL 当前shell /bin/bash
PWD 当前工作目录 /home/username/projects
LANG 语言环境 en_US.UTF-8
PS1 命令提示符格式 \u@\h:\w\$

4. 通配符(Wildcards)

通配符用于模式匹配,简化文件操作。

4.1 基本通配符
# * 匹配任意字符(包括空字符)
ls *.txt          # 所有.txt文件
ls *.log          # 所有.log文件
rm *.tmp          # 删除所有.tmp文件

# ? 匹配单个字符
ls file?.txt      # file1.txt, file2.txt, fileA.txt
ls test?.sh       # test1.sh, testA.sh

# [] 匹配指定范围内的单个字符
ls file[0-9].txt  # file0.txt 到 file9.txt
ls [abc]*.txt     # 以a、b或c开头的.txt文件
ls [!0-9]*        # 不以数字开头的文件
4.2 扩展通配符(需要开启extglob)
# 开启扩展通配符(Bash)
shopt -s extglob

# ?(pattern) 匹配0次或1次
ls test@(.*)      # test 和 test.xxx

# *(pattern) 匹配0次或多次
ls *.@(txt|log)   # 所有.txt或.log文件

# +(pattern) 匹配1次或多次
ls +([0-9]).txt   # 纯数字文件名.txt

# @(pattern1|pattern2) 匹配其中之一
ls @(*.txt|*.log) # 所有.txt或.log文件

# !(pattern) 匹配除pattern外的
ls !(*.txt)       # 所有非.txt文件
4.3 花括号扩展 {}
# 生成序列
echo {1..10}      # 1 2 3 4 5 6 7 8 9 10
echo {a..d}       # a b c d
echo {01..10}     # 01 02 03 ... 10

# 组合扩展
mkdir -p dir{1..3}/{sub1,sub2}
# 创建: dir1/sub1, dir1/sub2, dir2/sub1, dir2/sub2, dir3/sub1, dir3/sub2

# 文件操作
cp config{.bak,}  # 复制config.bak为config
mv file{,.old}    # 重命名file为file.old

5. 综合应用示例

# 示例1:查找并统计包含"error"的日志行数
grep -i "error" /var/log/syslog | wc -l > error_count.txt

# 示例2:批量重命名文件
for file in *.jpg; do
    mv "$file" "photo_${file}"
done

# 示例3:创建测试目录结构
mkdir -p project/{src/{main,test}/java,lib,docs,config}

# 示例4:设置Java环境变量
echo 'export JAVA_HOME=/usr/lib/jvm/java-11-openjdk' >> ~/.bashrc
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

# 示例5:查找并压缩所有.log文件
find /var/log -name "*.log" -type f -mtime +7 | xargs tar -czf old_logs.tar.gz

6. 注意事项

  1. 引号的使用

    # 双引号:变量会展开
    echo "PATH is $PATH"
    
    # 单引号:变量不会展开
    echo 'PATH is $PATH'
    
    # 反引号或$():命令替换
    echo "Today is $(date)"
    echo "Today is `date`"
    
  2. 特殊字符转义

    # 使用反斜杠转义
    echo "Price: \$100"
    echo "Path: /home/user/my\ documents"
    
    # 或使用引号
    echo 'Price: $100'
    echo "Path: /home/user/my documents"
    
  3. 命令组合

    # 顺序执行
    command1 ; command2  # 无论command1是否成功都执行command2
    
    # 逻辑与
    command1 && command2  # 只有command1成功才执行command2
    
    # 逻辑或
    command1 || command2  # 只有command1失败才执行command2
    

掌握这些 Shell 核心概念后,你将能更灵活地组合命令,编写高效的脚本,并在不同 Linux 发行版间自如切换。

Debian 系 vs RHEL 红帽系:常用命令与配置对比

RHEL 红帽系文件权限与用户管理

在 Linux 系统中,文件权限和用户管理是系统安全的基础。RHEL 红帽系(包括 RHEL、CentOS、Rocky、AlmaLinux 等)遵循标准的 Linux 权限模型,但也有一些自己的工具和最佳实践。

1. 文件权限基础:所有者、所属组和其他人

每个 Linux 文件都有三组权限:所有者(owner)、所属组(group)和其他人(others)。

查看文件权限
# 查看文件详细信息(包含权限)
ls -l filename
# 示例输出:-rwxr-xr-- 1 user group 1024 Jan 1 12:00 filename

# 查看目录权限
ls -ld directory

权限字符串解析(如 -rwxr-xr--):

  • 第1位:文件类型(- 普通文件,d 目录,l 符号链接)
  • 第2-4位:所有者权限(rwx = 读/写/执行)
  • 第5-7位:所属组权限(r-x = 读/执行)
  • 第8-10位:其他人权限(r-- = 只读)
权限的数字表示
  • r(读)= 4
  • w(写)= 2
  • x(执行)= 1
  • -(无权限)= 0

示例:rwxr-xr-- = 754(7=4+2+1, 5=4+0+1, 4=4+0+0)

修改文件权限
# 使用数字模式
chmod 755 filename      # rwxr-xr-x
chmod 644 filename      # rw-r--r--
chmod 750 script.sh     # rwxr-x---

# 使用符号模式
chmod u+x script.sh     # 给所有者添加执行权限
chmod g-w filename      # 移除所属组的写权限
chmod o=r filename      # 设置其他人只读
chmod a+x script.sh     # 给所有人添加执行权限(a=all)
修改文件所有者和所属组
# 修改文件所有者
chown user filename
chown user:group filename  # 同时修改所有者和所属组
chown -R user directory/   # 递归修改目录下所有文件

# 修改文件所属组
chgrp group filename
chgrp -R group directory/  # 递归修改

2. 用户和组管理

查看用户和组信息
# 查看当前用户
whoami
id

# 查看用户详细信息
id username
finger username  # 需要安装 finger 包

# 查看所有用户
cat /etc/passwd
getent passwd

# 查看所有组
cat /etc/group
getent group

# 查看用户所属组
groups username
id -Gn username
添加用户
# 基本添加用户
sudo useradd username

# 添加用户并指定家目录
sudo useradd -m -d /home/username username

# 添加用户并指定登录shell
sudo useradd -s /bin/bash username

# 添加用户并指定UID(用户ID)
sudo useradd -u 1001 username

# 添加用户并指定主要组
sudo useradd -g groupname username

# 添加用户并指定附加组
sudo useradd -G wheel,developers username

# 设置用户密码
sudo passwd username
删除用户
# 删除用户但保留家目录
sudo userdel username

# 删除用户同时删除家目录
sudo userdel -r username

# 删除用户并删除家目录和邮件
sudo userdel -r -f username
修改用户信息
# 修改用户名(需要先确保用户未登录)
sudo usermod -l newname oldname
sudo mv /home/oldname /home/newname  # 修改家目录名

# 修改用户UID
sudo usermod -u 1002 username

# 修改用户主要组
sudo usermod -g groupname username

# 修改用户附加组(覆盖原有附加组)
sudo usermod -G wheel,admin username

# 修改用户登录shell
sudo usermod -s /bin/zsh username

# 修改用户家目录
sudo usermod -d /new/home/dir -m username

# 锁定用户账户(禁止登录)
sudo usermod -L username

# 解锁用户账户
sudo usermod -U username

# 修改用户密码过期时间
sudo chage -M 90 username      # 密码90天后过期
sudo chage -d 0 username       # 强制下次登录修改密码
添加和删除组
# 添加组
sudo groupadd groupname
sudo groupadd -g 1005 groupname  # 指定GID

# 删除组
sudo groupdel groupname

# 修改组名
sudo groupmod -n newgroupname oldgroupname

# 修改组GID
sudo groupmod -g 1006 groupname

# 将用户添加到附加组
sudo usermod -aG groupname username  # -a 表示追加,不覆盖原有组
# 或
sudo gpasswd -a username groupname

# 从组中移除用户
sudo gpasswd -d username groupname

3. 特殊权限:SUID、SGID、SBIT

除了基本的读/写/执行权限,Linux 还有三种特殊权限位:

SUID(Set User ID)
  • 作用:当用户执行具有 SUID 权限的文件时,会以文件所有者的身份执行
  • 表示:在所有者执行位显示为 s(如 -rwsr-xr-x
  • 设置:chmod u+s filenamechmod 4755 filename
  • 常见应用:/usr/bin/passwd/usr/bin/sudo
# 查看SUID文件
find / -type f -perm /4000 2>/dev/null | head -10

# 设置SUID
chmod u+s /path/to/program
# 或
chmod 4755 /path/to/program

# 移除SUID
chmod u-s /path/to/program
SGID(Set Group ID)
  • 作用:
    1. 对文件:执行时以文件所属组的身份运行
    2. 对目录:在该目录下创建的新文件会继承目录的所属组
  • 表示:在所属组执行位显示为 s(如 drwxr-sr-x
  • 设置:chmod g+s filenamechmod 2755 filename
# 查看SGID文件
find / -type f -perm /2000 2>/dev/null | head -10

# 设置目录SGID(新建文件继承组)
chmod g+s /shared/directory
# 或
chmod 2775 /shared/directory

# 设置文件SGID
chmod g+s /path/to/program
SBIT(Sticky Bit)
  • 作用:对目录设置,只有文件所有者、目录所有者或root才能删除/重命名目录中的文件
  • 表示:在其他人执行位显示为 t(如 drwxrwxrwt
  • 设置:chmod +t directorychmod 1777 directory
  • 常见应用:/tmp/var/tmp
# 查看Sticky Bit目录
find / -type d -perm /1000 2>/dev/null | head -10

# 设置Sticky Bit
chmod +t /shared/upload
# 或
chmod 1777 /shared/upload
特殊权限的数字表示
  • SUID = 4(4000)
  • SGID = 2(2000)
  • SBIT = 1(1000)
# 组合设置
chmod 4755 file    # SUID + rwxr-xr-x
chmod 2755 file    # SGID + rwxr-xr-x
chmod 1755 dir     # SBIT + rwxr-xr-x
chmod 6755 file    # SUID+SGID + rwxr-xr-x

4. 隐藏权限和访问控制列表(ACL)

隐藏权限(文件属性)

除了基本权限,Linux 还有隐藏的文件属性:

# 查看文件属性
lsattr filename

# 设置文件属性
chattr +i filename      # 设置不可修改(immutable)
chattr +a filename      # 只能追加(append-only)
chattr +A filename      # 不更新访问时间(noatime)

# 移除文件属性
chattr -i filename

# 常见属性:
# +i:不可修改、删除、重命名、创建硬链接(root也不能修改)
# +a:只能追加内容,不能修改已有内容
# +A:不更新访问时间
# +S:同步写入(实时写入磁盘)
# +c:自动压缩
访问控制列表(ACL)

ACL 提供了更细粒度的权限控制:

# 检查文件系统是否支持ACL
tune2fs -l /dev/sda1 | grep acl  # 对于ext文件系统

# 安装ACL工具(RHEL系)
sudo yum install acl        # RHEL 7
sudo dnf install acl       # RHEL 8+

# 查看ACL权限
getfacl filename
getfacl directory/

# 设置ACL权限
# 给特定用户添加权限
setfacl -m u:username:rwx filename
setfacl -m u:username:r-- directory/

# 给特定组添加权限
setfacl -m g:groupname:rx filename

# 设置默认ACL(对新创建的文件生效)
setfacl -d -m u:username:rwx directory/

# 移除特定ACL条目
setfacl -x u:username filename

# 移除所有ACL权限
setfacl -b filename

# 递归设置ACL
setfacl -R -m u:username:rx directory/
ACL权限示例
# 1. 允许开发组读写,其他用户只读
setfacl -m g:developers:rw project/
setfacl -m o::r project/

# 2. 允许特定用户访问,即使不在文件所属组
setfacl -m u:alice:rw shared_file.txt

# 3. 设置目录默认ACL,新文件自动继承
setfacl -d -m g:team:rw shared_dir/
setfacl -m g:team:rwx shared_dir/

# 4. 备份和恢复ACL
getfacl -R /shared > acl_backup.txt
setfacl --restore=acl_backup.txt

5. 权限检查与提权

权限检查工具
# 检查文件权限
namei -l /path/to/file

# 检查SUID/SGID文件(安全审计)
find / -type f -perm /4000 -ls 2>/dev/null   # SUID
find / -type f -perm /2000 -ls 2>/dev/null   # SGID

# 检查可写文件
find / -type f -writable 2>/dev/null | head -20
find / -type d -writable 2>/dev/null | head -20

# 检查没有所有者的文件
find / -nouser -o -nogroup 2>/dev/null | head -10
提权(Privilege Escalation)基础

注意:以下内容仅用于安全审计和学习,未经授权的提权是违法行为。

常见提权向量
  1. SUID/SGID 可执行文件
# 查找具有SUID权限的可执行文件
find / -type f -perm -u=s -ls 2>/dev/null

# 查找具有SGID权限的可执行文件
find / -type f -perm -g=s -ls 2>/dev/null

# 检查已知的可利用SUID程序
find / -type f -perm -u=s -exec ls -la {} \; 2>/dev/null | grep -E "(nmap|vim|find|bash|more|less|nano|cp|mv)"
  1. sudo权限滥用
# 查看当前用户的sudo权限
sudo -l

# 检查可以在不输入密码的情况下以root身份运行的命令
sudo -l | grep NOPASSWD
  1. 计划任务(Cron Jobs)
# 查看系统计划任务
ls -la /etc/cron*
cat /etc/crontab
ls -la /var/spool/cron/

# 检查可写的计划任务脚本
find /etc/cron* -type f -writable 2>/dev/null
  1. 环境变量PATH滥用
# 检查当前PATH
echo $PATH

# 查找可写目录是否在PATH中
echo $PATH | tr ':' '\n' | while read dir; do [ -w "$dir" ] && echo "可写目录在PATH中: $dir"; done
安全加固建议
  1. 最小权限原则:只给必要的权限
  2. 定期审计:检查SUID/SGID文件、可写目录等
  3. 使用ACL:替代宽松的777权限
  4. 设置umask:控制新建文件的默认权限
# 设置严格的umask(新建文件644,目录755)
umask 022

# 在/etc/profile或~/.bashrc中永久设置
echo "umask 022" >> ~/.bashrc
  1. 监控系统日志
# 监控认证日志
sudo tail -f /var/log/secure          # RHEL系
sudo tail -f /var/log/auth.log        # Debian系

# 监控sudo使用
sudo grep sudo /var/log/secure

6. 综合示例:搭建安全共享目录

# 1. 创建共享目录
sudo mkdir -p /shared/project
sudo chown root:developers /shared/project

# 2. 设置SGID(新建文件继承组)
sudo chmod 2775 /shared/project

# 3. 设置ACL,允许特定用户访问
sudo setfacl -m g:developers:rwx /shared/project
sudo setfacl -d -m g:developers:rwx /shared/project  # 默认ACL

# 4. 添加用户到developers组
sudo groupadd developers
sudo usermod -aG developers alice
sudo usermod -aG developers bob

# 5. 设置Sticky Bit(防止用户删除他人文件)
sudo chmod +t /shared/project/uploads

# 6. 验证权限
ls -ld /shared/project
# 输出:drwxrwsr-x+ 2 root developers 4096 Jan 1 12:00 /shared/project

getfacl /shared/project

总结

RHEL 红帽系的权限管理与标准 Linux 一致,但通过 SELinux 提供了额外的安全层。掌握文件权限、用户管理和特殊权限是系统管理的基础:

  1. 基本权限chmodchownchgrp 控制读/写/执行
  2. 特殊权限:SUID、SGID、SBIT 提供高级控制
  3. 隐藏属性chattrlsattr 提供额外保护
  4. ACLsetfaclgetfacl 实现细粒度权限控制
  5. 安全审计:定期检查权限,遵循最小权限原则

正确配置权限不仅能保护系统安全,还能实现灵活的协作环境。在实际工作中,应结合业务需求和安全策略,合理运用这些工具和技术。

下表详细对比 Debian 系(Ubuntu、Debian 等)和 RHEL 红帽系(RHEL、CentOS、Rocky、AlmaLinux 等)在解释器、基础命令、配置文件位置等方面的差异,帮助你在不同系统间快速切换。

类别 子项 Debian 系(Ubuntu/Debian) RHEL 红帽系(RHEL/CentOS/Rocky) 说明与注意事项
解释器与 Shell 默认 Shell /bin/bash(通常) /bin/bash(通常) 两者默认都是 bash,但可通过 chsh 修改
Python 2 python(可能需安装 python2 python2(RHEL 8+ 默认不安装) RHEL 8+ 已移除 Python 2,需手动安装
Python 3 python3(系统自带) python3(系统自带) 两者均预装 Python 3,但版本可能不同
Perl perl(预装) perl(预装) 版本可能略有差异
系统工作 包管理器 apt / dpkg dnf(RHEL 8+) / yum(RHEL 7) / rpm apt 对应 dnf/yumdpkg 对应 rpm
更新软件源 sudo apt update sudo dnf check-update(RHEL 8+)
sudo yum check-update(RHEL 7)
更新本地软件包索引
安装软件 sudo apt install <包名> sudo dnf install <包名>(RHEL 8+)
sudo yum install <包名>(RHEL 7)
删除软件 sudo apt remove <包名> sudo dnf remove <包名>(RHEL 8+)
sudo yum remove <包名>(RHEL 7)
搜索软件包 apt search <关键词> dnf search <关键词>(RHEL 8+)
yum search <关键词>(RHEL 7)
查看已安装 dpkg -l | grep <包名>
apt list --installed
rpm -qa | grep <包名>
dnf list installed(RHEL 8+)
系统状态 查看发行版 cat /etc/os-release
lsb_release -a
cat /etc/os-release
cat /etc/redhat-release(RHEL系特有)
/etc/os-release 是通用标准
查看内核 uname -r
uname -a
同左 命令完全一致
查看服务状态 systemctl status <服务名> 同左 两者均使用 systemd(RHEL 7+)
开机自启 systemctl enable <服务名> 同左
停止服务 systemctl stop <服务名> 同左
工作目录 用户家目录 /home/<用户名> 同左
根目录 / 同左
临时目录 /tmp 同左
配置文件目录 /etc 同左
文件操作 列出文件 ls -la 同左 命令完全一致
复制文件 cp <源> <目标> 同左
移动/重命名 mv <源> <目标> 同左
删除文件 rm <文件> 同左
查看文件内容 cat <文件>
less <文件>
head/tail <文件>
同左
查找文件 find / -name "文件名" 同左
目录操作 创建目录 mkdir <目录名> 同左
删除空目录 rmdir <目录名> 同左
删除非空目录 rm -rf <目录名> 同左 慎用
切换目录 cd <目录> 同左
查看当前目录 pwd 同左
打包压缩 打包 tar -cvf 打包名.tar 目录/ 同左 tar 命令完全一致
解包 tar -xvf 打包名.tar 同左
压缩(gzip) tar -czvf 打包名.tar.gz 目录/ 同左
解压(gzip) tar -xzvf 打包名.tar.gz 同左
压缩(zip) zip -r 打包名.zip 目录/ 同左(需安装 zip)
解压(zip) unzip 打包名.zip 同左(需安装 unzip)
搜索 文件内搜索 grep "关键词" 文件 同左
递归搜索 grep -r "关键词" 目录/ 同左
查找命令位置 which <命令>
whereis <命令>
同左
查找文件(按名) find / -type f -name "*.conf" 同左
查找文件(按大小) find / -type f -size +100M 同左
网络 查看 IP ip addr show
ifconfig(需安装 net-tools)
同左 ip 命令是推荐方式
测试连通性 ping <目标> 同左
查看路由 ip route
route -n
同左
查看监听端口 ss -tulnp
netstat -tulnp(需安装 net-tools)
同左 ss 是推荐方式
日志 系统日志 /var/log/syslog(主要)
/var/log/auth.log(认证)
/var/log/messages(主要)
/var/log/secure(认证)
重要差异:日志文件路径不同
查看日志 sudo tail -f /var/log/syslog sudo tail -f /var/log/messages
服务日志 journalctl -u <服务名> 同左 systemd 统一日志
计划任务 用户任务 crontab -l(查看)
crontab -e(编辑)
同左
系统任务 /etc/crontab
/etc/cron.*/ 目录
同左
防火墙 查看状态 sudo ufw status(如果使用 ufw) sudo firewall-cmd --list-all(firewalld)
sudo iptables -L(iptables)
重要差异:防火墙工具不同
开放端口 sudo ufw allow 80/tcp sudo firewall-cmd --add-port=80/tcp --permanent
sudo firewall-cmd --reload
软件源 源配置文件 /etc/apt/sources.list
/etc/apt/sources.list.d/
/etc/yum.repos.d/(RHEL 7)
/etc/dnf/dnf.conf/etc/yum.repos.d/(RHEL 8+)
重要差异:配置目录和格式不同
添加源 编辑 /etc/apt/sources.list 或添加 .list 文件到 /etc/apt/sources.list.d/ 添加 .repo 文件到 /etc/yum.repos.d/

系统配置管理对比:主机名、网络、软件源与任务调度

除了基本命令差异,Debian 系和 RHEL 红帽系在系统配置管理方面也有显著不同。下表对比了主机名配置、网络配置、软件源管理以及任务调度等方面的差异:

配置类别 具体任务 Debian 系(Ubuntu/Debian) RHEL 红帽系(RHEL/CentOS/Rocky) 说明与注意事项
主机名配置 查看当前主机名 hostname
hostnamectl
hostname
hostnamectl
命令相同,systemd 系统通用
临时修改主机名 sudo hostname 新主机名 sudo hostname 新主机名 重启后失效
永久修改主机名 sudo hostnamectl set-hostname 新主机名
或编辑 /etc/hostname
sudo hostnamectl set-hostname 新主机名
或编辑 /etc/hostname
systemd 系统通用方法
传统方法(非systemd) 编辑 /etc/hostname 后重启 编辑 /etc/sysconfig/network(RHEL 6) RHEL 7+ 已改用 systemd
网络配置 查看网络接口 ip addr show
ifconfig(需安装 net-tools)
ip addr show
ifconfig(需安装 net-tools)
ip 命令是推荐方式
临时配置IP sudo ip addr add 192.168.1.100/24 dev eth0 sudo ip addr add 192.168.1.100/24 dev eth0 重启网络服务后失效
永久配置IP(传统) 编辑 /etc/network/interfaces 编辑 /etc/sysconfig/network-scripts/ifcfg-eth0 重要差异:配置文件路径不同
永久配置IP(Netplan) 编辑 /etc/netplan/*.yaml(Ubuntu 18.04+) 不适用 Ubuntu 专用网络配置工具
永久配置IP(NetworkManager) nmcli 或编辑 /etc/NetworkManager/system-connections/ nmcli 或编辑 /etc/NetworkManager/system-connections/ NetworkManager 通用
重启网络服务 sudo systemctl restart networking(传统)
sudo netplan apply(Netplan)
sudo nmcli connection reload(NetworkManager)
sudo systemctl restart network(传统)
sudo nmcli connection reload(NetworkManager)
服务名不同:networking vs network
查看DNS配置 cat /etc/resolv.conf
systemd-resolve --status
cat /etc/resolv.conf
nmcli dev show
软件源配置 主配置文件 /etc/apt/sources.list /etc/yum.repos.d/*.repo(RHEL 7+)
/etc/dnf/dnf.conf 及 repos
核心差异:文件格式和位置
附加源目录 /etc/apt/sources.list.d/.list 文件) /etc/yum.repos.d/.repo 文件)
配置文件格式 deb http://archive.ubuntu.com/ubuntu focal main
deb-src http://archive.ubuntu.com/ubuntu focal main
[base]
name=CentOS-$releasever - Base
baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Debian 系每行一个源,RHEL 系分节配置
添加官方源 编辑 /etc/apt/sources.list 或添加文件到 /etc/apt/sources.list.d/ 下载 .repo 文件到 /etc/yum.repos.d/
添加第三方源(如EPEL) 通常提供 .list 文件或安装包 sudo yum install epel-release(RHEL 7)
sudo dnf install epel-release(RHEL 8+)
EPEL 是 RHEL 系重要的第三方源
更新软件源缓存 sudo apt update sudo yum makecache(RHEL 7)
sudo dnf makecache(RHEL 8+)
查看已启用源 grep -r "^deb" /etc/apt/sources.list /etc/apt/sources.list.d/ yum repolist(RHEL 7)
dnf repolist(RHEL 8+)
单次任务调度 立即执行命令 at now at now 需要安装 at
指定时间执行 at 14:30
at 10:00 tomorrow
at 14:30
at 10:00 tomorrow
查看待执行任务 atq atq
删除待执行任务 atrm 任务号 atrm 任务号
执行一次性任务示例 echo "shutdown -h now" | at 02:00 echo "shutdown -h now" | at 02:00 凌晨2点关机
常规任务调度 用户级计划任务 crontab -e(编辑)
crontab -l(查看)
crontab -r(删除)
crontab -e
crontab -l
crontab -r
命令完全一致
系统级计划任务 /etc/crontab
/etc/cron.d/
/etc/cron.hourly/
/etc/cron.daily/
/etc/cron.weekly/
/etc/cron.monthly/
/etc/crontab
/etc/cron.d/
/etc/cron.hourly/
/etc/cron.daily/
/etc/cron.weekly/
/etc/cron.monthly/
目录结构相同
cron 语法 分 时 日 月 周 用户 命令(系统级)
分 时 日 月 周 命令(用户级)
同左 语法完全一致
cron 示例(每5分钟) */5 * * * * /path/to/script.sh */5 * * * * /path/to/script.sh
cron 示例(每天2点) 0 2 * * * /path/to/backup.sh 0 2 * * * /path/to/backup.sh
查看cron日志 sudo grep CRON /var/log/syslog sudo grep CRON /var/log/cron 差异:日志文件不同
系统级任务添加方式 1. 编辑 /etc/crontab
2. 在 /etc/cron.d/ 添加文件
3. 将脚本放入 cron.{hourly,daily,weekly,monthly}/
同左
服务管理 查看服务状态 systemctl status 服务名 systemctl status 服务名 systemd 通用
启动/停止服务 sudo systemctl start/stop 服务名 sudo systemctl start/stop 服务名
启用/禁用开机自启 sudo systemctl enable/disable 服务名 sudo systemctl enable/disable 服务名
重启服务 sudo systemctl restart 服务名 sudo systemctl restart 服务名
查看所有服务 systemctl list-unit-files --type=service systemctl list-unit-files --type=service
时间同步 查看时间状态 timedatectl status timedatectl status systemd 通用
设置时区 sudo timedatectl set-timezone Asia/Shanghai sudo timedatectl set-timezone Asia/Shanghai
时间同步服务 systemctl status systemd-timesyncd(默认)
systemctl status chrony(如安装)
systemctl status chronyd(默认)
systemctl status ntpd(如安装)
差异:默认时间同步服务不同
手动同步时间 sudo chronyc makestep(chrony)
sudo ntpdate 时间服务器
sudo chronyc makestep(chronyd)
sudo ntpdate 时间服务器

配置示例

1. 配置主机名(永久)

Debian/Ubuntu & RHEL/CentOS(systemd 通用)

# 查看当前主机名
hostname
hostnamectl

# 永久修改主机名
sudo hostnamectl set-hostname server01.example.com

# 验证修改
hostnamectl status

# 更新 /etc/hosts(可选,建议更新)
echo "127.0.1.1 server01.example.com server01" | sudo tee -a /etc/hosts
2. 配置网络(传统方式)

Debian/Ubuntu(/etc/network/interfaces)

# 编辑网络配置
sudo nano /etc/network/interfaces

# 静态IP配置示例
auto eth0
iface eth0 inet static
    address 192.168.1.100
    netmask 255.255.255.0
    gateway 192.168.1.1
    dns-nameservers 8.8.8.8 8.8.4.4

# 重启网络服务
sudo systemctl restart networking

RHEL/CentOS(/etc/sysconfig/network-scripts/ifcfg-eth0)

# 编辑网络配置
sudo nano /etc/sysconfig/network-scripts/ifcfg-eth0

# 静态IP配置示例
TYPE=Ethernet
BOOTPROTO=static
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.1.100
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=8.8.8.8
DNS2=8.8.4.4

# 重启网络服务
sudo systemctl restart network
3. 配置软件源

Debian/Ubuntu

# 备份原有源
sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup

# 编辑源列表
sudo nano /etc/apt/sources.list

# 添加阿里云镜像源示例(Ubuntu 20.04)
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse

# 更新缓存
sudo apt update

RHEL/CentOS

# 备份原有源
sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

# 下载阿里云镜像源
sudo curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

# 清理并重建缓存
sudo yum clean all
sudo yum makecache

# 对于 RHEL 8+
sudo dnf clean all
sudo dnf makecache
4. 配置计划任务

单次任务(at)

# 安装 at(如未安装)
sudo apt install at        # Debian/Ubuntu
sudo yum install at       # RHEL/CentOS 7
sudo dnf install at       # RHEL/CentOS 8+

# 创建单次任务(明天凌晨2点重启)
echo "sudo shutdown -r now" | at 02:00 tomorrow

# 查看待执行任务
atq

# 删除任务(任务号从 atq 获取)
atrm 1

常规任务(cron)

# 编辑当前用户的cron任务
crontab -e

# 添加以下内容:
# 每天凌晨3点执行备份脚本
0 3 * * * /home/user/backup.sh

# 每5分钟检查服务状态
*/5 * * * * /home/user/check_service.sh

# 每周一早上6点清理日志
0 6 * * 1 /home/user/clean_logs.sh

# 查看当前用户的cron任务
crontab -l

# 系统级任务:在 /etc/cron.d/ 添加文件
sudo nano /etc/cron.d/myapp
# 内容:0 * * * * root /usr/local/bin/myapp-task.sh

总结

通过上表对比,可以看出 Debian 系和 RHEL 红帽系在系统配置管理上的主要差异:

  1. 网络配置:Debian 系使用 /etc/network/interfaces(传统)或 /etc/netplan/*.yaml(新),RHEL 系使用 /etc/sysconfig/network-scripts/ifcfg-* 文件。
  2. 软件源:Debian 系使用 /etc/apt/sources.list.list 文件,RHEL 系使用 /etc/yum.repos.d/*.repo 文件。
  3. 服务管理:两者都使用 systemd,命令基本一致。
  4. 任务调度atcron 命令完全一致,但 cron 日志位置不同。
  5. 时间同步:Debian 系默认使用 systemd-timesyncd,RHEL 系默认使用 chronyd。

掌握这些配置差异,可以帮助你在不同 Linux 发行版上快速进行系统配置和管理,提高工作效率。

  1. 包管理器:Debian 系用 apt/dpkg,RHEL 系用 dnf/yum/rpm,命令语法不同但功能对应。
  2. 系统日志:Debian 系主要日志在 /var/log/syslog,RHEL 系在 /var/log/messages;认证日志分别为 /var/log/auth.log/var/log/secure
  3. 防火墙:Debian 系常用 ufw(底层仍是 iptables),RHEL 系用 firewalld(RHEL 7+)或直接 iptables
  4. 软件源配置:Debian 系用 /etc/apt/sources.list/etc/apt/sources.list.d/,RHEL 系用 /etc/yum.repos.d/.repo 文件)。
  5. Python 2:RHEL 8+ 默认不安装 Python 2,而 Debian 系可能仍保留 python 命令指向 Python 2(但建议使用 python3)。

掌握这些差异能帮助你在不同 Linux 发行版之间无缝切换,快速定位命令和配置文件。

全文总结

本文全面介绍了 Linux 系统管理的核心知识和技能,涵盖了系统侦察、故障排查、Shell 核心概念、权限管理以及不同 Linux 发行版的差异对比。以下是本文的主要内容总结:

一、Linux 系统快速侦察

  1. 系统信息获取:通过 cat /etc/os-releaseuname -a 等命令快速确定系统派系和内核版本
  2. 软件包管理:掌握不同发行版的包管理器命令(apt/dpkg、dnf/yum/rpm、pacman、zypper)
  3. 硬件与性能检查:使用 lscpufree -hdf -htop 等命令了解系统资源使用情况
  4. 网络与设备检测:通过 ip addrss -tulnplsusblspci 等命令查看网络连接和外设
  5. 进程与服务管理:使用 ps auxsystemctl 等命令监控运行中的软件和服务
  6. 任务与日志检查:通过 crontab -llast 等命令了解系统任务和登录历史

二、常见问题快速排查

  1. 磁盘空间不足:使用 df -h 定位问题分区,find 命令查找大文件,清理临时文件和缓存
  2. 高CPU占用排查:通过 toppidstatps aux 等工具识别高CPU进程,分析线程级问题
  3. 网络端口冲突:使用 ss -tulnplsof 检查端口占用,结合防火墙配置解决问题

三、Shell 核心概念

  1. 管道(|:命令间数据传递,构建处理流水线
  2. 重定向>>><<<<<< 等操作符控制输入输出流向
  3. 环境变量:系统配置和程序行为的关键,掌握查看、设置和常用变量
  4. 通配符*?[] 等模式匹配,以及扩展通配符和花括号扩展
  5. 命令组合与转义:引号使用、特殊字符转义、命令组合(;&&||

四、RHEL 红帽系文件权限与用户管理

  1. 基础权限:理解 rwx 权限模型,掌握 chmodchownchgrp 命令
  2. 用户与组管理:用户/组的增删改查,密码策略设置
  3. 特殊权限:SUID、SGID、SBIT 的原理和应用场景
  4. 高级权限控制:隐藏属性(chattrlsattr)和访问控制列表(ACL)
  5. 安全审计与提权:权限检查工具、常见提权向量和安全加固建议

五、Debian 系 vs RHEL 红帽系对比

  1. 命令与配置差异:包管理器、日志位置、防火墙工具、软件源配置等核心区别
  2. 系统配置管理:主机名配置、网络配置、软件源管理、任务调度等方面的具体差异
  3. 实用配置示例:提供了主机名、网络、软件源、计划任务的具体配置方法

实践出真知,命令行是最好的老师。

Logo

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

更多推荐