☰
Linux核心命令实战:从文件权限到进程与网络排查
2026/10/19 8:45:04 网站建设 项目流程

直接从我最常用的几个命令讲起吧。做运维和开发这些年,Linux命令行几乎天天打交道。很多人觉得“Linux核心命令”就是背一背ls、cd、rm、cp,其实远没有那么简单——真正核心的不是某个命令的语法,而是你面对一个实际问题时,知道该调用哪个工具、怎么组合、参数怎么配。这篇内容我尽量按实战视角来讲,把命令背后的原理、踩过的坑、排查思路都过一遍,适合刚开始接触Linux的朋友,也适合用了一段时间但总觉得“命令都见过、遇到问题还是懵”的同行。

1. 先搞清楚:Linux命令到底在解决什么问题

1.1 命令行的核心价值不是“酷”,是效率

很多刚接触Linux的同学会问:为什么非要记命令行?图形界面多直观。我在实际工作中体会最深的一点是:命令行最大的价值在于可组合、可脚本化、可远程。你可以在图形界面里点十下鼠标完成一次文件复制,但要在上百台服务器上批量做同样的事,只能靠命令和脚本。而且服务器环境往往没有图形界面,SSH连上去就是一片黑底白字,这时候命令就是你唯一的操作手段。

Linux命令的设计哲学沿用了Unix时代的思路:每个命令只做一件事,把事情做好,然后通过管道把输出交给下一个命令。比如查找某个进程并强制结束,单独用ps或者单独用grep都做不到,但组合起来就是一条命令的事。这种“小工具大协作”的思路,是理解Linux核心命令的钥匙。

1.2 命令结构的基本认知

一条完整的Linux命令通常包含三部分:命令本身、选项(参数)、操作对象。比如:

ls -la /home/user

其中ls是命令,-l和-a是选项,/home/user是操作对象。选项的作用是修改命令的默认行为,-l表示以长格式输出,-a表示显示隐藏文件。这里有个细节:很多命令的选项可以用短横线加单字母(-l),也可以用双横线加单词(--all),两者等价,但脚本里建议写完整的单词选项,可读性更好,不容易被后来维护的人看懵。

还有一个容易忽略的点:命令的返回值。Linux世界里,命令执行成功的返回码是0,非0则代表各类错误。这个特性在写脚本时尤其重要:

if grep -q "error" /var/log/app.log; then echo "日志里发现了error" fi

-q让grep静默输出,只用返回码表示是否匹配成功。如果不理解返回码机制,很多脚本逻辑会写得很绕。

2. 文件与目录操作:日常最高频的指令

2.1 导航类命令:pwd、ls、cd、find

先说pwd,打印当前工作目录。很多人觉得它没用,但在脚本里它经常用来确认执行环境。我见过不少事故,就是脚本里用了相对路径,结果crontab执行时工作目录跟预期不一样,操作到了错误的文件上。所以在脚本开头加上pwd或者直接用绝对路径,是个好习惯。

ls是最基础的命令,但参数多到值得专门列出来。我日常最常用的是ls -la:

  • -l:长格式,显示权限、属主、大小、修改时间;
  • -a:显示隐藏文件(以.开头的文件);
  • -h:配合-l使用,把文件大小显示为K、M、G这种人类易读的单位;
  • -t:按修改时间排序,排查“刚才哪个文件被动了”很好用;
  • -S:按文件大小排序,大文件排查首选。

cd命令本身没什么可说的,但我建议养成用cd -的习惯。它表示回到上一个工作目录,比手敲一长串路径快得多。另外cd ~回到当前用户家目录,cd /回到根目录。

find是查找文件的重器,新手容易在这里踩坑。先看一个常见场景:查找某个目录下所有.log文件并删除。

find /var/log -name "*.log" -mtime +7 -exec rm {} \;

拆开解释:-name按文件名匹配,*.log是通配符;-mtime +7表示修改时间在7天以前;-exec rm {} \;是对每个结果执行删除操作,{}是结果的占位符。这里有个大坑:find配合-exec或-delete非常危险。我建议任何删除操作之前,先不加-exec跑一遍,把结果看清楚了再加。更稳妥的方式是用-print先输出确认:

find /var/log -name "*.log" -mtime +7 -print

确认无误后再执行删除。另外find默认不会进入没有权限的目录,会输出一堆“Permission denied”的报错,看着心烦可以加2>/dev/null把错误信息丢弃。

2.2 文件操作:cp、mv、rm的细节与风险

cp复制文件,mv移动或重命名,rm删除。这三个命令语法简单,但细节坑多。

