Linux攻防快速入门(上)-文件管理和IO 重定向

Linux攻防快速入门(上)-文件管理和IO 重定向

1. stat:查看文件状态(时间戳 / 权限 / inode 等)

stat 可以显示文件的详细元信息(大小、权限、inode、以及三个时间戳等):

stat /etc/passwd

重要字段说明(每个文件通常有三个时间):

  • A***ess time (atime):最后一次被读取/访问的时间(读文件内容、catless 等会更新)。

  • Modify time (mtime):最后一次修改文件内容的时间(写入文件、编辑文件会改变)。

  • Change time (ctime):最后一次修改元数据(权限、所有者、inode)或内容的时间。注意:ctime 不是创建时间。

  • Birth/creation time:并非所有文件系统都保存;ext4 默认没有(部分现代 FS 支持)。

示例输出(节选):

A***ess: 2025-09-24 12:00:00.000000000 +0800 
Modify: 2025-09-20 09:00:00.000000000 +0800 
Change: 2025-09-24 12:05:00.000000000 +0800

2. touch:修改时间戳(常用于伪装时间 / 修复时间)

touch 可以设置/修改文件的访问时间和修改时间。

  • 仅改变 a***ess time(atime):

touch -a filename
  • 仅改变 modify time(mtime):

touch -m filename
  • 同时改变(一般默认同时改变 atime 和 mtime):

touch filename
  • 指定时间(格式 [[***]YY]MMDDhhmm[.ss],也可以使用 -t):

touch -t 202106140747.23 /path/to/file 
# 或 (更可读) 
touch -d "2021-06-14 07:47:23" /path/to/file

注意:touch 改变的是 atime/mtime(和部分情况下的 ctime 会随之更新,因为改动属于元数据变更),但它不会修改 inode 指向的内容(除非你 overwrite 文件)。


3. 删除与不可恢复删除

  • 普通删除(可恢复风险高):

rm filename

rm 只是删除目录项,数据块可能仍留在磁盘上(有时可被数据恢复工具找回)。

  • 覆盖并尽量不可恢复(shred):

shred -v -n 5 -z filename
# -v 显示进度,-n 覆盖次数,-z 最后用 0 覆盖(隐藏痕迹)

shred 对某些文件系统(如日志型、复制型、某些 SSD 的 wear-leveling)并不保证绝对不可恢复。要完全干净可能需要分区/磁盘级操作。

  • ext4/其他 FS 上的恢复工具:

    • extundelete(用于 ext3/ext4)可以尝试恢复被删除文件(不是一定成功)。

    • 恢复工作请尽量在只读镜像上进行,不要在原盘上写入新数据。


