linux取证——文件取证
Linux系统文件信息取证与核心操作
在Linux系统的日常维护与安全取证过程中,熟练掌握文件操作与查找命令是至关重要的基础。以下内容将原有的知识体系进行了深度重构与详尽扩展。
Linux核心文件操作指令
ls 命令
ls(全拼为 list directory contents)是Linux中最基础也是最常用的命令,其核心作用是显示指定工作目录下的内容,精准列出目前工作目录所包含的文件及子目录。
基础语法与运行逻辑
ls [-alrtAFR] [name...]
核心参数深度剖析
-a(all):无死角显示所有文件及目录。在Linux中,以.开头的文件属于隐藏文件,该参数强制列出所有隐藏内容,在取证时排查隐藏的恶意文件极其重要。-d(directory):仅针对目录本身进行列出,而不会递归深入列出目录内部的具体文件。-l(long format):以极其详尽的长格式输出文件和目录的各项元数据信息。输出内容涵盖了文件的读写执行权限、文件所有者、文件大小以及具体的创建或修改时间等关键取证线索。-r(reverse):打破默认的正向排序,强制将文件和目录进行倒序显示。-t(time):依据文件的最后修改时间进行严格排序。默认情况下,系统会将最新被修改过的文件排列在输出列表的最前面,方便排查近期被篡改的文件。-A(Almost all):功能高度类似于-a,但更加纯粹,它会列出隐藏文件,但刻意忽略表示当前目录的.和表示父目录的..。-F(Classify):为不同类型的文件在名称末尾添加特定的标识符号,以便直观辨认。例如,系统会在可执行文件档尾部加上*号,在目录尾部加上/号。-R(Recursive):开启递归模式,不仅显示当前目录,还会向下穿透,显示目录中包含的所有文件和极深层级的子目录。
进阶操作场景与特殊字符处理
详尽的递归列出:使用
ls -lR /bin可以将/bin目录之下潜藏的所有目录及文件详细资料一次性全盘列出。处理非常规文件名:当文件名包含了空格、特殊符号或是以破折号(-)作为开头时,直接使用
ls会导致解析错误。此时可以采用反斜杠(\)进行字符转义,或者使用引号包裹文件名。例如:
ls "my file.txt"或ls my\ file.txt可精确列出名为 “my file.txt” 的带空格文件。例如:
ls -- -filename可以安全列出名为 “-filename” 这种容易被误认为命令参数的文件。
模式匹配与通配符:
ls完美支持通配符以实现批量查找。*符号代表匹配任意长度、任意组合的字符。例如ls *.txt可列出所有扩展名是.txt的文件。?符号代表严格匹配单一的任意字符。例如ls file?.txt能精准抓取类似于file1.txt或fileA.txt的文件。[...]符号用于圈定一个匹配的字符范围。例如ls [abc]*.txt可以列出所有以 a、b 或 c 字母开头,且扩展名为 .txt 的文件。
综合时间排序:执行
ls -ltr s*可以列出当前工作目录下所有名称以 s 开头的文件,并且越是近期更新的文件,排列的位置越靠后(结合了逆序和时间排序)。
echo 命令
该命令主要用于在终端屏幕上直接输出指定的字符串,常用于脚本编写和简单的状态打印。
核心选项
-n参数:强制系统在输出完指定的字符串后不进行换行动作(默认情况下echo会在句尾自动添加换行符)。-e参数:激活对转义字符的解析与输出能力,使得诸如\n(换行) 或\t(制表符) 等转义序列能够生效并被正确打印。
tar 命令
tar 命令的全称是 “tape archive”,它最初是被设计用于将数据备份到磁带设备上的,但在现代Linux系统中,它已经演变成为文件管理、全盘备份和数据压缩的标准核心工具。它的强大之处在于能够将成百上千个零散的文件和错综复杂的目录结构打包成一个单一的归档文件,同时还能从该归档文件中精准提取所需内容。
全参数字典表
| 参数标识 | 功能深度解析 |
|---|---|
-c |
核心创建指令:用于无中生有地创建出一个全新的归档文件(即打包动作)。 |
-x |
核心提取指令:用于从现存的归档文件中将内部的文件及目录提取释放出来(即解包动作)。 |
-f <文件名> |
目标定位指令:必须紧跟在归档文件名之前,用于明确指出操作的归档文件具体名称。 |
-v |
可视化指令:在执行打包或解包的过程中,在屏幕上实时显示正在处理的详细文件列表信息。 |
-z |
压缩协议指令:调用 gzip 算法对归档文件进行高强度的压缩或解压操作。 |
-j |
压缩协议指令:调用 bzip2 算法对归档文件进行压缩,通常能提供比 gzip 更高的压缩率。 |
-C <目录> |
路径重定向指令:在执行解包操作前,强制工具先切换到你所指定的目录下再进行释放。 |
--exclude=<模式> |
过滤指令:在打包时,严格排除掉符合所设模式(如特定后缀)的文件或目录。 |
--list |
预览指令:像透视眼一样列出归档文件内部的所有内容明细,而不进行实质的提取解压。 |
--help |
帮助指令:调用系统的帮助文档,展示所有可用的选项与参数说明。 |
十大典型实战场景解析
纯粹的打包操作:如果只需打包而不压缩,可组合使用
-c和-f。执行tar -cf documents.tar /home/user/documents,系统会将指定目录下的所有内容原封不动地塞进documents.tar中。常规解包操作:通过结合
-x和-f参数,使用tar -xf documents.tar可以将上述打包好的文件瞬间解包并铺开在当前工作目录下。打包并强力压缩:结合外部压缩工具是
tar的拿手好戏。比如使用-z参数(代表 gzip),执行tar -czf documents.tar.gz /home/user/documents就能一步到位完成打包和压缩双重任务。无损查看归档内容:在不确定压缩包内部是什么时,利用
--list参数执行tar --list -f documents.tar即可安全地预览归档文件内容清单。智能排除特定文件:在海量文件打包时,如果不想把无用的文本文件混入其中,可以使用
--exclude='*.txt'参数。例如:tar -cf documents.tar --exclude='*.txt' /home/user/documents,这样所有的.txt文件就会被精准抛弃。严格保留文件权限:在取证和系统迁移时,权限的变更可能是致命的。使用
--preserve-permissions参数执行tar --preserve-permissions -cf documents.tar /home/user/documents,能确保源文件的读写权限和所有权信息被原汁原味地保留在压缩包内。冻结访问时间戳:为了不破坏文件的被访问记录(这在司法取证中极其关键),可以添加
--atime-preserve参数。如tar --atime-preserve -cf backup.tar /path/to/backup会在打包时保持原有文件的访问时间戳绝对不变。企业级增量备份:对于体积庞大的服务器,每次都全量备份是不现实的。
tar支持通过--listed-incremental参数配合一个状态文件(.snar)来实现仅备份修改过的文件。命令示例:tar --create --file=backup-$(date +%Y%m%d).tar --listed-incremental=backup.snar /path/to/backup。依据列表精准制导打包:如果你有一个极长且散乱的文件清单
files.txt,可以通过--files-from=files.txt参数告诉tar去哪里找文件。示例:tar -cf backup.tar --files-from=files.txt。极限压缩级别控制:在使用 gzip 等压缩时,能够通过数字(1-9)控制压缩比。级别 9 代表消耗最长时间换取最小的文件体积。例如
tar -czvf documents.tar.gz -9 /home/user/documents。
wget 命令
核心概念
wget 是一款在命令行环境下运行的非交互式网络下载利器。它具备极其强悍的稳定性,支持从远程服务器进行全自动下载,不仅囊括了断点续传的核心特性,还支持复杂的递归下载(整站抓取)以及无人值守的后台下载模式。
基础执行语法
wget [选项] [URL](其中 URL 指代目标文件的精确网络地址)。
全量参数字典表
| 参数标识 | 功能深度解析 |
|---|---|
-O 文件名 |
重命名利器:强制将网络上下载下来的文件在本地保存为您所指定的全新文件名。 |
-P 目录 |
归宿指定:直接将下载完毕的文件存放进您提前规划好的指定目录中,而无需后续手动转移。 |
-c |
续传守护:遇到网络中断时无需从头再来,支持从中断的断点处继续拼接下载文件。 |
-r |
爬虫模式:开启递归下载,能够顺藤摸瓜地下载指定 URL 页面中嵌套的所有关联链接。 |
-np |
边界控制:在进行递归下载时,严格禁止工具向上爬取到父级目录,防止下载范围失控。 |
-nH |
扁平化存储:默认递归会生成带有主机名的冗长文件夹,此参数可禁止创建主机目录,直接把文件散布在当前目录。 |
-b |
隐身模式:立刻将庞大的下载任务丢进系统后台静默执行,释放当前终端控制权。 |
-q |
极简模式:开启静默状态,大幅度减少屏幕上的进度条和输出信息。 |
-v |
啰嗦模式:与 -q 相反,输出极其详尽的连接和下载调试信息。 |
-h 或 --help |
呼叫支援:打印出所有可用的选项参数与帮助说明。 |
-y |
强制通过:在遭遇需要用户干预或确认的步骤时,机器自动回答 “yes”。 |
–limit-rate |
宽带节流:在下载超大文件时极其有用,能够限制 wget 的最大下载速率,防止其挤占所有网络带宽。 |
-i |
批量作业:允许从一个事先写好的文本文件中读取成百上千个 URL 进行排队下载。 |
八大实战运用案例
基础下载并更名:抓取远程 zip 并重命名保存:
wget http://example.com/file.zip -O myfile.zip。断线拯救机制:如果之前下载了一半断电了,加上
-c即可拯救:wget -c http://example.com/file.zip。整站目录克隆:利用
-r -np -nH --cut-dirs=2等组合拳,可以将目标站点的某个深层目录完美复刻到本地指定路径/path/to/save下:wget -r -np -nH --cut-dirs=2 http://example.com/dir/ -P /path/to/save。后台无感下载:对于几十个G的镜像,直接运行
wget -b http://example.com/file.zip让它在后台慢慢拖。纯净静默下载:在编写 shell 脚本时为了不让 wget 输出扰乱日志,加上
-q参数:wget -q http://example.com/file.zip。全自动确认:省去所有询问烦恼,一路绿灯:
wget -y http://example.com/file.zip。温柔限速下载:为了不影响同机房的其他业务,将下载速度死死卡在 300KB/s:
wget –limit-rate=300k http://example.com/file.zip。海量文件批处理:先用
cat > filelist.txt建立一个包含 url1, url2… 的文本清单,随后执行wget -i filelist.txt,wget 便会按图索骥逐一下载。
Linux文件纵深搜寻与定位
在庞杂的系统目录中犹如大海捞针般寻找关键文件,是取证人员的基本功。
find 命令
宏观指令架构
find < path > < expression > < cmd >
path:明确指定搜寻任务的起点目录(及其所有子孙目录),若留空则默认在当前目录原地搜寻。
expression:高度定制化的搜索特征描述符(如名字、权限、大小等)。
cmd:搜到结果后,顺手对这些结果执行的系统动作。
_注意:如果没有任何参数,
find会极其狂野地遍历当前目录下所有层级的所有文件,并毫无保留地喷洒在屏幕上。_
核心过滤参数全景展示与实录
-name(按名索骥):严格按照文件名进行筛查。示例1:
find /dir -name filename在/dir下精确寻找该名字的文件。示例2:
find . -name "*.c"在当前及子目录抓取所有.c结尾的 C 语言源码文件。示例3:
find /etc -name "[A-Z]*.txt" -print借助正则在 etc 下寻找所有必须以大写字母开头的 txt 文本。_高级用法
-iname_:加上i代表大小写脱敏(ignore case),搜索时不再区分大小写。
硬链接与 inode 追踪:通过
ls -i 1.txt查明文件的 inode 核心编号(例如 138956),然后使用find . -num 138956就能把系统中所有指向该文件的硬链接统统揪出来。-perm(权限筛查):取证时常用来寻找权限异常配置的文件。例如find . -perm 755 -print能把当前目录里所有属主可读写执行、其他人只读执行的文件全部找出来。更进阶地,可以用find ~ -type f -perm 4755 -print来查找被设置了高度危险的 SUID 位且权限为 755 的文件。-prune(禁区划定):明确告诉 find 命令不要踏入指定的目录雷区。示例1:
find /apps -path "/apps/bin" -prune -o -print表示要在/apps下找文件,但严禁涉足/apps/bin目录。示例2:
find . -name "out*" -prune -o -name "*.txt" -print意味着在当前目录查找时,凡是碰到 out 开头的不仅不找 txt,甚至直接跳过该分支。_特例_:如果强行与
-depth同用,-prune将会彻底失效并被系统无视。
-depth(深潜模式):改变搜索逻辑,不先查当前表面文件,而是直接憋气潜入最深层的子目录开始由下往上反向查找。例如find / -name "CON.FILE" -depth -print。属主与属组追踪:
-user:找特定主人的文件,如find ~ -user sam -print。-group:找特定组的文件,如find /apps -group gem -print。-nouser/-nogroup:这是取证界的明星参数!专门用于在/etc/passwd或/etc/groups中找出没有合法主人或组的“幽灵文件”(多为黑客残留或删号遗留),如find /home -nouser -print。
时间维度追踪:
-mtime -n +n:按文件内文被篡改的日期来找。-n锁定距离现在的 n 天内,+n则锁定 n 天之前那段古老岁月。示例:
find / -mtime -5 -print找出根目录下最近5天内被改过的活跃文件。find /var/adm -mtime +3 -print找出3天以前的陈旧日志。-newer file1 ! file2:寻找更新时间恰好卡在 file1 之后,但在 file2 之前的文件区间。
-type(物种分类):限定你要找的是什么形态的实体。f- 普普通通的文件。d- 文件夹(目录),如find /etc -type d -print。l- 犹如快捷方式的符号链接文件,如find /etc -type l -print。b/c/p- 分别对应极其底层的块设备(磁盘)、字符设备(鼠标网卡)和管道文件。巧用反向逻辑:
find . ! -type d -print就能找出当前目录下除了目录之外的所有东西。
-size(体积称重):精准测算大小。+1m:大于 1 兆字节的巨无霸。100c:精确到连1个字节都不差,刚好 100 字节的文件。+10:超过 10 个数据块的文件(在Linux中一块通常等价于 512 字节)。
边界与跟踪:
-mount:极其保守的搜索,绝不跨越文件系统的 mount 挂载点去别的文件系统找,如find . -name "*.XC" -mount -print。-follow:极其尽责的搜索,遇到符号链接不把它当普通文件,而是死死追踪到它背后的真实源文件。
高阶动作挂载 (
-exec与-ok):这是 find 蜕变为自动神器的关键。-exec:对搜到的每一个结果强行执行后面的 shell 命令。格式固定为'command' {} \;,这里的{}代表搜到的文件,且{}与\;之间必须要有神圣的空格。杀手锏1:
find ./ -size 0 -exec rm {} \;找出所有0字节空文件并残忍删除。杀手锏2:
find . -type f -exec ls -l {} \;找出所有普通文件并以长格式展示它们。杀手锏3:
find /logs -type f -mtime +5 -exec rm {} \;在 /logs 目录定期清理 5天前的老旧日志文件。
-ok:是-exec的安全带版本。它作用完全一致,但在执行每一个删除或修改命令前,系统都会强行暂停并弹窗质问用户是否确认,极其适合防止高危误操作。例如find . -name "*.conf" -mtime +5 -ok rm { } \;就会在删旧配置前反复询问。
grep 命令
宏观指令架构
grep [选项] pattern [文件名]
命令选项矩阵
-?:提供上帝视角,在显示匹配行的同时,一并展示其上下的特定行数上下文,例如grep -2 pattern filename显示上下各两行。-b/--byte-offset:深度定位,在打印出来的匹配行前方,附加上该行在磁盘上的精确块号码。-c/--count:数据统计模式,对内容毫无兴趣,只冷酷地输出总共匹配命中了多少行。-f File/--file=File:批量模板匹配,从指定的文本文件(File)中提取出大批量的匹配模板去搜寻(若文件为空则必定什么都搜不到)。-h/--no-filename:在横跨多个文件进行广域搜索时,强制不显示命中行所属的文件名前缀,使输出更纯粹。-i/--ignore-case:大小写脱敏搜索,彻底忽略字母大小写的鸿沟(默认 grep 是极其严苛区分大小写的)。-q/--quiet:特工模式,完全取消屏幕输出反馈,仅通过底层的返回退出状态码(0 代表成功找到)来默默传递结果。-l/--files-with-matches:文件筛选器,只要文件里含有符合的内容,就只打印该文件的名称,而不是里面的乱码内容。-L/--files-without-match:反向文件筛选,专门挑出那些完全不含有匹配模板的“干净”文件清单。-n/--line-number:代码审计最爱,在终端输出的命中内容最前方,烙印上确切的代码行号。-s/--silent:容错模式,当遭遇目标文件根本不存在或者因权限过低无法读取时,咽下报错信息,保持版面整洁。-v/--revert-match:叛逆逻辑,执行反检索,专门显示那些没有被 pattern 匹配上的无辜行。-w/--word-regexp:绝对单词匹配。只有当整个单词完全吻合时才抓取(比如找magic绝不会牵连magical),等同于表达式被<和>严密包裹。-V/--version:常规操作,显示软件当前的版本号信息。-C number:上下文捕捉,匹配的上下文分别显示指定的 number 行。
正则表达式 (Pattern) 核心符号
.代表匹配天地间任意一个单字符。*赋予力量,匹配其紧随的前方字符 0 次或成千上万次。^和$是定海神针,分别强制要求从一行的最开头和最末尾进行锚定匹配。[]构造字符禁区,匹配括号内的任意单字符,可用-划定势力范围(如[a-z]代表全部小写英文字母大军)。\转义使者,消除特殊符号的魔力使其化为普通字符。
复杂实战场景推演
管道联合作战:
ls -l | grep '^a'通过管道符(|)截获了 ls 的海量输出,并用正则筛选出绝对以字母 ‘a’ 打头的所有行。多文件狂轰滥炸:
grep 'test' d*深入所有文件名以 d 开头的文件中,无情搜刮包含 ‘test’ 字样的所有行。同理,grep 'test' aa bb cc会在 aa, bb, cc 三个明确文件中同时展开搜索。范围条件苛求:
grep '[a-z]' aa专挑那些包含了连绵不断至少 5 个连续小写字母的超长字符串的行。极高阶内存缓存匹配 (egrep/转义):
grep 'w\(es\)t.*\1' aa这是一场复杂的逻辑游戏(文档中提及使用 egrep 或 -E 可以省略双引号转义写为'w(es)t.*')。如果 west 匹配成功,中间的 es 会被瞬间封印进内存并标记为编号 1;紧接着允许中间穿插任意字符 (.*);最后必须紧跟着重现刚刚封印的内存 1 (即\1或者在此例中解释为再次寻找另外一个 es),只有跑通整个迷宫的行才会被展示。双重逻辑管网:
逻辑“或”近似替代:文档中指出可实现显示匹配 pattern1 或 pattern2 的行。
逻辑“与”层层递进:
grep pattern1 files | grep pattern2先筛出一波包含特征 1 的,再扔进管道进行二次压榨,最终只剩下既包容 pattern1 又包容 pattern2 的黄金数据行。
xargs 命令
为何需要它?(背景与痛点)
很多强悍的 Linux 核心命令天生有缺陷,它们极其固执,根本拒不接受标准输入(stdin)或管道符 | 传来的数据作为自己的参数。举个致命的例子:find /sbin -perm +700 | ls -l 这种写法在逻辑上看似完美,但在现实中是彻底失效的错误命令,因为 ls 压根不理会管道送来的文件列表。并且,有些系统对于一次性塞给 -exec 的命令长度有物理极限,一旦文件过多就会引爆“参数列太长”的系统级崩溃报错。
这就迫切需要 xargs 降临!它的核心使命就是将上游流淌过来的标准输入(stdin)数据,通过识别空格或回车等断行符进行精准切割,化作一个个标准的 arguments(参数),然后喂给下游命令的尾部。正确的姿势应当是:find /sbin -perm +700 | xargs ls -l。
核心选项深度解剖
-0(零字符保护伞):由于 xargs 默认把空格当切割刀,一旦遇到带有特殊字元(如空格、单引号、双引号等)的变态文件名,它就会切错导致误判。-0参数强制它将 stdin 中的所有东西全当成一般纯文本字符处理,保全文件名的完整性。例如:echo "//"|xargs -0 echo完美输出/。-a file(文本汲取):抛弃管道,直接从指定的文件深渊里读取内容作为标准输入。例:xargs -a test echo。-e flag或-E flag(死亡休止符):设定一个强制停止符(必须用空格隔开)。一旦 xargs 在疯狂解析输入时碰到了这个命定的 flag 标志词,它就会像触电一样立刻全盘停止后续的所有解析工作。例:cat txt|xargs -E 'shou' echo,遇到 ‘shou’ 瞬间刹车。-p(步步惊心模式):每当 xargs 准备向后方命令投递参数并执行前,都会强行中断并向人类使用者发出询问,输入y确认后才敢放行。-n num(定量投喂):控制贪欲,设定每次投喂给后方命令的 argument 的确切数量。默认它是全盘托出,加上-n1就是一次只喂 1 个,比如cat txt|xargs -n1 echo会把一行长文本变成极度规整的一列多行输出。-t(透明执行):在后台真正开干之前,先把即将执行的完整命令一字不落地打印在终端屏幕上,做到绝对的公开透明。-i或-I <指示符>(位置黑客):这是 xargs 中最逆天的功能!由于默认只能把参数硬塞在下游命令的最后面,但如cp {上游结果} destFolder这种需要将参数插在中间的命令就会极其尴尬。使用-I %就可以定义%为指示占位符。例如ls *.bak | xargs -I % cp % /tmp/test中,第一个%是神圣声明,第二个%则是精确制导的调用占位。你也可以用传统的{},像ls | xargs -t -i mv {} {}.bak完美实现批量改名。-r(空转保护):也就是no-run-if-empty。一旦探测到 xargs 的上游输入空空如也,直接拉闸停止,绝不浪费系统资源去执行下游那毫无意义的空命令。-s num(长度天花板):严格框定 xargs 后方紧跟着的那个命令的最大字符总长度。一旦传入的参数使其超载,立刻无情报错并拒绝对超标部分执行。-L num/-l(行数天花板):规定每次执行最多只能吃进多少行的非空白输入数据。-d delim(自定义切割刀):不满于默认的回车和空格分割?用此参数强行篡改 xargs 识别切分块的边界字符。-x(超载自毁):通常配合-s使用,一旦越界立刻退出系统进程。-P(多核并发爆发):瞬间提升生产力,修改工具允许同时跑的最大系统进程数。默认可悲的只有 1,若敢于设置为 0,它将彻底解除封印,疯狂拉起as many as it can(它所能企及的极限)的进程并发执行任务。
极客联合实战案例
配合 file 验明正身:通过
find / -type f -print |xargs file,将茫茫大海里的普通文件捞出,一批批送进 file 仪测定其真实的底层文件格式。清理崩溃遗迹 core 文件:
find . -name "core*" -print|xargs echo " ">/tmp/core.log,找到系统崩溃吐出的巨大 core 文件,并将其信息重定向记入日志。极致的后台批量抹杀:用
find ./ -size 0 | xargs rm -f &在系统后台无声无息地抹去所有碍眼的零字节废文件。批量剥夺权限:
find / -type f -print | xargs chmod o -w对全盘文件重拳出击,拔除所有“其他人”的写入权限,极大稳固系统安全防线。广域字符串猎杀:
find . -name * -print |xargs grep "DBO"遍历当下所有文件,并在其中翻江倒海地寻找 “DBO” 字符串。
locate 命令
如果说 find 是地毯式的一寸寸挖掘,那 locate 就是直接翻开上帝视角的账本。它实际上是 find -name 的超级极速版替身,但查询速度有着碾压级的优势。
极速背后的原理与致命弱点
其快如闪电的根本原因在于,它绝对不去苦哈哈地遍历真实的硬盘目录,而是直接去查询一个事先建立好的巨大本地信息数据库(路径固定在 /var/lib/locatedb)。Linux 系统极其聪慧,会自动在后台创建这个数据库,并在每天定时执行一次全盘扫描更新。
但致命代价也随之而来:任何在今天数据库更新之后才刚刚发生变动或被凭空创造的文件,对 locate 而言就像隐形了一样,完全查不到!为了破解这种尴尬,取证人员在搜寻前,必须要有强迫症般地先敲下 updatedb 命令,强迫系统立刻去扫描硬盘刷新该底层数据库。
实战狙击
前缀速搜:
locate /etc/sh瞬间锁定 etc 这片区域内所有以 sh 为首缀的文件名单。无视大小写的宽泛搜索:利用
-i参数执行locate -i ~/m,在用户自己的地盘里把所有 m 或 M 开头的文件一锅端。
whereis 命令
这个命令极其偏科且固执,它绝不理会普通的凡夫俗子文件,它的雷达只能且仅能用于寻找系统程序名背后的核心三大件:
极其底层的二进制可执行文件(通过
-b参数锁定)。详尽的 man 帮助说明文档(通过
-m参数锁定)。开发者的 源代码文件(通过
-s参数锁定)。如果执行时不带任何偏见参数,它将慷慨地把这三类所有关联信息一次性吐给你。例如执行
whereis grep,它不仅告诉你程序的本体在/bin/grep,还会连带把藏在/usr/share/man/...下的帮助说明文件路径一并甩出。
which 命令
当我们敲击一个指令时,系统究竟唤醒了哪里的幽灵?which 命令的作用就是在极其关键的全局 PATH 环境变量所死死限定的路径列表中,去搜寻某个系统命令的藏身之所,并且一旦找到第一个符合条件的目标就会立刻折返并返回结果。
这就意味着,利用 which 我们可以一眼看穿某个系统命令当前是否在系统里苟延残喘(是否存在),以及你刚才执行的,到底是系统正规路径下冰清玉洁的命令,还是黑客在其他路径伪造的李鬼版本。例如敲击 which grep,它会老老实实地交代 /bin/grep 这一绝对路径。