cp我强烈建议默认带-a或者至少带-r。-r递归复制目录,-a是归档模式,在-r基础上还保留权限、时间戳等属性。复制目录时如果忘了-r,会直接报错“omitting directory”。还有一个极易忽略的点:cp -r和cp -a的差异在复制配置文件时特别明显。有一次我用cp -r覆盖了一个应用的配置文件,结果属主和权限全变了,应用启动直接报权限错误。用cp -a就能把原文件的属主、属组、权限一并保留,避免这类问题。复制多个文件到目录时要小心cp的用法:

cp file1.txt file2.txt /backup/

最后一个参数必须是目录,否则会把前面几个文件的内容拼起来覆盖成一个文件,这个操作我是真见人踩过。

mv在同一文件系统内是修改路径记录,瞬间完成;跨文件系统则是先复制再删除,耗时跟文件大小成正比。所以要移动一个很大的目录到另一个磁盘分区时,mv可能比预想中慢很多。此时可以用rsync先同步,确认无误后再删除源,操作更可控。

rm是Linux里最危险的命令之一。我个人的习惯是:凡是要删除的东西,先mv到一个临时目录,确认一周没问题再真正删除。尤其是rm -rf这种组合,一个路径写错就可能把整个系统删掉。曾经有同行在删除时写成rm -rf / var/log(/和var/log之间多了一个空格),直接把系统根目录干掉了。这种事故不是段子,是真实发生的。所以只要涉及rm -rf,建议先用ls确认路径,再动手。

2.3 查看文件内容:cat、less、tail、head

查看小文件用cat没问题,但大文件用cat会把整个屏幕刷爆,还占内存。这时候该用less。less支持上下翻页、搜索、跳转,查大日志文件非常合适。进入less后按/输入关键字搜索,按n跳到下一个匹配项,按q退出。这两个快捷键我每天用几十次。

tail是排查日志的神器,tail -f可以实时跟踪文件追加内容,服务起不来、报错看不到时,开一个终端挂着tail -f看日志是标准操作。tail -n 100显示最后100行,而不是默认的10行,排查问题信息不够时很常用。head则相反,看文件开头。还有一个组合技巧:用tail -f配合grep做实时过滤:

tail -f /var/log/app.log | grep "ERROR"

这样只关注报错信息,不会被大量正常日志淹没。

3. 权限体系:新手最容易翻车的环节

3.1 读懂权限位:rwx与数字的对应关系

Linux的权限模型是三组九位:属主(u)、属组(g)、其他用户(o),每组各包含读(r)、写(w)、执行(x)三个权限位。ls -l输出里的-rw-r--r--就是权限的直观展示。

第一个字符是文件类型:-普通文件,d目录,l符号链接,c字符设备等。后面三组rwx分别对应属主、属组、其他用户。

数字表示法是权限的二进制编码:读r算4,写w算2,执行x算1,累加得到该组的数值。比如rwx是7,r-x是5,r--是4。chmod 755就等于属主7(rwx)、属组5(r-x)、其他5(r-x)。目录的执行权限(x)意味着能否进入该目录,所以目录的r-x其实表示“能看到目录内容列表但只有读权限”,没有x就进不去,这个点新手经常搞混。

3.2 chmod的实践要点

chmod修改权限,两种写法都需要掌握。符号写法直观:

chmod u+x script.sh # 给属主加执行权限 chmod 755 script.sh # 数字写法定权限

脚本文件必须要有执行权限才能直接运行,所以写完shell脚本第一件事往往是chmod +x。

这里要特别提醒:对一个目录用chmod -R时务必谨慎。-R会递归修改目录下的所有文件,如果对/目录误操作,整个系统的可执行权限都会乱掉。某次我见同行想给一个应用目录加权限,结果路径写到了应用目录的父级,递归下去把系统命令的权限也改了,最后只能联系机房处理。正确的操作是:先确认当前路径,再缩小权限范围,必要时加--preserve-root防止对根目录的递归操作。

3.3 chown与属主概念

chown修改文件属主和属组:

chown user:group file.txt chown -R user:group /data/app/

在部署应用时,代码文件必须属于运行该应用的用户,否则应用没有权限读取配置或写入日志。这个坑在“越权”或“无权限”报错里占了很大比例。排查权限问题有个实用命令id,查看当前用户的uid、gid和所属组列表,能快速确认你是不是预期的用户。

还有一个很多人不知道的概念:umask。它决定了新建文件的默认权限。系统通常设置umask 022,所以新建文件默认是644(rw-r--r--),新建目录默认是755。如果希望团队共享目录下所有新文件都带组写权限,就把umask改成umask 002,但这需要全局配置,不能只在一个终端里改完就算数。

