
你印象里的“黑客大神”是不是总跟“炫酷工具”“黑进某个系统”这些词绑在一起我干了这么多年运维和系统安全相关的工作接触过不少真正把 Linux 玩明白的人反而发现一个反直觉的事实他们日常敲得最勤的恰恰是 Linux 里那批最基础、最常见的命令。find、grep、ss、ps、kill、tar、scp、curl、chmod、xargs单拎出来你可能都认识但把它们按场景组合起来几乎能解决服务器排查、安全审计、应急响应里一大半的问题。这篇博文不教你怎么“炫技”而是把这 10 个 Linux 命令放到真实工作场景里讲清楚每条命令到底解决什么问题、为什么安全研究者和运维老手离不开它们、有哪些坑必须避开。文中所有示例都是我在自己搭的测试机或授权环境里跑过的你完全可以照着敲一遍。1. 先泼盆冷水“黑客命令”的本质是基本功1.1 为什么真正的高手反而天天用基础命令很多人以为高手手里一定有一堆“神兵利器”其实未必。市面上的图形化管理面板、商业化运维工具底层逻辑大多是对系统命令的封装。图形界面一旦遇到异常流量、日志刷屏、进程僵死往往先卡住的是界面本身你依然得回到命令行一条一条地把问题拆出来。更关键的是“快”并不是因为记住了多少冷门参数而是因为脑子里有一条清晰的判断链。比如服务器负载突然飙高一个有经验的人会这样走先用 uptime 看整体负载再用 top 找 CPU 大户接着 ls -l /proc/PID/exe 看这个进程的真实路径再通过 ss 查它有没有异常外联最后去日志里 grep 当时发生了什么。这一整条链路上没有一个是所谓“黑客专用工具”全是基础命令。真正定义“黑客”的不是破坏力而是对系统运行机制的理解深度。那些只顾着用现成脚本“打点”的人圈子里通常叫“脚本小子”真正被尊重的是能讲清楚“这个命令为什么这样工作、这条输出说明什么问题”的人。而且所有安全测试的前提都是授权和防御视角——想办法发现自己系统的漏洞比想办法利用它重要得多。1.2 先把这 10 个命令摆上桌下表是这篇文章的主线后面我会围绕它们逐个展开。建议你先把它保存下来当一张速查卡用。命令作用安全/运维视角看什么find按文件名、时间、权限等条件查找文件找被篡改文件、找 webshell、找高权限文件grep按模式过滤文本在海量日志里捞攻击线索、找配置文件里的敏感信息ss查看网络套接字和连接状态确认本机开放端口、发现可疑外联ps查看进程快照定位异常进程、梳理进程父子关系kill向进程发送信号优雅停掉业务或强制清理僵死进程tar打包、压缩、归档应急时保留现场、快速备份目录scp基于 SSH 加密传输文件安全地把文件从一台机器搬到另一台curl发送 HTTP/HTTPS 请求探测服务指纹、验证 Web 状态码chmod/chown/sudo管理权限和归属排查提权风险、遵循最小权限原则xargs把标准输入转成命令行参数把 find、grep 的输出批量交给后续命令处理表格只负责“摆出来”。命令光会敲没用真正值钱的是看懂输出、形成判断。2. find grep把“找东西”做到极致侦察就赢了一半2.1 find不是“查个文件名”那么简单find 在很多人手里只用来find / -name xxx这有点浪费。安全场景里find 最值钱的是组合条件的能力。排查 Web 目录时我经常这样找最近 24 小时内被改动过的 PHP 文件find /data/wwwroot -type f -name *.php -mtime -1这条命令的含义是在 /data/wwwroot 下找普通文件、后缀是 .php、且修改时间在 1 天内。如果网站平时没人更新突然冒出一批新 PHP 文件就需要认真看一眼了。找 SUID 文件是另一个高频场景。SUID 是 Linux 里一种特殊权限位拥有它的程序会以“文件属主”的身份运行。攻击者一旦拿到这类程序就可能用它来完成提权。所以防御者的习惯是定期扫一遍find / -perm -4000 -type f 2/dev/null-perm -4000表示匹配所有设置了 SUID 位的文件2/dev/null是把“Permission denied”这类错误信息丢掉不然输出里会混进大量噪音。还有几个参数我在实际排查中几乎必用参数含义典型用法-name / -iname按文件名匹配i 忽略大小写-iname *.jsp-type按文件类型过滤-type d只看目录、-type f只看文件-mtime / -atime / -ctime按修改/访问/状态变更时间过滤-mtime 30找 30 天前修改的-size按文件大小过滤-size 500M找超大文件-user / -group按属主/属组过滤-user www-data-exec / -print0对结果执行命令 / 以空字符结尾输出配合 xargs 使用这里说两个我踩过的坑。第一个坑-mtime -1指的是“过去 24 小时内”不是“今天”。如果想找“今天凌晨 0 点以后”改过的文件得用-newermt 2025-01-01 00:00:00或者先touch一个时间标记文件再find . -newer /tmp/marker。我在等保测评和应急响应时经常用这个技巧非常实用。第二个坑find /全盘扫描时千万记得排除/proc、/sys、/dev这类虚拟目录。否则结果会被大量系统内核信息刷屏而且扫描慢到怀疑人生。实测下来一次带排除项的全盘扫描可能只需要几十秒不带排除项可能要跑十几分钟。2.2 grep在海量日志里捞一条攻击线索系统日志动辄几百 MB人工翻等于大海捞针。grep 的价值就是用一条命令瞬间把可疑内容捞出来。最典型的场景是登录日志分析。假设你的 sshd 日志写在 /var/log/auth.log想看看失败登录的次数和来源grep Failed password /var/log/auth.log | awk {print $(NF-3)} | sort | uniq -c | sort -nr这条链路的思路是先用 grep 把“密码错误”的记录全过滤出来再用 awk 取来源 IP 那一列接着 sort 给相同 IP 排到一起uniq -c 统计每个 IP 出现的次数最后 sort -nr 从大到小排列。敲完你会看到一张“爆破源 IP Top 榜”一眼就能判断有没有人在试图爆破你的服务。查 Web 日志也一样。Nginx 或 Apache 的 access.log 里如果出现大量包含eval、base64、cmd的请求多半有人在探测。你可以直接grep -i -E eval|base64|cmd /var/log/nginx/access.log | tail -n 50-i忽略大小写-E启用扩展正则tail -n 50只看最后 50 行避免被刷屏。grep 常用参数并不复杂但有几个细节值得记住参数作用-r / -R递归搜索目录-i忽略大小写-E扩展正则表达式-w全词匹配避免误伤-l只输出包含匹配内容的文件名-c输出匹配行数-n显示行号-A / -B / -C显示匹配行的后 N 行 / 前 N 行 / 前后各 N 行搜配置文件里的敏感信息时我常用递归加忽略大小写grep -rEi password|secret|api[_-]?key /data/wwwroot/app/config这个操作是双刃剑一方面能发现上线前忘记删的测试密码另一方面也提醒你千万别把真实密钥写进代码仓库。建议每个月跑一次养成习惯。如果日志已经被压缩别先解压再 grep直接zgrep就能处理 gzip 压缩文件。这个命令不在这 10 条里但配合 grep 使用能省很多事。3. ss ps kill网络连接与进程的暗战先看得见再处置3.1 ss一条命令看清网络连接过去大家习惯用 netstat现在新装的 Linux 发行版里ss 才是默认预装的网络套接字工具速度快、输出信息也全。它解决的问题是这台机器当前到底跟谁在通信哪些端口在对外提供服务。最常用的组合是ss -tunlp拆开解释-t只显示 TCP-u显示 UDP-n不做域名反解不然会卡在 DNS 查询上-l只显示监听状态-p显示对应的进程 PID 和名称。如果你看到某个端口在监听却对应不到任何已知服务就要警惕了。排查可疑外联时我更关心 ESTABLISHED 状态的连接ss -antp | grep ESTAB它会列出所有已建立的连接和对应进程。结合前面的 ps 看进程名基本能判断“这个连接正不正常”。还有一个细节ss 输出的第一行是表头里面有一个Recv-Q和Send-Q很多人不看。如果Send-Q长期堆着大量数值说明对方接收不过来了可能是网络问题也可能是对方已经被打瘫。这个指标在做网络诊断时非常有价值。普通用户执行ss -p往往看不到别的进程的 PID这是内核权限限制解决办法是加 sudo。别嫌麻烦安全排查本来就该用足够权限。3.2 ps进程快照与异常进程定位ps 是一个“拍照”工具执行瞬间抓取系统里的进程状态。排查问题时第一步通常是先看 CPU 占用ps aux --sort-%cpu | head -n 15输出里会按 CPU 使用率从高到低排列头 15 行基本就是当前最“活跃”的进程。如果发现一个不认识的进程名占着高 CPU下一步不要急着 kill先看它的真实底细。Linux 的 /proc 目录帮了大忙。每个进程都有一个 /proc/PID 子目录里面存放着它的真实运行信息ls -l /proc/3312/exe cat /proc/3312/cmdline | tr \0 第一条命令会显示进程可执行文件的真实路径别被进程名骗了。比如一个伪装成kworker的挖矿程序进程名看着像系统内核线程但ls -l /proc/PID/exe会暴露它其实在 /tmp 下。第二条命令把命令行参数里的空字符换成空格能看完整启动参数。ps -ef也很常用输出里能看到 PID进程 ID和 PPID父进程 ID。正常系统服务通常由 PID 1systemd或特定守护进程拉起如果一个可疑进程的父进程是常用的 Web 服务进程那多半是被 Web 服务漏洞拉起来的处置时要连父进程的漏洞一起补否则杀了还会再起。需要提醒的是ps 只是一瞬间的快照要看动态变化还得靠 top 或 htop。排查时我会先用 top 观察几秒再用 ps 记录快照两者配合。3.3 kill不是只会 kill -9kill 常被误解为“结束进程”其实它的本质是向进程发送一个信号。信号有几十种平时最常打交道的是这三个信号数值行为适用场景SIGTERM15让进程自己处理正常退出默认能优雅停就优雅停SIGKILL9内核强制终止进程无法拦截进程无响应、僵死时用SIGHUP1让进程重读配置Web 服务、守护进程重载配置我的处置习惯是先给 SIGTERM等几秒如果进程还赖着不走再给 SIGKILL。直接kill -9虽然快但进程来不及清理临时文件、释放锁、写日志可能留下数据损坏的隐患。数据库、消息队列这类有状态的程序尤其不能乱用 -9。批量清理场景里用pgrep配合pkill最方便pgrep -f 可疑进程名 pkill -f 可疑进程名pgrep -f会匹配完整命令行先看它输出哪些 PID确认没有误伤再执行 pkill。搜索热词里有一个“并行执行linux命令”如果你需要并行操作多个进程后面讲 xargs 时会回应这个需求。有件事必须特别说明普通 shell 里敲 kill 默认只对当前用户权限范围内的进程生效想动别人的进程需要 sudo。如果你杀的是某个服务的子进程它可能被守护进程立刻重新拉起那就得先找到它的父进程或守护进程一起处理。4. tar scp curl打包、传输、探测三板斧4.1 tar打包归档是应急响应的第一步遇到服务器异常第一反应不是“删”而是“留证”。tar 这时候就是保命工具。我最常用的应急打包命令长这样tar --preserve-permissions --atime-preserve --xattrs -czf /tmp/evidence.tar.gz /data/wwwroot /var/log参数解释-c创建归档-z用 gzip 压缩-f指定输出文件名--preserve-permissions保留文件和目录权限位这个特别重要不然拿到证据拷到别的机器上权限全变了分析结果会被误导--xattrs保留扩展属性SELinux 标签、ACL 都在里面--atime-preserve尽量不改变文件的访问时间避免破坏现场日常备份则简单很多tar -czf /backup/site-$(date %F).tar.gz --exclude/data/wwwroot/cache /data/wwwroot--exclude可以把缓存目录排除掉否则备份里尽是些无意义的临时文件白白占用空间。解压之前我强烈建议先看看包里有什么tar -tzf backup.tar.gz | head -n 50-t是列出内容-z处理 gzip-f指定文件。为什么强调这个因为 tar 解压默认是“按路径直接落地”如果包里某个文件和当前目录同名它会直接覆盖掉。先看一眼能避免不少事故。压缩算法上gzip 兼容性最好老系统也不会出问题zstd 压缩速度和解压速度都更快只是对端可能没有对应工具。一般跨机器传输我优先 gzip本机归档用 zstd 多一些。4.2 scp跟 SSH 绑定的文件搬家工具两台 Linux 机器之间传文件最简单可靠的方式就是 scp。它基于 SSH 协议整个传输过程是加密的不需要额外开 FTP 服务。基本语法scp -P 22 -i ~/.ssh/id_ed25519 /tmp/evidence.tar.gz userbackup-server:/data/backup/注意参数是大写-P指定端口而 ssh 登录是-p小写这两个方向相反我见过不少人栽在这儿。-i指定密钥文件。传目录要加-r比如scp -r /data/logs userbackup-server:/data/backup/如果对端只有 rsync 而没有 scp也可以走 rsyncrsync 支持增量传输大批量、反复同步的场景效率更高。但两三分钟能传完的小文件直接用 scp 反而省事不用记一堆 rsync 参数。实际使用中最常见的报错是Permissions 0644 for xxx.pem are too open。这是 OpenSSH 的安全策略私钥文件权限太宽松会直接拒绝加载。解决办法是把私钥权限改成 600chmod 600 ~/.ssh/id_ed25519还有一个体验问题内网传文件很流畅跨公网就明显慢。先检查 MTU、带宽瓶颈别一上来就怀疑 scp 本身。文件落到对端之后记得顺手ls -l看大小和本机是否一致我把它当“传输完成确认”。4.3 curl一个请求探出 Web 服务的底细curl 是最通用的 HTTP 测试工具没有之一。安全场景里我经常用它做“服务指纹探测”——就是先摸清目标 Web 服务到底是什么、版本如何、再决定下一步怎么检查。看响应头curl -I https://example.com输出里会带出Server、X-Powered-By这类字段能快速判断是 Nginx 还是 Apache、有没有常见的应用框架。-I只发 HEAD 请求效率很高。只看 HTTP 状态码不关心页面内容可以这样写curl -s -o /dev/null -w %{http_code}\n https://example.com/-s静默模式去掉进度条-o /dev/null把响应体丢到黑洞里-w只输出自定义信息。拿它批量检查一批 URL 是否正常非常顺手。下载文件时curl -LO https://example.com/file.tar.gz-L是跟随重定向-O用服务端文件名保存。这里说三个容易踩的坑。第一个坑不带-L时遇到 301/302 重定向curl 只会输出跳转提示并不会自动跟上。你可能会看到一个空页面或者三行英文然后误判服务异常。第二个坑-k会跳过 TLS 证书校验测试自签名证书时确实方便但生产环境里滥用 -k 等于把 HTTPS 变成了明文。建议只在明确的测试环境使用。第三个坑-w里的格式串要用双引号还是单引号取决于 shell。一般用双引号写%{http_code}没问题但里面如果有$之类的特殊字符记得转义或改成单引号不然会被 shell 先展开掉。5. chmod/chown 与 xargs权限不是用来炫技的是用来守底线的5.1 chmod/chown/sudo权限模型是 Linux 安全的核心Linux 系统安全的核心就是权限模型。chmod 改读写执行权限chown 改属主和属组sudo 决定谁有资格执行特权命令。这三个命令表面上是“日常操作”实际上决定了系统边界牢不牢。权限位用数字表示时读是 4写是 2执行是 1。chmod 754 file的意思是属主有读写执行7属组有读和执行5其他人只有读4。这是最经典的生产环境配置思路之一。安全排查里我特别关注特殊权限位。比如查 SUID 文件find / -perm -4000 -type f 2/dev/null查所有设置了粘滞位sticky bit的目录find / -perm -1000 -type d 2/dev/null粘滞位通常用在 /tmp 这类公共目录上意思是“大家都能往里写文件但只有文件属主才能删自己的文件”。如果发现某个普通目录被设置了粘滞位虽然不一定是坏事也值得看一眼为什么。我在做基线核查时最常提醒的一句话是别随手 chmod 777。很多人图省事把 Web 目录直接放开写权限结果就是脚本文件可以被任意用户创建、修改为 webshell 制造了条件。正确做法是把目录属主改成 Web 服务运行用户比如 www-data然后按“属主读写执行、属组读执行、其他人读”来设置。chown 常见于数据迁移chown -R www-data:www-data /data/wwwroot。但-R只能作用于目录下的现有文件新建文件会继承父目录的属主和属组这时要配合chmod gssetgid让新文件自动继承目录的属组或者用 ACL。这个话题展开很大至少你要知道“改完属主后服务还是没法写文件”时大概率是父目录权限或新建文件继承的问题。sudo 的管理同样重要。sudo -l可以查看当前用户有哪些特权滥用NOPASSWD: ALL等于把 root 旁路掉了。审计时/etc/sudoers和/etc/sudoers.d/这两个地方一定要看。5.2 xargs让命令从“单个工具”变成“流水线”初学者最容易忽略的参数传递问题就是“管道右边能接什么”。command1 | command2里command1 的标准输出会被当作 command2 的标准输入但很多命令不接受“从标准输入读参数”它们要的是“命令行参数”。xargs 就是中间的转换器。一个典型例子找出一批文件然后逐个查看权限。find /tmp -name *.php -print0 | xargs -0 ls -la-print0让 find 用空字符而不是换行符分隔文件名xargs -0也按空字符解析。这样哪怕文件名里有空格、换行都不会出问题。如果不用 -0遇到evil file.php这种名字会被拆成两个参数。批量删除旧日志时find /data/logs -name *.log -mtime 30 -print0 | xargs -0 rm -f这条命令执行前一定要先去掉rm -f只跑前半段看输出确认列出的文件都是该删的。任何带批量删除的命令先 dry-run 一次是铁律。xargs 还能做并行执行。比如要并发发 100 个 HTTP 请求测试自己的服务seq 1 100 | xargs -I {} -P 20 curl -s -o /dev/null http://127.0.0.1/{}-P 20表示同时跑 20 个进程-I {}把每个输入替换成后面的占位符。这里搜热词里那个“并行执行linux命令”指的就是这类用法。注意别把并发数设得过高尤其是对生产环境很容易把人家的连接数打满变成变相搞破坏。6. 我把这 10 条命令串了起来两个真实排查场景6.1 场景一服务器负载突然飙高还看到陌生外联深夜收到告警一台线上机器 load average 到了 20而且安全告警提示有异常外联。我按下面的顺序操作每一步都有明确目的。第一步看负载和进程uptime top -c -b -n 1 | head -n 20-c显示完整命令行-b -n 1以批处理模式只取一次快照方便存档。此时会发现某个进程 CPU 占用异常。第二步通过 ss 看这个进程有没有对应的网络连接ss -antp | grep -E PID/程序名如果确实有大量 ESTABLISHED 连接连向陌生 IP基本可以断定有异常通信在发生。第三步查这个进程的底细ls -l /proc/PID/exe cat /proc/PID/cmdline | tr \0 ls -l /proc/PID/cwd/proc/PID/exe是真实可执行文件路径/proc/PID/cwd是工作目录。如果路径是 /tmp、/var/tmp那这进程几乎可以确定有问题。第四步去日志里确认它是什么时候出现的grep PID /var/log/syslog /var/log/auth.log 2/dev/null | tail -n 20第五步保留现场tar --preserve-permissions --atime-preserve --xattrs -czf /tmp/evidence-$(date %F-%H%M).tar.gz /tmp /var/log 相关可疑目录这里把可疑目录和日志一起打包便于后续分析也作为事后追责和复盘的材料。第六步确认没问题后再处置kill -TERM PID等几秒没死再kill -KILL PID。接着修漏洞来源比杀进程更重要否则它会换个身份复活。整个过程下来10 条命令里至少用到了 ps、ss、grep、find、tar、kill 六条全是基础组合。6.2 场景二对自家 Web 服务做一次快速自检如果你怀疑业务被“动过手脚”但又不想大动干戈可以按下面的清单快速自检全程只需要一个终端。先看 Web 服务返回什么curl -I https://example.com/ curl -s -o /dev/null -w %{http_code}\n https://example.com/admin/login第一句看响应头和框架指纹第二句验证关键路径是否可访问。再看日志里有没有异常请求grep -i -E eval|base64|cmd|\.php\?[^] /var/log/nginx/access.log | tail -n 50这种请求模式常用于后门探测看到可疑条目再针对性溯源。接着找目录里最近被改的文件find /var/www -type f -mtime -1 2/dev/null | grep -vE /cache/|/logs/ | head -n 50排除缓存和日志目录剩下的新文件逐一人工确认。然后扫一遍常见后门特征grep -rEi eval\(|base64_decode\(|assert\(|create_function\( /var/www --include*.php -l这个命令会列出所有含有可疑函数调用的 PHP 文件。不是命中了就一定是恶意代码但值得逐个打开看上下文。最后审查一下是否有不该出现的 SUID 文件find / -perm -4000 -type f 2/dev/null把这五步写进一个 shell 脚本每周定时跑一次就是一份“低配版安全巡检”。我自己的做法是配合 cron 或 systemd timer 自动执行有异常再人工介入。这 10 个命令真正用熟之后你会发现它们不是孤立的知识点而是一套可以随意组合的积木。排查问题时的核心不是“多敲一条命令”而是“知道该在什么环节、用什么命令收集信息”。Linux 系统设计的哲学本来就是“组合小工具解决大问题”这也是为什么基础命令越扎实的人遇到诡异问题时越冷静。最后聊几句题外话。我刚接触 Linux 那会儿总喜欢记那些冷门参数、背“大全式”命令手册后来发现真正解决问题时来来回回就是这十几个基础命令。命令不是越多越好“知道在什么场景下该用哪一条、输完以后会看到什么”才是关键。我的建议是搭一台自己的虚拟机或者云主机把它当成日常折腾的实验场遇到异常先别急着重装系统试着用这一串命令把问题“拆开”看看。每拆一次对系统的理解就深一层。这也是我和身边做运维、做安全的朋友都认同的一条路真正的“大神”不是工具多而是基本功足够扎实。