4. 重命名批量文件(rename

  • Perl 风格 rename(常见于很多 Linux 发行版)示例:

    • .conf 改为 .conf.bak

      rename 's/\.conf$/.conf.bak/' *.conf
  • rename:命令名,调用重命名工具(注意:不同发行版的 rename 语法可能不同)。

  • 's/\.conf$/.conf.bak/':这是一个 Perl 正则替换表达式,格式是 s/模式/替换文本/

    • s:表示 substitute(替换)。

    • /:分隔符。

    • \.conf$:要匹配的模式。

      • \.:表示字面上的点 .(正则里 . 是“任意字符”,前面加 \ 表示字面点)。

      • conf:字母 conf

      • $:行尾锚点,表示以 .conf 结尾。

    • .conf.bak:替换成的文本(把 .conf 替为 .conf.bak)。

  • *.conf:对当前目录下所有匹配 *.conf 的文件应用该替换。

  • 去掉 .bak 后缀:

    rename 's/\.bak$//' *.bak

注意:不同发行版 rename 的语法可能不同(有的 rename 使用简单参数),如果不确定先用 rename -n ... 预览(-n 仅显示不修改)。


5. 硬链接(hard link)与软链接(symbolic link)

  • 硬链接(ln:给同一个 inode 增加另一个目录项(等同于“另一个名字”)。

    ln /tmp/passwd /tmp/passwd_hardlink

    特点:

    • 两个名字指向相同的 inode(相同的数据)。

    • 删除其中任意一个不会影响另一个,只有最后一个链接被删除后数据块才释放。

    • 不能跨文件系统创建硬链接。

  • 软链接 / 符号链接(ln -s

    ln -s /usr/local/php_v1.1 /var/www/php1

    特点:

    • 软链接是一个小文件,内容是指向目标路径的字符串。

    • 如果目标被移动或删除,软链接会失效(“断链”)。

    • 可以跨文件系统。

场景举例:发布新版本时,把 /var/www/php1 设为软链到某个版本目录,切换版本只需要更新软链指向,无需改配置文件。


6. rename / mv / rm 等对比与注意

  • mv:移动或重命名文件(可能是重命名或跨目录移动)。

  • rm:删除目录项(谨慎使用)。

  • shred:尝试覆盖文件数据,减少恢复可能性。

  • 永久删除与恢复:删除操作不总是不可逆,若需要完全不可恢复请使用磁盘级方法或加密后销毁。


7. find 配合 -exec 的常见用法(安全版)

  • 查找并排除目录:

find /etc -path "/etc/security" -prune -o -name "*.conf" -print
  • find /etc → 从 /etc 目录开始查找

  • -path "/etc/security" -prune → 排除掉 /etc/security 目录

  • -o → 否则执行后面的查找条件

  • -name "*.conf" → 查找以 .conf 结尾的文件

结果:查找 /etc 下的配置文件,但跳过 /etc/security 目录

  • 查找并备份(把找到的文件复制到目标目录):

mkdir -p /root/conf_backup 
find /etc -name "*.conf" -exec cp --parents {} /root/conf_backup/ \;
# --parents 保留原目录结构
  • mkdir:创建目录。

  • -p(parents):如果上级目录不存在则一并创建;如果目录已存在则不报错。

  • find /etc:从 /etc 目录递归查找。

  • -name "*.conf":匹配文件名以 .conf 结尾的文件(注意 shell 通配在引号里不会被先展开)。

  • -exec cp --parents {} /root/conf_backup/ \;

    • -exec ... {} \;:对每个找到的文件执行一次 {} 位置的命令({} 会被 replace 成当前文件名)。

    • cp --parents:复制文件并保留原来的路径结构。举例:若找到 /etc/nginx/nginx.confcp --parents 会把它复制到 /root/conf_backup/etc/nginx/nginx.conf(保留 etc/nginx 目录结构)。

  • \;:结束 -exec 命令(\; 要写成这样以避免 shell 提前解析 ;)。

  • 找到并打包(慎用,注意文件数量与命令行长度限制):

find / -name "web*" -print0 | tar --null -T - -czvf web.tar.gz

(上面使用 -print0 + --null -T - 可以安全处理包含空格的文件名)

  • find / -name "web*" -print0

    • 在根目录查找名字以 web 开头的文件/目录。

    • -print0:每个结果后用 空字节 \0 分隔,而不是换行,这样可以正确处理文件名里的空格或换行。

  • |:把 find 的输出通过管道传给 tar

  • tar --null -T - -czvf web.tar.gz:

    • --null:告诉 tar 输入列表是以空字节分隔。

    • -T -:从标准输入读取要打包的文件列表(- 代表 stdin)。

    • -c:创建压缩包。

    • -z:使用 gzip 压缩。

    • -v:显示过程(verbose)。

    • -f web.tar.gz:输出文件名为 web.tar.gz

安全提示:尽量不要把 find 结果直接拼接到会在目标上执行的 payload,避免写入或执行恶意内容。如果做批量操作,先用 -print-exec echo 预览。


8. 压缩 / 解压 基础命令

  • tar(打包并 gzip 压缩):

tar -czvf archive.tar.gz /path/to/dir 
tar -xvf archive.tar.gz # 解包 
# 排除某类文件 
tar -czvf web.tar.gz --exclude="*.jpg" /data/
  • c:create(创建归档)

  • x:extract(解包)

  • z:gzip 压缩/解压(和 gunzip 配合)

  • v:verbose(显示处理过程)

  • f:file(后面接文件名)

  • zip / unzip

zip -r backup.zip /etc/ 
unzip backup.zip
  • gzip / gunzip

gzip file # 生成 file.gz(默认删除原文件) 
gzip -k file # 保留原文件 gunzip file.gz

9. 挂载与卸载(mount / umount)

  • 挂载分区:

mount /dev/sda1 /mnt
  • 指定文件系统类型:

mount -t ext4 /dev/sda1 /mnt
  • 只读挂载(不允许修改):

mount -o ro /dev/sda1 /mnt
  • 卸载:

umount /mnt
  • 绑定挂载(把目录 A 映射到目录 B):

mount --bind /tmp /mnt/tmp
  • 光驱操作(物理机或虚拟机):

eject # 弹出光盘 
eject -t # 关闭托盘(收回)

10. 文件描述符与 I/O 重定向(stdin/stdout/stderr)

每个进程有文件描述符(FD)来引用打开的文件或设备;常见的三种:

FD 名称 说明
0 stdin 标准输入(默认来自键盘)
1 stdout 标准输出(默认输出到终端)
2 stderr 标准错误(默认输出到终端)

常见重定向示例(安全、运维常用):

  • 把 stdout 重定向到文件(覆盖):

ls > out.txt
  • 把 stdout 追加到文件:

ls >> out.txt
  • 把 stderr 重定向到文件:

ls not_exist 2> err.txt
  • 同时把 stdout 和 stderr 合并到同一文件(Bash 特性):

# Bash 中常用的写法(兼容 bash) 
***mand > all.log 2>&1 
# 或者(bash 另一种简写) 
***mand &> all.log

先将 stdout 重定向到 all.log,然后 2>&1 表示把 stderr(2)重定向到当前 stdout(1)所指向的位置(也就是 all.log

  • 丢弃输出(发送到 /dev/null):

***mand > /dev/null 2>&1 # 丢弃 stdout 和 stderr
  • 从文件作为 stdin:

tr 'a-z' 'A-Z' < /etc/issue
  • 管道(pipe):把一个命令的 stdout 作为下一个命令的 stdin:

cat /etc/passwd | grep root

区别总结:重定向把输出导到文件(或从文件读入),管道把一个命令的输出传给下一个命令作为输入。


11. /dev/fd / /proc/self/fd 与特殊设备

  • /dev/stdin/dev/stdout/dev/stderr 都是符号链接到当前进程的 /proc/self/fd/0/1/2

  • 这些路径方便在脚本或命令中引用当前进程的标准流。

查看示例:

ls -l /dev/std* 
ls -l /proc/self/fd
  • /dev/stdin, /dev/stdout, /dev/stderr:分别是当前进程的标准输入/输出/错误的符号链接,通常指向 /proc/self/fd/0/proc/self/fd/1/proc/self/fd/2

    • ls -l /dev/std* 会显示这些链接指向哪里。

  • /proc/self/fd/:当前进程打开的文件描述符目录,里面每个数字文件(0,1,2, ...)是对应 fd 的链接。你可以用它查看某个进程正在打开哪些文件或套接字:

    ls -l /proc/self/fd 

    例如 /proc/self/fd/1 -> /dev/pts/3 表示 stdout 指向某个终端


12. tr 的常见用法(文本处理)

  • 转小写到大写:

tr '[:lower:]' '[:upper:]' < /etc/issue
  • 删除字符:

tr -d 'abc' < input.txt
  • 压缩连续空白字符:

tr -s ' ' < file.log
  • 删除 Windows 回车(CR):

tr -d '\r' < windows.txt > unix.txt
  • tr:translate/translate-delete,常用于字符替换或删除。

  • -d '\r':删除所有回车字符(\r,Carriage Return,Windows 文本行结束通常是 \r\n)。

  • < windows.txt:把 windows.txt 的内容作为 stdin。

  • > unix.txt:把输出写到 unix.txt

  • 效果:把 Windows 格式的文本转换成 Unix 格式(去掉回车,仅保留 \n 换行)


13. 关于网络相关设备文件与 /dev/tcp

  • 在 Bash 中(当以 Bash 运行时),/dev/tcp/host/port 是一个特殊“伪文件名”,Bash 可以用它来打开 TCP 连接与远端通信(需 Bash 编译支持)可以实现反弹shell。


14. 管道(pipe)与重定向的配合

  • 管道把命令串联起来:cmd1 | cmd2 | cmd3

  • 重定向通常用于保存输出或分离错误输出。两者可以组合使用:

cmd1 | cmd2 > out.txt 2> err.txt

15. 常见安全/渗透场景注意事项(老师课件里提到的点整理)

  • 命令历史(history) 是审计与溯源的重要来源,清空历史会留下痕迹,应慎用。

    • 更隐蔽做法:编辑 ~/.bash_history 删除某些条目,或在执行命令前以空格开头(若 HISTCONTROL=ignorespace 生效)则不会被记录。

  • touch 修改时间:可用于掩饰文件时间(但取证人员会同时检查 ctime 等),并非万无一失。

  • 不要直接在生产机上测试有害或未授权脚本;如果做安全测试,请在合法授权的隔离靶场(VM/实验室)中进行。


16. 遇到不懂的命令怎么办?

  • 推荐工具:explainshell.*** 可以把命令拆解并解释每个选项含义(对初学者很友好)。

  • man--help 也很有用:

    man find 
    find --help

17. 总结与小贴士

  • stat 看文件的 atime/mtime/ctime;touch 改时间。

  • rm 只是删除目录项,shred 试图覆盖数据减少恢复可能。

  • 硬链接和软链接用途不同;软链接适合版本切换场景。

  • I/O 重定向与管道是 Linux 文本处理与脚本的核心技能。

  • 在做任何写入/删除操作前先备份(tarcp --parents),在生产环境尤其谨慎。

转载请说明出处内容投诉
CSS教程网 » Linux攻防快速入门(上)-文件管理和IO 重定向

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买