4. 进程管理与系统状态监控

4.1 ps:查看进程的核心命令

ps是进程管理的基础。两个最常用的形式:ps -ef和ps aux。我看到很多人纠结它们有什么区别,其实大同小异——两者的字段基本一致,都能看到PID、PPID、CPU、内存、启动时间、命令行。ps aux是BSD风格,ps -ef是Unix风格。有些系统上ps aux会对CPU使用率做归一化显示,略有差异。日常用哪个都行,但我个人习惯ps -ef,输出格式更稳定。

排查问题最常用的组合:

ps -ef | grep java ps aux | sort -rk3 | head -10 # 按CPU占用排序,看前10

第一条用来找某个服务的进程,第二条看哪几个进程吃CPU最狠。注意ps aux | sort -rk3中的-k3是按CPU那一列排序,-r是倒序。

只看某些进程的PID,有更精准的方式:

pgrep -f "app.jar" pidof nginx

pgrep -f支持按完整命令行匹配,比pgrep按进程名匹配更可靠,因为有些进程名被截断或者被改过。

4.2 top和它的替代品

top是实时监控的神器,打开后默认按CPU占用排序,按M键换成内存排序,按P键换回CPU排序。练熟几个交互键很有用。当然,日常运维中我更多用htop,显示更直观,还能用F6按指定列排序,支持鼠标操作,但需要额外安装。

看之前有个细节:top里的%CPU值可以超过100%,因为多核处理器下,一个进程可以同时占用多个核。如果你拿top发现某个进程CPU显示200%,不要慌,那是它占满了两个逻辑核。

一次性输出top结果,适合脚本采集:

top -b -n 1 | head -30

-b是批量模式,-n 1只执行一次,head -30只取前30行。这样就能拿到当前系统的实时快照,而不是进入交互界面。

4.3 kill:结束进程的正确姿势

kill的本质不是“杀掉进程”,而是给进程发送一个信号。默认发送的是SIGTERM(信号15),让进程有机会做清理工作再退出。如果进程不响应SIGTERM,才考虑用kill -9(SIGKILL),那是强制内核直接结束进程,不给任何清理机会。

我的建议是:先kill(SIGTERM),等几秒,不行再kill -9。直接kill -9容易导致数据丢失,尤其是数据库、消息队列这类需要持久化的服务。举个例子,某次我处理一个卡死的应用服务,直接用kill -9把它结束了,结果它正在写的缓存索引没有落盘,重启后花了大半天做一致性校验。如果之前先kill,应用有机会处理未完成的事务。

批量结束进程可以结合pgrep:

pkill -f "app.jar"

pkill -f按完整命令行匹配,比pkill按进程名匹配要精准,但也更危险——匹配串写得太宽泛,可能误杀无关进程。用之前先跑一下pgrep -f "app.jar"看看匹配到了什么。

4.4 系统资源监控:free、df、du

内存排查用free -h:

free -h

输出里的available是真正可用的内存量,而不是free那一列。因为Linux会把空闲内存用作缓存(buff/cache),在需要时释放出来,所以free很小不代表系统内存不够,得看available。这个点我强调很多次了——你看到free显示几百M就以为内存爆了,其实系统健康得很。

磁盘排查用df -h和du -sh。df -h看文件系统的总容量和使用情况,du -sh看某个目录占了多少空间:

df -h du -sh /var/log du -sh * | sort -rh | head -10 # 当前目录下各子目录大小排序

磁盘满是很常见的事故,排查思路是先用df -h确认哪个分区满了,再进到对应目录用du逐级定位大文件。du -sh *中不带/的写法,统计的是当前目录下的直接子项,方便快速聚焦。

5. 文本处理三剑客:grep、sed、awk

5.1 grep:过滤文本的第一选择

grep按模式匹配文本行,是日志分析、配置排查的基础工具。最常用参数:

  • -i:忽略大小写;
  • -v:反向匹配,输出不匹配的行;
  • -n:显示行号;
  • -r:递归搜索目录;
  • -l:只输出包含匹配内容的文件名;
  • -c:统计匹配的行数。

看一个综合场景:找出日志文件中所有包含“ERROR”且不含“timeout”的行,带上行号:

grep -n "ERROR" /var/log/app.log | grep -v "timeout"

管道把两个grep串起来了,非常符合Linux的设计哲学。还有一个高频用法是统计各等级日志的数量:

