几大操作系统辨析(一)
学习笔记
- 总览
| 派系 | 包管理器 | 核心特点 | 代表系统 |
|---|---|---|---|
| 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-release、uname -a、lscpu、free -h、df -h 和 ss -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
排查思路:
- 先用
df -h确认哪个分区空间不足 - 用
find命令定位大文件 - 检查
/var/log/(日志)、/tmp/(临时文件)、/var/cache/(缓存)等常见目录 - 注意容器相关目录:
/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
排查步骤:
- 使用
top或htop快速识别高CPU进程 - 用
pidstat查看进程的详细CPU统计 - 如果是Java/Python等应用,检查是否有死循环或GC问题
- 使用
strace或perf进行更深入的性能分析
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
解决步骤:
- 确认端口确实被占用:
ss -tulnp | grep :端口号 - 查看占用进程:
sudo lsof -i :端口号 - 决定处理方式:
- 如果是预期内的服务,检查配置是否正确
- 如果是未知进程,考虑停止它:
sudo kill <PID>或sudo kill -9 <PID> - 如果是僵尸进程,可能需要重启相关服务
- 检查防火墙设置,确保端口已开放
综合排查示例
# 快速检查系统三大核心问题
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. 注意事项
-
引号的使用:
# 双引号:变量会展开 echo "PATH is $PATH" # 单引号:变量不会展开 echo 'PATH is $PATH' # 反引号或$():命令替换 echo "Today is $(date)" echo "Today is `date`" -
特殊字符转义:
# 使用反斜杠转义 echo "Price: \$100" echo "Path: /home/user/my\ documents" # 或使用引号 echo 'Price: $100' echo "Path: /home/user/my documents" -
命令组合:
# 顺序执行 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(读)= 4w(写)= 2x(执行)= 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 filename或chmod 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)
- 作用:
- 对文件:执行时以文件所属组的身份运行
- 对目录:在该目录下创建的新文件会继承目录的所属组
- 表示:在所属组执行位显示为
s(如drwxr-sr-x) - 设置:
chmod g+s filename或chmod 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 directory或chmod 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)基础
注意:以下内容仅用于安全审计和学习,未经授权的提权是违法行为。
常见提权向量
- 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)"
- sudo权限滥用
# 查看当前用户的sudo权限
sudo -l
# 检查可以在不输入密码的情况下以root身份运行的命令
sudo -l | grep NOPASSWD
- 计划任务(Cron Jobs)
# 查看系统计划任务
ls -la /etc/cron*
cat /etc/crontab
ls -la /var/spool/cron/
# 检查可写的计划任务脚本
find /etc/cron* -type f -writable 2>/dev/null
- 环境变量PATH滥用
# 检查当前PATH
echo $PATH
# 查找可写目录是否在PATH中
echo $PATH | tr ':' '\n' | while read dir; do [ -w "$dir" ] && echo "可写目录在PATH中: $dir"; done
安全加固建议
- 最小权限原则:只给必要的权限
- 定期审计:检查SUID/SGID文件、可写目录等
- 使用ACL:替代宽松的777权限
- 设置umask:控制新建文件的默认权限
# 设置严格的umask(新建文件644,目录755)
umask 022
# 在/etc/profile或~/.bashrc中永久设置
echo "umask 022" >> ~/.bashrc
- 监控系统日志
# 监控认证日志
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 提供了额外的安全层。掌握文件权限、用户管理和特殊权限是系统管理的基础:
- 基本权限:
chmod、chown、chgrp控制读/写/执行 - 特殊权限:SUID、SGID、SBIT 提供高级控制
- 隐藏属性:
chattr、lsattr提供额外保护 - ACL:
setfacl、getfacl实现细粒度权限控制 - 安全审计:定期检查权限,遵循最小权限原则
正确配置权限不仅能保护系统安全,还能实现灵活的协作环境。在实际工作中,应结合业务需求和安全策略,合理运用这些工具和技术。
下表详细对比 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/yum,dpkg 对应 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-releaselsb_release -a |
cat /etc/os-releasecat /etc/redhat-release(RHEL系特有) |
/etc/os-release 是通用标准 |
| 查看内核 | uname -runame -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 showifconfig(需安装 net-tools) |
同左 | ip 命令是推荐方式 |
| 测试连通性 | ping <目标> |
同左 | ||
| 查看路由 | ip routeroute -n |
同左 | ||
| 查看监听端口 | ss -tulnpnetstat -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 --permanentsudo 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) | 说明与注意事项 |
|---|---|---|---|---|
| 主机名配置 | 查看当前主机名 | hostnamehostnamectl |
hostnamehostnamectl |
命令相同,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 showifconfig(需安装 net-tools) |
ip addr showifconfig(需安装 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.confsystemd-resolve --status |
cat /etc/resolv.confnmcli 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 maindeb-src http://archive.ubuntu.com/ubuntu focal main |
[base]name=CentOS-$releasever - Basebaseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/gpgcheck=1gpgkey=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:30at 10:00 tomorrow |
at 14:30at 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 -ecrontab -lcrontab -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/crontab2. 在 /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 红帽系在系统配置管理上的主要差异:
- 网络配置:Debian 系使用
/etc/network/interfaces(传统)或/etc/netplan/*.yaml(新),RHEL 系使用/etc/sysconfig/network-scripts/ifcfg-*文件。 - 软件源:Debian 系使用
/etc/apt/sources.list和.list文件,RHEL 系使用/etc/yum.repos.d/*.repo文件。 - 服务管理:两者都使用 systemd,命令基本一致。
- 任务调度:
at和cron命令完全一致,但 cron 日志位置不同。 - 时间同步:Debian 系默认使用 systemd-timesyncd,RHEL 系默认使用 chronyd。
掌握这些配置差异,可以帮助你在不同 Linux 发行版上快速进行系统配置和管理,提高工作效率。
- 包管理器:Debian 系用
apt/dpkg,RHEL 系用dnf/yum/rpm,命令语法不同但功能对应。 - 系统日志:Debian 系主要日志在
/var/log/syslog,RHEL 系在/var/log/messages;认证日志分别为/var/log/auth.log和/var/log/secure。 - 防火墙:Debian 系常用
ufw(底层仍是 iptables),RHEL 系用firewalld(RHEL 7+)或直接iptables。 - 软件源配置:Debian 系用
/etc/apt/sources.list和/etc/apt/sources.list.d/,RHEL 系用/etc/yum.repos.d/(.repo文件)。 - Python 2:RHEL 8+ 默认不安装 Python 2,而 Debian 系可能仍保留
python命令指向 Python 2(但建议使用python3)。
掌握这些差异能帮助你在不同 Linux 发行版之间无缝切换,快速定位命令和配置文件。
全文总结
本文全面介绍了 Linux 系统管理的核心知识和技能,涵盖了系统侦察、故障排查、Shell 核心概念、权限管理以及不同 Linux 发行版的差异对比。以下是本文的主要内容总结:
一、Linux 系统快速侦察
- 系统信息获取:通过
cat /etc/os-release、uname -a等命令快速确定系统派系和内核版本 - 软件包管理:掌握不同发行版的包管理器命令(apt/dpkg、dnf/yum/rpm、pacman、zypper)
- 硬件与性能检查:使用
lscpu、free -h、df -h、top等命令了解系统资源使用情况 - 网络与设备检测:通过
ip addr、ss -tulnp、lsusb、lspci等命令查看网络连接和外设 - 进程与服务管理:使用
ps aux、systemctl等命令监控运行中的软件和服务 - 任务与日志检查:通过
crontab -l、last等命令了解系统任务和登录历史
二、常见问题快速排查
- 磁盘空间不足:使用
df -h定位问题分区,find命令查找大文件,清理临时文件和缓存 - 高CPU占用排查:通过
top、pidstat、ps aux等工具识别高CPU进程,分析线程级问题 - 网络端口冲突:使用
ss -tulnp、lsof检查端口占用,结合防火墙配置解决问题
三、Shell 核心概念
- 管道(
|):命令间数据传递,构建处理流水线 - 重定向:
>、>>、<、<<、<<<等操作符控制输入输出流向 - 环境变量:系统配置和程序行为的关键,掌握查看、设置和常用变量
- 通配符:
*、?、[]等模式匹配,以及扩展通配符和花括号扩展 - 命令组合与转义:引号使用、特殊字符转义、命令组合(
;、&&、||)
四、RHEL 红帽系文件权限与用户管理
- 基础权限:理解
rwx权限模型,掌握chmod、chown、chgrp命令 - 用户与组管理:用户/组的增删改查,密码策略设置
- 特殊权限:SUID、SGID、SBIT 的原理和应用场景
- 高级权限控制:隐藏属性(
chattr、lsattr)和访问控制列表(ACL) - 安全审计与提权:权限检查工具、常见提权向量和安全加固建议
五、Debian 系 vs RHEL 红帽系对比
- 命令与配置差异:包管理器、日志位置、防火墙工具、软件源配置等核心区别
- 系统配置管理:主机名配置、网络配置、软件源管理、任务调度等方面的具体差异
- 实用配置示例:提供了主机名、网络、软件源、计划任务的具体配置方法
实践出真知,命令行是最好的老师。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)