1. stat:查看文件状态(时间戳 / 权限 / inode 等)
stat 可以显示文件的详细元信息(大小、权限、inode、以及三个时间戳等):
stat /etc/passwd
重要字段说明(每个文件通常有三个时间):
-
A***ess time (atime):最后一次被读取/访问的时间(读文件内容、
cat、less等会更新)。 -
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.conf,cp --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,避免写入或执行恶意内容。如果做批量操作,先用-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 文本处理与脚本的核心技能。
-
在做任何写入/删除操作前先备份(
tar或cp --parents),在生产环境尤其谨慎。