for level in ERROR WARN INFO; do echo "$level: $(grep -c "$level" /var/log/app.log)" done
日志文件几百M甚至几个G都不罕见,但grep依然能秒级返回,因为它的匹配逻辑经过了深度优化。不过要记住grep是按行匹配,不是按流匹配,处理超大文件时内存占用是可控的,因为它逐行读入、逐行输出。 ### 5.2 sed:流式编辑,批量替换利器 `sed`的英文全称是stream editor,流编辑器。它逐行处理文本,适合批量替换、删除、打印指定行。最常用的是替换: ```bash sed -i 's/old/new/g' file.txt

-i表示直接修改文件,s/old/new/g是把所有old替换成new,末尾的g表示全局替换,不加g只替换每行第一个匹配。这个命令在批量修改配置时非常有用,比如把一批配置文件里的IP地址批量替换。

但sed -i直接改文件前一定要确认匹配模式正确。我曾经写一条sed -i想把日志里的敏感字段脱敏,结果正则写得太宽,把正常数据也替换了,回滚时只能从备份恢复。所以更稳妥的做法是:先不加-i,把替换结果输出到屏幕确认:

sed 's/old/new/g' file.txt | head -20

确认无误后再加上-i执行。

sed删除指定范围行也常用:

sed -i '1,5d' file.txt # 删除前5行 sed -i '/^#/d' config.conf # 删除所有注释行

5.3 awk:按列处理文本的利器

awk比grep和sed更强大,它能按列拆分文本、做条件判断、甚至做统计。最经典的用法是看某一列的内容:

awk '{print $1}' file.txt

$1是第一列,$2是第二列,依此类推。组合条件可以做很多事。比如从ps -ef输出中提取所有java进程的PID:

ps -ef | awk '/java/ && !/grep/ {print $2}'

这条命令把ps输出的每一行拆成多列,$2是PID列。这里!/grep/是为了排除grep命令本身产生的进程。

awk的统计能力也很实用。分析nginx访问日志,请求量Top10的IP:

awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10

$1是IP列,sort排序,uniq -c统计每个IP出现的次数,sort -rn按次数倒序,head -10取前10。

如果要说awk的学习曲线,它本质上是一门小型编程语言,有变量、循环、条件、函数。日常使用不需要掌握全部,把$列引用、BEGIN、END、if条件这几个概念搞懂,就能应付绝大多数日志分析场景。我在实战中最常写的awk就是awk -F, '{sum+=$5} END {print sum}'这种汇总求和,-F,指定逗号作为列分隔符,END块在处理完所有行后执行。

6. 网络排查:从ping到curl

6.1 ping与连通性判断

ping测试主机连通性,原理是发送ICMP回显请求。ping -c 4指定发送几个探测包,而不是默认无穷无尽地发。这个细节很重要,公网环境的服务器一般禁止外网Ping,所以ping不通不代表网络不通,可能只是防火墙丢弃了ICMP包。

判断域名解析是否正常,用nslookup或dig更直接。某次我排查“域名访问不了”的问题,先ping域名不通,误以为网络断了,结果dig发现是DNS解析返回了错误的IP,跟网络压根没关系。所以套路应该是:先ping测IP连通性,再dig测域名解析,分别定位问题。

6.2 curl:万能HTTP调试工具

curl是排查HTTP接口的首选工具,功能强大到可以当半个接口测试工具用。常用参数:

  • -i:输出响应头;
  • -v:输出详细交互过程,包括SSL握手、请求头、响应体;
  • -X:指定请求方法;
  • -H:自定义请求头;
  • -d:携带请求体数据;
  • -s:静默模式,不显示进度条;
  • -o:把响应体保存到文件。

排查接口返回慢的经典操作:

curl -i -v http://localhost:8080/api/health

-i能看到响应状态码,-v能看到连接建立的每个环节——TCP连接、TLS握手、发送请求、等待响应。如果卡在TLS握手阶段,通常是证书或SSL配置问题;如果请求发出去后迟迟没有响应,通常是应用层处理慢。

只测接口通不通,可以用-s -o /dev/null -w输出耗时统计:

curl -s -o /dev/null -w "HTTP状态码: %{http_code}\n耗时: %{time_total}s\n" http://localhost:8080/api/health

这个写法在探活脚本里很常见,-o /dev/null丢弃响应体,-w自定义输出格式。

6.3 端口监听与连接排查:netstat和ss

排查端口占用或服务监听情况,老牌命令是netstat,新一代工具是ss。两者功能类似,但ss更快,信息更全。最常用:

ss -tlnp netstat -tlnp

-t显示TCP,-l只看监听状态的端口,-n用数字显示地址和端口,-p显示对应的进程名和PID。这个命令能回答“这个端口有没有被监听”“是哪个进程在监听”这两个日常问题。

排查端口被占用,可以用:

