Linux操作系统基础¶
概述¶
理解 Linux 的系统结构、文件系统和基础操作命令,是进行 Linux 安全测试的前提。本文从系统内核、Shell、文件系统、根目录结构等方面,深入讲解 Linux 的核心基础知识,并涵盖命令帮助系统、快捷键、环境变量和重定向等实用技能。
Linux系统结构¶
Linux操作系统由四个基本层次组成:
┌─────────────────────────────┐
│ 应用程序 (Applications) │ ← 用户直接使用的软件:浏览器、编辑器、服务器程序等
├─────────────────────────────┤
│ Shell(命令解释器) │ ← 接收用户命令,转换为系统调用
├─────────────────────────────┤
│ 文件系统 (File System) │ ← 管理文件的存储、组织和访问
├─────────────────────────────┤
│ 内核 (Kernel) │ ← 核心:进程管理、内存管理、驱动、网络、文件系统
└─────────────────────────────┘
Linux内核功能¶
内核是操作系统的核心,直接与硬件交互:
| 功能 | 说明 |
|---|---|
| 管理进程 | 创建、调度、终止进程;分配CPU时间片 |
| 管理内存 | 物理内存和虚拟内存的分配、回收、交换(Swap) |
| 管理驱动 | 加载和管理硬件设备驱动程序 |
| 管理文件和网络 | 实现文件系统、TCP/IP协议栈 |
专业解读:Linux是宏内核(Monolithic Kernel)架构,所有核心功能都运行在内核空间,效率高。与之相对的是微内核(如Minix、QNX),将部分功能移到用户空间,更稳定但性能稍低。Linux也支持内核模块(LKM)动态加载,兼顾了灵活性。
Linux Shell¶
Shell是用户与内核之间的接口,接收用户的命令,经过转换后交给内核执行。
Shell的工作示例:
Shell的作用: 1. 简化操作:用户只需输入简单的命令,无需了解复杂的系统调用 2. 安全:Shell可以检查用户权限,阻止非法操作
常见的Linux Shell:
| 名称 | 程序路径 | 作者 | 特点 |
|---|---|---|---|
| Bourne Shell (sh) | /usr/bin/sh 或 /bin/sh | Stephen Bourne | Unix最早的Shell,最基础 |
| C Shell (csh) | /usr/bin/csh | Bill Joy | 语法类似C语言 |
| K Shell (ksh) | /usr/bin/ksh | David Korn | 兼容sh,功能增强 |
| Bourne Again Shell (bash) | /bin/bash | Brian Fox | Linux默认Shell,功能最丰富 |
| Z Shell (zsh) | /bin/zsh | Paul Falstad | 功能强大,Oh-My-Zsh使其极受欢迎 |
专业解读:bash是CentOS等大多数Linux发行版的默认Shell。zsh因配置框架Oh-My-Zsh而备受开发者喜爱。Windows对应的命令行工具是cmd和PowerShell。
Shell与Terminal的区别: - Shell:命令解释器程序(软件) - Terminal(终端):提供与Shell交互的界面窗口(硬件或软件模拟)
Shell编程/Shell脚本:
- 将多个命令写入 .sh 文件,可以像程序一样执行
- 常用于自动化运维、批量处理、定时任务等
Linux文件系统¶
Linux的哲学是 "一切皆文件":
| 类型 | 说明 | 在系统中的表示 |
|---|---|---|
| 普通文件 | 文本、二进制、数据文件 | /home/user/file.txt |
| 目录文件 | 文件夹,也是一种特殊文件 | /home/user/ |
| 进程信息 | 内存中的进程信息 | /proc/1234/ |
| 设备文件 | 硬件设备抽象为文件 | /dev/sda(硬盘)、/dev/tty(终端) |
| 网络字节流 (socket) | 网络通信端点 | /var/run/docker.sock |
| 链接文件 | 指向另一个文件的快捷方式 | /usr/bin/python -> /usr/bin/python3 |
| 管道文件 | 进程间通信 | 匿名管道 |、命名管道 FIFO |
lsof命令:查看文件被哪些进程使用
| 命令 | 作用 |
|---|---|
lsof /bin/bash |
查找某个文件相关的进程 |
lsof -u root |
列出某个用户打开的文件信息 |
lsof -c redis |
列出某个程序进程所打开的文件信息 |
lsof -i tcp |
列出所有TCP网络连接信息 |
Linux根目录结构¶
Linux所有文件和目录都挂载在根目录 / 下,形成一棵树。
| 目录 | 作用 | 备注 |
|---|---|---|
| /bin | 存放普通用户可执行的基本命令 | 单用户模式下也能使用(如ls、cp、cat) |
| /boot | 开机引导目录 | 包含Linux内核文件(vmlinuz)和引导加载器(GRUB) |
| /dev | 设备目录 | 所有硬件设备及周边均放在这里(声卡、磁盘、光驱等) |
| /etc | 各种配置文件目录 | 系统级配置文件存放地(如/etc/hosts、/etc/fstab) |
| /lib | 库文件存放地 | bin和sbin需要的共享库文件,类似Windows的DLL |
| /media | 可移除设备挂载目录 | U盘、光盘、移动硬盘等临时挂载点 |
| /mnt | 用户临时挂载其他文件系统 | 额外的设备可手动挂载在这里 |
| /opt | 第三方软件安装目录 | 现在习惯性地放置在/usr/local中 |
| /proc | 虚拟文件系统 | 内存中的映射,系统运行时信息(如/proc/cpuinfo) |
| /root | 系统管理员(root)的主目录 | 其他用户的主目录在/home下 |
| /run | 系统运行时所需文件 | 以前放在/var/run,现拆分为独立目录,重启后重新生成 |
| /sbin | 只有root能运行的管理指令 | 如fdisk、ifconfig、reboot等系统管理命令 |
| /srv | 服务启动后需要访问的数据目录 | 如Web服务器的网页文件可放此处 |
| /sys | 虚拟文件系统 | 记录核心系统硬件信息,与proc类似但结构更规范 |
| /tmp | 存放临时文件目录 | 所有用户均可读写,重启后通常被清空 |
| /usr | 应用程序放置目录 | Unix System Resources,用户级程序和文件 |
| /var | 存放系统执行过程中经常改变的文件 | 日志(/var/log)、邮件、缓存等 |
专业解读: -
/usr/local:通常用于手动编译安装的软件,与系统包管理器安装的软件分离 -/var/log:系统日志目录,排查问题时经常查看 -/proc和/sys是伪文件系统,不占磁盘空间,是内核向用户空间暴露信息的窗口
用户主目录:
- root用户:/root
- 普通用户:/home/用户名
- 快速回到主目录:cd 或 cd ~
工作目录 (Working Directory):当前所在的目录。
目录指代符号:
| 符号 | 指代 |
|---|---|
/ |
根目录 |
. |
当前目录 |
.. |
上一级目录 |
~ |
当前用户的主目录(home directory) |
../../ |
上上级目录,以此类推 |
绝对路径与相对路径:
- 绝对路径:由根目录 / 开始写起,如 /usr/local/bin/nginx
- 相对路径:从当前所在目录开始写起,如 ./config/nginx.conf、../logs/error.log
Linux常用操作¶
命令帮助系统¶
Linux提供了完善的帮助系统:
| 命令 | 作用 | 说明 |
|---|---|---|
man command |
查看命令的详细手册 | manual,最权威的帮助文档,按 q 退出 |
whatis command |
命令的简要说明 | 一行描述命令功能 |
info command |
详细介绍 | GNU项目的文档格式,带超链接结构 |
help command |
查看内置命令帮助 | 仅适用于bash内置命令(如cd、echo) |
在线查询网站: - https://wangchujiang.com/linux-command (中文,推荐) - https://www.linuxcool.com (中文)
专业解读:
man手册分为多个章节,如man 1 ls(用户命令)、man 2 open(系统调用)、man 3 printf(C库函数)。常用man -a xxx查看所有章节。
关机与重启(root用户)¶
关机命令:
重启命令:
专业解读:生产环境中应使用
shutdown命令,因为它会给所有登录用户发送警告信息,并允许取消操作(shutdown -c)。
快捷键和命令¶
光标与编辑快捷键:
| 操作 | 按键 | 说明 |
|---|---|---|
| 光标移动到行尾 | Ctrl + E |
End of line |
| 光标移动到行首 | Ctrl + A |
Beginning of line |
| 清除光标后至行尾 | Ctrl + K |
Kill line(向后删除) |
| 清除光标前至行首 | Ctrl + U |
Unix line discard(向前删除) |
命令补全与历史:
| 操作 | 按键/命令 | 说明 |
|---|---|---|
| 补全命令和目录 | Tab |
自动提示,按两次显示所有候选 |
| 上一条命令 | ↑ |
浏览历史命令 |
| 下一条命令 | ↓ |
浏览历史命令 |
| 搜索历史命令 | Ctrl + R |
交互式搜索,回车执行 |
| 执行最近以cd开头的命令 | !cd |
历史命令扩展 |
| 清屏 | clear |
向上滚动屏幕,命令还在 |
| 查看历史命令 | history |
显示所有历史命令及编号 |
| 清除历史命令 | history -c |
清除当前会话历史 |
| 彻底清除历史 | echo > ~/.bash_history |
清空历史文件(centos) |
专业解读:bash历史文件存储在
~/.bash_history,zsh在~/.zsh_history。使用!n可以执行历史中第n条命令,!!执行上一条命令。
别名配置 (alias)¶
别名可以将长命令简化为短命令:
# 查看所有别名
alias
# 设置别名(临时生效,重启后失效)
alias ll='ls -alF'
# 永久生效:写入bash配置文件
vim ~/.bashrc
# 添加:alias short='xxx;xxx'
# 使配置立即生效
source ~/.bashrc
专业解读:
source命令读取并执行指定文件中的命令,常用于使配置文件修改立即生效,而不必重新登录。
通配符¶
通配符用于模糊匹配文件名:
| 符号 | 指代 | 示例 |
|---|---|---|
* |
任意字符(0个或多个) | ls *.log 匹配所有log文件 |
? |
单个字符 | ls file?.txt 匹配file1.txt、fileA.txt |
[] |
匹配范围中的单个字符 | [0-9] 匹配任意数字,[a-z] 匹配任意小写字母 |
{} |
多个模式匹配 | ll {*.log,*.txt} 匹配log或txt文件 |
^ |
取反(在[]内) | ls *[^txt] 查找不以txt结尾的文件 |
注意:
-f是ls的不排序选项,不能用于过滤文件。ls -f *[^txt]展示的是名字不包含txt字符的目录和文件,且因为-f会显示目录内容,行为可能与预期不同。过滤应使用其他命令如grep。
系统环境变量¶
环境变量是操作系统中存储配置信息的动态值,影响进程的运行环境。
查看环境变量:
环境变量配置文件:
| 文件 | 作用范围 | 说明 |
|---|---|---|
~/.bashrc |
当前用户 | 用户级配置,每次打开新终端时加载 |
/etc/profile |
所有用户 | 系统级配置,用户登录时加载 |
~/.bash_profile |
当前用户 | 登录shell时加载(优先级高于.bashrc) |
案例:设置JDK环境变量
vim /etc/profile
# 添加以下内容:
export JAVA_HOME=/usr/local/soft/java/jdk1.8.0_74
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
# 使配置生效
source /etc/profile
专业解读: -
export命令将变量导出为环境变量,使其对子进程可见 -PATH变量存储可执行程序的搜索路径,用冒号:分隔多个目录 - 修改系统级配置/etc/profile需要root权限
文件描述符和重定向¶
文件描述符 (File Descriptor)¶
Linux系统中,每个打开的文件都对应一个数字标识符:
| ID | 描述 | 设备 | 说明 |
|---|---|---|---|
| 0 | 标准输入 (stdin) | 键盘 | 程序默认从键盘接收输入 |
| 1 | 标准输出 (stdout) | 显示器 | 程序正常运行时的输出 |
| 2 | 标准错误输出 (stderr) | 显示器 | 程序报错信息的输出 |
专业解读:在Linux中,一切设备都是文件。键盘对应
/dev/stdin,屏幕对应/dev/stdout和/dev/stderr。文件描述符是进程级的,每个进程有自己的文件描述符表。
重定向符号¶
重定向:改变输入输出的默认方向。
| 符号 | 类别 | 说明 |
|---|---|---|
> |
输出重定向(覆盖) | 将标准输出写入文件,覆盖原有内容 |
>> |
输出重定向(追加) | 将标准输出追加到文件末尾 |
< |
输入重定向 | 将文件内容作为命令的输入 |
<< |
here document | 从标准输入读取,直到遇见分界符 |
&> |
混合重定向 | 将标准输出和标准错误都重定向到同一位置 |
输出重定向案例¶
| 类别 | 命令格式 | 示例 |
|---|---|---|
| 标准输出重定向 | command > file |
ls / > test.txt(1可省略) |
| 标准输出追加 | command >> file |
echo "wuya" >> test.txt |
| 标准错误重定向 | command 2> file |
find / -name "aaa" 2> err.txt |
| 丢弃错误信息 | command 2> /dev/null |
find / -name "aaa" 2>/dev/null |
| 输出和错误分开重定向 | command 1> a.txt 2> b.txt |
ls 7.txt 8.txt 1>a.txt 2>b.txt |
| 输出和错误合并重定向 | command > file 2>&1 |
find / -name "aaa" >test.txt 2>&1 |
重点解析
2>&1: ->&是一个整体,表示将文件描述符2(stderr)重定向到文件描述符1(stdout)指向的位置 -2>1的写法是错误的!这表示将stderr重定向到名为"1"的文件 - 正确顺序很重要:>file 2>&1先将stdout重定向到file,再将stderr指向stdout(即也到file)
输入重定向案例¶
| 命令格式 | 说明 | 示例 |
|---|---|---|
command < file |
将文件内容作为命令输入 | wc -l < test.txt(统计文件行数) |
command << END |
从键盘读取,直到输入END结束 | wc -l << END(统计输入的行数) |
安全测试视角:环境变量注入 环境变量不仅影响程序运行,还可能导致安全漏洞: - PATH 注入:攻击者修改 PATH 环境变量,使系统优先执行恶意程序。例如将
PATH=/tmp:$PATH后,在/tmp下放置同名恶意脚本 - LD_PRELOAD 劫持:通过设置LD_PRELOAD环境变量,加载自定义的动态链接库,劫持系统函数调用,是 Linux 下常见的权限维持技术 - PS1 命令注入:某些终端提示符配置可能执行任意命令 在渗透测试中,检查可写的环境变量配置文件(如~/.bashrc)是权限维持和横向移动的重要步骤。安全测试视角:文件描述符与信息泄露 文件描述符泄漏可能导致敏感信息泄露: - 程序打开敏感文件后未正确关闭,子进程可能继承这些文件描述符 - 利用
/proc/self/fd/可以查看当前进程打开的所有文件描述符 - 在 CTF 和渗透测试中,/proc/self/environ和/proc/self/cmdline常包含敏感信息