跳转至

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的工作示例

cat file.txt
# Shell将其转换为系统调用:
# open() → read() → write()(输出到屏幕)

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/用户名 - 快速回到主目录:cdcd ~

工作目录 (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用户)

关机命令

poweroff          # 立即关机
shutdown -h now   # 立即关机(-h = halt)
halt -p           # 关机并断电

重启命令

reboot            # 立即重启
shutdown -r now   # 立即重启(-r = reboot)

专业解读:生产环境中应使用 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结尾的文件

注意-fls 的不排序选项,不能用于过滤文件ls -f *[^txt] 展示的是名字不包含txt字符的目录和文件,且因为 -f 会显示目录内容,行为可能与预期不同。过滤应使用其他命令如 grep

系统环境变量

环境变量是操作系统中存储配置信息的动态值,影响进程的运行环境。

查看环境变量

env              # 查看全部环境变量
echo $PATH       # 查看单个变量($符号引用变量)
echo $HOME       # 当前用户主目录
echo $USER       # 当前用户名

环境变量配置文件

文件 作用范围 说明
~/.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 常包含敏感信息