1. 从“用完就忘”到“按需检索”:我重新理解命令学习这件事
先说一个可能很多人都有过的经历:你是不是也曾把“Linux常用命令大全”这类文章收藏了一堆,结果真到排查问题时,还是得临时翻网页?我以前也是这样,直到有一次在客户现场,需要快速新建一个系统用户并配置好环境,我在终端里卡了足足十分钟——那个命令就在嘴边,但参数就是不确定,最后只能当着别人的面翻手册,场面相当尴尬。
那次之后我彻底想明白了一件事:命令从来不是背出来的,而是用出来的。 与其追求"记住所有命令",不如建立一套"按需检索 + 理解原理 + 实战验证"的方法论。这也正是我想在这篇文章里分享的核心。标题叫"Linux命令4",听起来像某个系列的第4篇,但我不想把它写成又一篇命令罗列大全。我更想把一些高频场景——用户管理、文件清理、跨机传输、端口排查、参数处理脚本——拆开揉碎,讲讲这些命令背后的逻辑、容易踩的坑,以及我在真实环境里验证过的用法。
这篇文章适合谁?如果你是刚开始接触Linux的运维新手,或者给自己装了一台Linux机器想系统折腾一下,又或者是准备面试、想把手底下的命令用得更扎实的开发同学,应该都能从这里找到点东西。我不会按字母表把所有命令过一遍,那样太无聊了,我按"实际干活时会遇到的场景"来组织内容,这样你读完就能直接上手。好,进入正题。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 文件与用户管理:这两个高频操作背后藏着多少细节
热搜词里出现频率最高的几个——linux新建用户、linux删除文件夹命令——恰恰是日常操作中翻车率最高的两个操作。很多人觉得这两个简单,但真要动起手来,细节决定成败。
2.1 删除文件夹命令:rm -rf 的威慑力与安全替代方案
先说删除文件夹。Linux下删除文件夹的命令基本就是 rm,这个命令本身不复杂:
bash复制# 删除单个文件
rm filename.txt
# 删除空目录
rmdir emptydir
# 递归删除目录及其内容(最常用)
rm -r dirname
# 强制删除,不提示确认
rm -rf dirname
看到 rm -rf 这几个字母,几乎每个老运维都会心头一紧。因为这个命令在特定情况下会变成"删库跑路"神器。最常见的翻车案例是:
bash复制rm -rf /var/log/ # 多一个空格,或者变量没赋值
如果你写 rm -rf $LOG_PATH/ 而 $LOG_PATH 没定义,那么命令实际执行的是 rm -rf /。在root权限下,这个操作会尝试删除根目录下的一切,虽然现代系统会有一些保护,但你会瞬间失去几乎整个系统。
我个人的建议是:能用 find 就尽量别直接裸用 rm -rf。 比如你想删除某个目录下所有超过30天的日志文件,rm -rf logdir/* 会一次全删,但用 find 可以更安全更精准:
bash复制# 找出并删除目录下超过30天的 .log 文件
find /var/log/myapp -name "*.log" -mtime +30 -exec rm {} \;
# 更稳妥:先查出来看看,确认无误再加 -delete
find /var/log/myapp -name "*.log" -mtime +30 -print
为什么推荐 find?因为可以先用 -print 把要删除的文件列出来,看清楚再动手。操作生产环境时,这种"先看后删"的习惯能救你无数次。另外,如果你担心自己哪天手滑,还有个技巧,就是给 rm 设置别名:
bash复制alias rm='rm -i'
把它写进 ~/.bashrc,每次删除前都会让你确认,至少能拦一下。当然这并不能彻底防呆,但多数情况下能避免悲剧。
2.2 Linux新建用户的完整姿势:从 useradd 到用户环境配置
新建用户也是热搜词里的高频操作。很多教程会说"用 adduser 或 useradd",但这两个命令其实有区别。在Debian/Ubuntu系上,adduser 是一个交互式的Perl脚本,会引导你完成设置密码、填写用户信息等步骤;而 useradd 是系统原生命令,参数丰富、适合脚本化操作。在CentOS/RHEL系上,adduser 实际上是指向 useradd 的符号链接,两者等价。
日常使用我用得最多的还是 useradd,配合那一串参数:
bash复制# 创建一个用户并指定家目录、Shell、附加组
useradd -m -d /home/zhangsan -s /bin/bash -G wheel zhangsan
# -m: 自动创建家目录
# -d: 指定家目录路径
# -s: 指定登录Shell
# -G: 附加组(CentOS系通常用wheel组给sudo权限)
这里有个常见的坑:如果你用了 useradd 但没加 -m,系统不会自动创建家目录。 那么用户登录后会落到 / 或者某个默认目录,容易出现各种奇奇怪怪的权限问题。另外,-G 指定的组如果不存在,命令会报错或者静默忽略,所以创建用户前最好先确认组存在:
bash复制# 查看所有组
cat /etc/group
# 创建组(如果不存在)
groupadd devops
创建完用户之后,还要设置密码:
bash复制passwd zhangsan
如果你在写自动化脚本,想非交互式设置密码,可以用:
bash复制echo "Password123" | passwd --stdin zhangsan
注意 --stdin 这个参数是CentOS系才有的,Ubuntu系的 passwd 不认它。Ubuntu上可以用 chpasswd:
bash复制echo "zhangsan:Password123" | chpasswd
这些都是我实际踩过坑才记住的区别,跨发行版写脚本时特别容易栽在这里。建完用户后,想给用户sudo权限,不同发行版也有区别。刚才提到的 wheel 组在CentOS系上默认拥有sudo权限,而Ubuntu系是 sudo 组。所以上面那条命令在Ubuntu上应该写成:
bash复制useradd -m -d /home/zhangsan -s /bin/bash -G sudo zhangsan
如果用户已经创建好了,也可以用 usermod 补充:
bash复制usermod -aG sudo zhangsan
注意 -a 这个参数表示追加,如果你漏掉 -a,用户会被移出原本所在的附加组,只保留 sudo 组。这也是个经典翻车点。
还有个小细节:查看用户信息时,id 命令比 cat /etc/passwd 更直观:
bash复制id zhangsan
# uid=1001(zhangsan) gid=1001(zhangsan) groups=1001(zhangsan),10(wheel)
删除用户同样有讲究。userdel zhangsan 只删除用户,家目录和邮件文件会残留;userdel -r zhangsan 连同家目录和邮件池一起删除。如果只删文件不删用户,那就用前面的 rm 加上 -rf,在 /home 和 /var/spool/mail 下清理干净。
3. 跨机传输与网络诊断:scp和telnet的真正用法
热搜词里还有几个很能说明问题的搜索词:linux scp命令、telnet命令怎么用、linux测试无线网络的软件。网络和传输这块看起来都是老生常谈,但实际操作时,很多人的用法其实是不完整的。
3.1 scp命令:参数细节决定传输成败
scp,全称 secure copy,基于SSH协议做文件传输。基础用法大家都懂:
bash复制# 本地上传到远程
scp localfile.txt user@remote:/home/user/
# 远程下载到本地
scp user@remote:/home/user/remotefile.txt ./
# 复制整个目录
scp -r ./localdir user@remote:/home/user/
但真正干活时,有几个参数是你必须知道的。
第一个是 -P(大写字母P),指定远程SSH端口。很多人把它写成小写 -p,结果报错——因为小写 -p 在scp里的作用是保留文件的时间戳和权限。这个大小写问题我见过无数次,包括我自己早期也栽过。如果你的SSH不是默认的22端口,必须用:
bash复制scp -P 2222 localfile.txt user@remote:/home/user/
第二个是 -i,指定私钥文件。如果服务器开了密钥登录,你需要用指定的私钥去认证,尤其是管理多个跳板机、多个密钥对的时候:
bash复制scp -i ~/.ssh/id_ed25519 -P 2222 localfile.txt user@remote:/home/user/
第三个是 -l(小写L),限制带宽。传输大文件时如果不想把生产环境的带宽吃满,可以限制速率,单位是 Kbit/s:
bash复制# 限制带宽为 10Mbps
scp -l 10000 bigfile.zip user@remote:/home/user/
还有一个容易被忽略的现实问题:scp不支持断点续传。如果你传输一个特别大的文件传到一半断了,大概率只能重头再来。这种情况下,我更推荐用 rsync 替代:
bash复制rsync -avzP --partial bigfile.zip user@remote:/home/user/
其中 -P 在rsync里表示显示进度同时支持断点续传,--partial 表示保留部分传输的文件,下次传输时从断点继续。如果你频繁在服务器之间搬大文件,rsync才是正解,scp只适合临时传个小文件。
3.2 telnet命令怎么用:不是用来登录的,是用来测端口的
很多人以为telnet已经过时了,确实,用它做远程登录已经很不安全,因为它不加密,用户名密码全裸奔。但telnet在运维排障中的经典场景是——测试某个远程端口是否可达。
bash复制telnet 192.168.1.100 3306
如果端口通,你会看到类似这样的输出:
code复制Trying 192.168.1.100...
Connected to 192.168.1.100.
Escape character is '^]'.
这说明TCP连接建立成功,你可以直接在这个连接里手动发一些应用层协议的命令来测试服务。比如连上MySQL的3306端口,虽然没做完整客户端认证,但可以通过响应内容判断服务是否正常。如果不通,比如看到 Connection refused,说明端口没监听或防火墙拦截了;看到 Connection timed out,通常意味着网络不通或目标IP无法路由。
telnet还有一个实用小技巧,可以用来测试HTTP服务:
bash复制telnet 192.168.1.100 80
# 连接成功后输入
GET / HTTP/1.1
Host: 192.168.1.100
# 按两下回车,会返回HTTP响应头
这个方法在快速排查Web服务是否正常时非常有用,不需要装curl也能看响应。当然,如果你在的机器上有 nc(netcat),它的用法比telnet更强大:
bash复制# 测试端口
nc -vz 192.168.1.100 3306
# 扫描端口范围
nc -vz 192.168.1.100 1-1000
不过需要注意,有些精简版系统默认没装nc,而telnet一般都在。所以telnet这条命令对运维来说依然值得常备。说到底,工具没有绝对过时,只有用对用错的问题。
3.3 排查网络问题的命令组合拳
真正到了排查网络问题的时候,单个命令往往是不够的,需要组合拳。我一般按这个顺序来:
bash复制# 1. 先看网络配置
ip addr
# 2. 看路由
ip route
# 3. 测连通性
ping -c 4 8.8.8.8
# 4. 测DNS解析
nslookup example.com
# 5. 测端口
telnet example.com 443
这套流程基本能定位80%的网络问题。热搜词里的"linux测试无线网络的软件",其实很多时候不需要额外装软件,ip 命令就能看无线网卡的状态:
bash复制# 查看无线网卡状态
ip link show wlan0
# 查看连接到的无线网络
iwconfig wlan0
# 扫描周围的无线网络
sudo iwlist wlan0 scan | grep ESSID
如果无线信号弱、网络时断时续,先看看是不是网卡进入省电模式,可以用 iwconfig wlan0 power off 关闭省电。这些都是不装额外软件就能做的事。
4. 参数处理与脚本思维:命令组合起来才是生产力
热搜词里还有一类搜索词很有意思:shell的shift命令、git命令、vim命令、containerd命令。这些单看起来互不相干,但背后都指向同一个能力——把零散命令组合成能解决实际问题的脚本。这恰恰是很多人从"会用Linux"到"真正会用Linux"的分水岭。
4.1 shift命令:处理脚本参数的隐藏利器
shift 命令在Shell脚本里的作用很简单:把位置参数左移一位。也就是说,$2 变成 $1,$3 变成 $2,原来的 $1 就没了。听起来简单,但它在解析复杂命令行参数时非常有用。
最常见的应用场景是写一个需要支持 -n、-f、-v 这类带参数选项的脚本。举个例子:
bash复制#!/bin/bash
count=1
file=""
verbose=false
while [ $# -gt 0 ]; do
case "$1" in
-n)
count="$2"
shift 2
;;
-f)
file="$2"
shift 2
;;
-v)
verbose=true
shift
;;
*)
echo "未知参数: $1"
exit 1
;;
esac
done
echo "count=$count, file=$file, verbose=$verbose"
这里 shift 2 表示一次性消费掉两个参数:选项名和它的值。shift 不带数字就是默认移动一位。为什么推荐用 shift 而不是直接用 $1、$2、$3 一个个判断?因为当参数个数不确定时,$3、$4 的位置会被后续参数改变,写法会越来越复杂。用循环 + shift 的方式,每次循环只需要关心 $1,逻辑特别清晰。
还有一种常见用法是处理变长参数列表。比如你要写一个加法脚本:
bash复制#!/bin/bash
sum=0
while [ $# -gt 0 ]; do
sum=$((sum + $1))
shift
done
echo "总和: $sum"
调用 ./sum.sh 1 2 3 4 5,输出15。这个脚本对参数个数没有任何限制,靠的就是shift逐个消费位置参数。理解这一点,你写的脚本就能灵活处理任意数量的参数。
4.2 从"敲命令"到"写脚本":让重复劳动自动化
有一个很大的认知误区是:觉得写Shell脚本很难,或者觉得"我平时在终端敲敲命令就行,没必要写脚本"。但实际工作中,同样的命令很可能会被反复执行。举个我自己的例子:我需要经常查看某台应用服务器的内存和磁盘状态,如果每次手动敲一串命令,效率太低。后来我把它写成一行别名:
bash复制alias mycheck='echo "----内存----" && free -h && echo "----磁盘----" && df -h | grep -v tmpfs'
以后只要敲 mycheck 就完事了。这就是脚本化思维的雏形——把常用操作固化成命令。
再进一步,如果你需要批量处理多台服务器,循环是大杀器。比如对一组IP执行同样的命令:
bash复制for ip in 192.168.1.10 192.168.1.11 192.168.1.12; do
echo "===== $ip ====="
ssh user@$ip "uptime && free -h"
done
配合热搜词里涉及的 linux系统安装 场景,我甚至会在新装系统的机器上一键初始化环境:
bash复制#!/bin/bash
# init_env.sh - 新机器初始化脚本
set -e
echo ">>> 更新系统软件包"
sudo apt update && sudo apt upgrade -y
echo ">>> 安装常用工具"
sudo apt install -y vim git curl wget net-tools telnet
echo ">>> 配置vim"
echo "set nu" >> ~/.vimrc
echo "set ts=4" >> ~/.vimrc
把重复劳动固化成脚本,长期来看省下的时间非常可观。
4.3 vim命令:从"会用"到"用顺手"
再聊一个话题,vim命令。热搜词里搜vim命令的人很多,但vim这东西,不是说你看几个命令就能用得顺手的,它需要结合你实际的使用场景来养成习惯。
我对vim的态度是这样的:不要一开始就想把所有技巧都学会,先掌握那些能让你“活着”的基础操作,然后在日常使用中慢慢扩展。 什么是基础操作?打开文件、编辑、保存、退出、查找、替换、复制粘贴。够用了。在此基础上,有几个命令对你提升效率特别明显:
bash复制# 设置行号
:set nu
# 跳到指定行(比如第42行)
:42
# 全文搜索并高亮
/search_term
# 取消高亮
:noh
# 全文替换 old 为 new
:%s/old/new/g
# 多文件编辑
vim file1 file2
# 在文件间切换
:bn
:bp
# 撤销
u
# 重做
Ctrl + r
最核心的建议是:给vim一个适应期,不要因为一开始不习惯就放弃。你可以在日常的git提交信息编辑、配置修改等场景里强迫自己用vim,大概两周到一个月,效率就会超过你熟悉的图形编辑器。另外,很多发行版默认的vim配色很丑、缩进不舒服,你可以自己写个基础配置:
vim复制" ~/.vimrc
set number
set ts=4
set expandtab
set autoindent
syntax on
set hlsearch
set showcmd
这几行配置就能让vim的体验上一个台阶,够用很久。
5. 查看系统状态与信息:这些命令比你想的更常用
热搜词里有一条很特别:linux查看cache版本。这其实是一个典型的"系统信息查看"类需求。这类命令分散但高频,我集中梳理一下。
5.1 查看硬件与系统信息
发现自己的机器不知道是什么Core几代、内存多大、硬盘多满,这些都需要用命令查:
bash复制# 查看CPU信息
lscpu
cat /proc/cpuinfo
# 查看内存信息
free -h
# 查看磁盘信息
df -h
lsblk
# 查看系统版本
cat /etc/os-release
uname -a
# 查看内核版本
uname -r
lscpu 会直接告诉你CPU型号、核心数、线程数,比去翻 /proc/cpuinfo 要友好得多。free -h 的 -h 表示人性化显示,会以G、M为单位输出,不用自己换算。df -h 则直接展示各挂载点的使用情况,是最常用的磁盘检查命令。如果你想知道某个软件缓存在哪个目录、占了多少空间,用 du 加上 -sh 或者 -h --max-depth=1 按目录统计,定位大文件非常高效:
bash复制du -sh /var/cache/apt
关于缓存目录,不同Linux发行版、不同应用的缓存路径差异很大。比如apt的缓存一般在 /var/cache/apt/archives,用户的缓存目录一般在 ~/.cache。查缓存大小用 du,清理缓存用指定软件的清理命令(比如apt就 apt clean,不要手贱去rm),这是比较稳妥的思路。
5.2 进程与端口:定位系统问题的基本功
另一个高频需求是"看系统到底卡在哪"。这时候需要三件套:top、ps、netstat或者ss。
bash复制# 看实时资源占用
top
# 或者用 htop(更直观)
htop
# 查找特定进程
ps aux | grep nginx
# 查看进程树
pstree
# 查看端口监听情况
netstat -tlnp
# 或者现代替代品
ss -tlnp
netstat -tlnp 这条命令几乎是运维标配。-t 显示TCP端口,-l 只看监听状态,-n 不反解域名显示数字地址,-p 显示占用端口的进程。它会告诉你:哪个端口在被监听,哪个进程在占用,占用着的是PID多少。排查"端口被占"、“服务没起来怎么看”这类问题,第一条命令就是它。
系统性能排查有一个经典的切入点:如果你发现系统响应变慢,先看内存还是看CPU?我的经验是,用 free -h 和 top 一起看,先确认是不是内存不足导致swap频繁交换,再看CPU有没有被某个进程跑满。如果是磁盘持续100%,那多半是有应用在疯狂读写,这时候 iotop 能帮上忙(如果系统装了的话)。这一套下来,大部分性能问题都能定位个大概。
6. 命令的进阶组合:排查问题的真实思路
最后这部分,我分享一个真实的排查过程,把前面提到的东西串起来。这样你就能看到,真正的运维工程师面对一个"系统异常"时,并不是背命令,而是有思路、有顺序地排查。
6.1 一个模拟场景:用户说“网站访问不了”
假设你收到反馈:公司内网的一个Web应用访问不了。你会怎么排查?我一般是按这个链路走:
第一步,先确认网络通不通。在本机执行:
bash复制ping -c 3 应用服务器IP
不通,说明网络层有问题,查路由、防火墙。通了,继续往下。
第二步,确认端口在不在监听。在应用服务器上执行:
bash复制ss -tlnp | grep 80
如果没有任何输出,说明服务可能没起来。这时候查进程:
bash复制ps aux | grep nginx
systemctl status nginx
第三步,如果服务在运行但端口没监听,大概率是配置或者启动失败。看日志:
bash复制journalctl -u nginx --since "10 minutes ago"
tail -100 /var/log/nginx/error.log
第四步,如果你手边只有一台机器,想间接测试另一台机器的某个端口是否通,就用前面说的telnet:
bash复制telnet 应用服务器IP 80
整套流程下来,问题基本能定位到具体环节。你会发现,这里没有任何一条"高深"命令,全是基础命令的组合。排查思路的关键是:从最外层的网络连通性开始,逐层向里面收缩,每层都快速排除,最终把问题锁定在某个具体点。 这个方法论比背100个命令有价值得多。
6.2 我常用的几条排查命令备忘
最后,把我觉得在排查中最常用的几条命令整理出来,每条附上我实际使用时的备注。
| 目标 | 命令写法 | 关键注意点 |
|---|---|---|
| 实时看资源 | top -c |
-c 显示完整命令行 |
| 看磁盘占用 | df -h |
注意 / 和 /home 是否独立分区 |
| 看目录大小 | du -sh * |
配合 sort -hr 排序 |
| 查端口监听 | ss -tlnp |
相比 netstat 更快更现代 |
| 查进程精确信息 | ps -ef |
配合 grep 过滤 |
| 查看系统日志 | journalctl -xe |
-e 跳到末尾,-x 补全说明 |
| 抓包分析 | tcpdump -i eth0 port 80 |
网络层问题最终手段 |
| 实时跟踪日志 | tail -f /var/log/messages |
服务不停输出时直接看 |
这里再给大家一个不算秘密的经验:不要害怕一次记不住,要习惯性地把你自己用得顺手的命令组合写成别名或小脚本。 我个人的 ~/.bashrc 里至少有20个别名,全都是干活过程中积累下来的。命令这个事,用得多比背得多重要,你的大脑不需要记住所有参数,只需要记住"有这么一个工具,能解决这类问题",细节交给 man、--help 和手册去补齐。这也是我跟很多刚从培训学校出来、满嘴参数却不会动手的同学聊过之后,最大的一个体会。Linux命令的终局不是"我会了多少条",而是"我能用什么方式解决眼前的问题"。希望这篇内容对你有启发。