lsof -i:8080

lsof列出所有打开的文件,-i:8080筛选出绑定8080端口的进程。解决“端口被占用”问题时,先lsof找到PID,再核对进程是否还需要,不需要就kill掉。

7. 常见问题速查:直接对着排查

7.1 “command not found”的常见原因

命令找不到,先别急着怀疑系统坏了。多半是三种情况:命令确实没安装、路径不在PATH里、拼写错误。

判断是否已安装,用which和type:

which curl type -a curl

which在PATH里查找可执行文件,type -a还会显示alias定义,比which信息更全。如果which找不到,但命令应该是系统自带的,检查一下PATH环境变量是不是被人为改乱了。我见过有脚本在运行时把PATH给覆盖了,导致后续调用的命令全部找不到。

如果是没安装,各发行版安装方式不同。Debian系的用apt install,红帽系的用yum install或dnf install。装之前先更新软件源缓存,不然可能提示找不到软件包。

7.2 “Permission denied”的排查思路

遇到权限拒绝,按照这个顺序查:先用ls -l看文件权限,再用id确认当前用户身份,最后根据情况调整属主或权限。

重点检查目录的所有权和权限,尤其是日志目录、上传目录、部署目录这一类。应用报“can't write”类错误时,往往不是文件权限问题,而是它所在目录没有写权限。逐层用ls -ld查目录权限:

ls -ld /data/app/

7.3 磁盘满了但还是删不掉文件

这是经典诡异问题:df -h显示磁盘使用率100%,但du -sh统计各目录加起来却远小于总量。原因是有进程还在占用已删除的文件。Linux下删除文件只是解除链接,如果进程还持有该文件的文件描述符,空间不会真正释放。

排查方法:

lsof +L1

+L1列出所有被删除但仍被占用的文件,看到PID后,重启或kill掉对应进程,空间才会释放。这个场景在日志轮转失败的服务器上特别常见,logrotate把日志文件删了,但应用进程还持有旧文件句柄,磁盘空间一直不降。

7.4 端口占用冲突

启动服务报“Address already in use”,说明端口被别的进程占了。常规操作:

ss -tlnp | grep 8080

找到PID后,用ps -ef确认是什么进程,再决定是杀进程还是换端口。还有一种情况是端口处于TIME_WAIT状态,这是TCP四次挥手后的正常状态,过一会儿会自动消失,不需要处理。

8. 命令学习的几个习惯建议

8.1 用man和--help解决参数遗忘

记不住参数太正常了,我到现在还经常翻man。man页面内容太多时,用/搜索关键字很快。比如man tar里想找压缩相关参数,输入/压缩直接跳到对应位置。

大部分命令还支持--help快速查看用法,比man更精简。我的建议是:先用--help看大体,细节拿不准时再开man。如果你连命令名字都想不起来,用apropos按功能描述反查:

apropos "copy files"

8.2 用history和alias积累自己的快捷方式

history查看命令历史,!123执行历史里第123条命令,!!执行上一条命令,Ctrl+r反向搜索历史命令。这套操作我每天都在用,能省下大量重复敲命令的时间。

alias给常用命令设置别名。我个人的配置是把rm设置成rm -i,让删除前必须确认,防止手滑误删。还有ll、la这类别名,不同发行版默认配置不一样,建议自己统一。

8.3 安全使用命令的三条铁律

一是高风险命令先输出再执行。find、rm、sed -i这类命令,先看结果再动手,别直接一把梭。

二是涉及批量修改前做好备份。cp -a做一份备份不费什么事,但恢复成本极低。

三是不确定参数含义时先查文档。我用rm -rf的另一种危险情况是变量值为空,比如脚本里rm -rf $DIR/这种写法,如果$DIR没赋值,命令就变成了rm -rf /,直接删根目录。写脚本时对这种裸变量要格外小心,至少加一层判断或使用${DIR:?}这种参数展开确保变量非空。

8.4 建议的进阶方向

掌握了上面的核心命令,下一步可以往三个方向深入。一是管道和重定向的灵活运用,把多个命令组合成流水线,这是Linux操作效率提升的关键。二是shell脚本,把常用操作固化成脚本,减少重复劳动。三是系统性能分析与调优,结合vmstat、iostat、strace这些更底层的工具,追踪系统瓶颈。

我个人在实际操作中的体会是:命令的熟练度没有捷径,靠的是高频使用和不断踩坑。每遇到一个问题,解决后花一分钟想想“为什么这样能解决”,比机械地复制命令有用得多。等到你形成自己的排查套路——先看哪里、用什么命令、怎么缩小范围,那时候才算是真正入门了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询