跳转至

文件与目录管理

概述

文件和目录管理是 Linux 最日常的操作,也是安全测试中进行信息收集和权限分析的核心技能。本文系统介绍了 Linux 文件系统的操作命令,包括文件复制、查找、移动、删除,以及挂载和链接等高级操作。

命令格式规范

Linux命令遵循统一的格式:

Command  Options  Arguments
  命令     选项      参数

示例

rm -rf /*
- rm:命令(remove) - -rf:选项(递归r + 强制f) - /*:参数(根目录下的所有内容)

安全提示rm -rf /* 是经典的"删库跑路"命令,会强制递归删除系统根目录下的所有文件,切勿执行

命令书写规范

规范 说明
命令 必须是系统存在的命令或程序
空格 命令、选项、参数之间必须用空格分隔
大小写 Linux命令严格区分大小写,Lsls 是不同的
顺序 多数情况下选项和参数的顺序不影响执行,但有例外

命令选项详细参考资料: - https://wangchujiang.com/linux-command - https://www.linuxcool.com


文件与目录管理命令

ls - 列出目录内容和属性

全称:list

格式ls [选项] [文件名/目录名]

常用示例

ls            # 列出当前目录内容
ls -a         # 列出所有文件,包括隐藏文件(以.开头的文件)
ls -l         # 以长格式列出(详细信息)
ls -la        # 组合使用:长格式+显示隐藏文件
ll            # 在CentOS中,ll是ls -l的别名
ll --block-size=M  # 以MB为单位显示文件大小

专业解读ls -l 输出的第一列如 -rw-r--r-- 表示文件类型和权限,第三、四列是属主和属组,第五列是文件大小,第六列是修改时间。

pwd - 打印工作路径

全称:print working directory

格式pwd

pwd           # 显示当前所在目录的绝对路径

专业解读:在Shell脚本中常用 $(pwd) 获取当前路径,用于构建绝对路径。

cd - 切换工作目录

全称:change directory

格式cd [相对路径或绝对路径]

cd /usr/local     # 绝对路径
cd ../..          # 返回上上级目录
cd ~              # 回到用户主目录
cd -              # 回到刚才所在的目录

路径符号

符号 指代
/ 根目录
. 当前目录
~ 用户主目录(home directory)
../ 上一级目录
../../ 上上级目录,以此类推

file - 查看文件类型

格式file [选项] 文件或目录

file test.txt         # 显示文件类型(如ASCII text)
file -i test.txt      # 显示MIME类型(如text/plain; charset=utf-8)

专业解读:Linux不通过后缀名判断文件类型,而是通过文件头(magic number)。file 命令读取文件头部信息来判断真实类型。

cp - 复制文件或目录

全称:copy

格式cp [选项] 源文件 目标文件

常用选项

选项 说明
-R / -r 递归处理,将指定目录下的所有文件与子目录一并处理
-f 强行复制,不论目标文件或目录是否已存在,直接覆盖
-i 覆盖前询问确认(interactive)
-p 保留原文件的属性(修改时间、权限等)
-v 显示复制过程(verbose)
cp file1.txt /tmp/           # 复制文件
cp -r dir1 /tmp/             # 复制目录(必须加-r)
cp -rp dir1 /backup/         # 复制目录并保留属性

find - 查找文件或目录

格式find [目录] [选项] [名字或模式]

常用选项

选项 说明 示例
-name 按名字查找(区分大小写) find /etc -name "a*"
-iname 按名字查找(不区分大小写) find / -iname "AAA"
-type 按类型查找 f普通文件,d目录,l链接
-size 按大小查找 find /root -type f -size +10M
-exec 对找到的文件执行命令 find . -name "*.txt" -exec rm -rf {} \;
find /etc -name "a*"                    # 在/etc下查找以a开头的文件
find / -name "aaa" 2>/dev/null          # 在整盘查找,丢弃错误信息
find /root -type f                      # 查找/root下的所有普通文件
find /root -type f -size +10M           # 查找大于10M的文件
find . -name "*.txt" -exec rm -rf {} \; # 找到所有txt并删除

专业解读: - {} 代表find找到的每个文件 - \; 表示 -exec 命令结束(注意反斜杠转义分号) - 2>/dev/null 非常重要,因为普通用户查找某些系统目录会报权限错误,此写法可屏蔽

其他查找命令

命令 作用 特点
whereis 查找二进制程序、源代码、man手册 速度快,只查标准路径
which 查找并显示给定命令的绝对路径 从PATH环境变量中查找
locate 从数据库中查找文件 速度极快,但数据库每天更新一次(updatedb),新文件可能找不到

mkdir - 创建目录

全称:make directory

格式mkdir [选项] 目录名

mkdir test                    # 创建单个目录
mkdir -p /usr/local/soft/redis  # 递归创建多级目录(-p = parents)

专业解读-p 选项非常常用,当父目录不存在时自动创建,不会因为目录已存在而报错。

mv - 移动或重命名

全称:move

格式mv [选项] 原文件 新文件

mv 1.txt 2.txt                # 重命名
mv /a/1.txt /b/1.txt          # 移动文件位置
mv dir1 /tmp/                 # 移动目录

专业解读:mv在同一个文件系统内操作非常快,因为只是修改inode的指向,不需要实际复制数据。跨文件系统则实际是复制+删除。

rm - 删除文件或目录

全称:remove

格式rm [选项] (多个)文件名

选项 说明
-r 递归删除(目录必须加此选项)
-f 强制删除,不提示确认
-i 删除前询问确认
rm file.txt                   # 删除文件
rm -r dir/                    # 删除目录及内容
rm -rf dir/                   # 强制递归删除(慎用!)
find . -name "a.json" -exec rm -rf {} \;   # 配合find批量删除

删除空目录

rmdir empty_dir/              # 只能删除空目录

专业解读rm 删除的文件不会进入回收站,恢复非常困难。删除前建议用 ls 先确认目标,尤其是使用通配符时。

touch - 创建空文件或修改时间戳

格式touch [选项] 文件名

touch a.txt                   # 创建空文件(若不存在)
touch a.txt                   # 更新文件的访问和修改时间为当前时间(若已存在)
touch -t 202312011200 a.txt   # 指定时间戳

挂载和链接

mount - 挂载文件系统

问题:一个目录树怎么使用多个磁盘?

答案:通过挂载(mount),将额外的存储设备连接到文件系统的某个目录下。

# 示例:将/dev/sdb1挂载到/sdb-u目录
mkdir /sdb-u
mount /dev/sdb1 /sdb-u

# 查看当前挂载情况
mount
df -h

挂载后:访问 /sdb-u 目录,实际就是访问 /dev/sdb1 磁盘的内容。

专业解读: - /etc/fstab 文件配置了开机自动挂载的设备和参数 - 卸载用 umount /sdb-u(注意不是unmount) - 如果设备正被占用,卸载会失败,可用 lsof /sdb-u 查看占用进程

ln - 链接文件

全称:link

Linux支持两种链接:

ln 1.php hard.php

特点: - 硬链接和原文件指向同一个inode(索引节点),共享相同的数据块 - 修改其中一个,另一个也会变化 - 删除原文件,硬链接仍然可以访问数据(因为inode的引用计数不为0)

限制: 1. 不能给目录创建硬链接(防止目录环路) 2. 只有在相同的文件系统内才能创建硬链接(不同分区inode不互通)

专业解读:硬链接本质上是给文件起别名,inode中的链接数(link count)会相应增加。只有当链接数降为0时,系统才会真正释放磁盘空间。

类似Windows的快捷方式。

# 创建软链接
ln -s /usr/local/phpstudy/system/phpstudyctl /usr/bin/study

# 使用
study                         # 直接运行软链接,实际执行的是原文件

# 查看软链接
ll /usr/bin/nc                # 显示箭头指向的目标

特点: - 软链接是一个独立的文件,有自己的inode,文件内容是指向目标文件的路径 - 可以跨文件系统创建 - 可以给目录创建软链接 - 源文件删除,软链接失效(变成"死链接",显示红色)

硬链接 vs 软链接对比

特性 硬链接 软链接
inode 与原文件相同 独立inode
跨文件系统 ❌ 不支持 ✅ 支持
链接目录 ❌ 不支持 ✅ 支持
原文件删除 ✅ 仍可访问 ❌ 失效(死链接)
文件大小 与原文件相同 很小(只存路径)

安全测试视角:敏感文件查找 在 Linux 渗透测试中,快速定位敏感文件是信息收集的关键:

# 查找包含密码关键词的文件
grep -r -i "password\|passwd\|pwd" /etc/ /var/www/ 2>/dev/null

# 查找 SUID/SGID 文件(权限提升的关键)
find / -perm -4000 -type f 2>/dev/null
find / -perm -2000 -type f 2>/dev/null

# 查找可写的配置文件
find /etc -writable -type f 2>/dev/null

# 查找历史命令文件(可能包含密码)
find /home -name ".bash_history" -readable 2>/dev/null

安全测试视角:硬链接与数据恢复 在安全取证中,硬链接的特性可用于数据恢复: - 即使原始文件被删除,只要存在硬链接,数据仍然可访问 - lsof +L1 可以查找已删除但仍被进程占用的文件,攻击者可能利用这种方式隐藏恶意文件 - 在入侵取证中,检查 inode 引用计数可以帮助发现隐藏的数据

安全测试视角:路径遍历漏洞 ../ 路径穿越是 Web 安全中最常见的漏洞之一。攻击者利用此技术访问服务器上的任意文件:

http://example.com/download?file=../../../etc/passwd
http://example.com/view?path=../../../etc/shadow
防御方法:严格校验用户输入的路径,使用 realpathgetcwd 规范化路径,限制访问范围。