说实话,每次看到有人一上来就找“Linux命令大全”“某某命令速查手册”,我都觉得挺可惜的。Linux基础操作指令这件事,真正的价值不在于你背了多少条命令,而在于你理解了这些指令背后文件、进程、权限这三个核心概念是怎么组织在一起的。把这三个东西打通了,你敲进去的每一条命令都是活的,不是死记硬背的字符串。
这篇文章不打算做成那种“从A到Z列一堆命令”的百科全书,而是会围绕真实使用场景,把最常用、最容易被搞混、运维面试又最喜欢问的基础操作指令拆开揉碎讲清楚。看完这篇文章,你能做到:拿到一台全新的Linux服务器或者装了Linux的虚拟机,敢上手操作,知道去哪里看系统状态,知道怎么装软件、怎么管文件、怎么处理权限问题。不管是学生、转行运维的新人,还是写代码时被Linux环境折磨的开发者,这篇文章都适合你。
1. 先搞清楚你手里是什么:终端、Shell与命令的本质
1.1 终端不是命令,Shell才是真正干活的
很多新手第一个混淆点就是终端和Shell的关系。你打开的那个黑乎乎的窗口叫终端模拟器(Terminal),它本身什么都不会做,只是把键盘输入传给Shell,再把Shell的输出显示出来。真正解析命令、调用程序、管理输入输出的是登录Shell,最常见的就是Bash。
可以用个生活化的类比:终端是前台接待,Shell是后厨大师傅。你跟前台说你饿了,前台把菜单递给后厨,后厨真正给你做出菜来。Linux里你敲的命令,99%的情况都是Shell在执行,而Shell本身也是个普通的程序,甚至可以换成zsh、fish这些别的Shell。
1.2 命令怎么被找到的:PATH变量的作用
你敲ls,Shell怎么知道要去哪里找这个程序?答案就是PATH环境变量。你可以自己在终端里执行下面的命令看看效果:
echo $PATH输出会是一堆用冒号隔开的路径,比如/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin。Shell会按顺序在这些目录里找你要执行的命令,找到了就执行。
这里有个经典的坑,我见过不止一次:有人编译安装了某个软件,然后执行命令时报“command not found”,但明明能确认软件装上了。原因就是安装目录没有加入PATH。解决办法是把这个软件的bin目录追加到PATH里:
export PATH=$PATH:/opt/your-software/bin注意这里用的是$PATH,意思是在原有PATH基础上追加,不是覆盖。如果误写成export PATH=/opt/your-software/bin,那么除了这个目录,其他所有系统命令都找不到了,连ls都会报错。真遇到这个情况不用慌,用绝对路径执行命令就能临时顶一下,比如/bin/ls。
1.3 绝对路径与相对路径的取舍
Linux的路径系统是整个文件操作的地基。绝对路径是从根目录/开始的完整路径,比如/home/user/test.txt。相对路径是相对于你当前所在目录的路径,比如你在/home/user里,要去/home/user/docs,直接cd docs就行。
实际写脚本或者做自动化配置的时候,我的建议是能用绝对路径就用绝对路径,因为脚本的执行环境不可控,当前目录一变,相对路径就全废了。但日常手敲命令,相对路径效率更高。
还有几个很关键的缩写得记住:
.代表当前目录,..代表上一级目录~代表当前用户的家目录,~user代表指定用户user的家目录-单独用代表上一次所在目录,cd -可以在两个目录之间快速来回切换,这个在反复看配置文件和日志的时候非常好用
2. 文件与目录操作:每天都在用的那十条命令
2.1 看、进、建、改、删的完整闭环
文件操作是Linux使用频率最高的部分,我把它们串成一个完整场景来演示,比单独背命令更好记。假设你要在一台新服务器上建一个项目目录,并且想在两个地方来回切换着看文件:
pwd # 先看看自己现在在哪 ls -l # 看当前目录下有哪些文件,带详细信息 cd /var/log # 切换到日志目录 cd - # 再切回刚才的目录 mkdir -p /data/services/webapp # 创建多层目录,-p自动补全父子目录这里面有个细节值得展开。ls -l输出的第一列是文件类型和权限,比如drwxr-xr-x这样一串。第一个字符如果是d说明是目录,-说明是普通文件,其余九个字符分成三组,分别是属主、属组、其他用户各自的读(r)、写(w)、执行(x)权限。这个不展开细讲,后面专门有一节说权限。
mkdir -p这个参数我建议养成习惯,它能递归创建所有不存在的父目录。比如上面的/data/services/webapp,如果/data/services不存在,不带-p直接报错,带上-p一条命令全搞定。
2.2 复制、移动与删除:小心那几条“没有后悔药”的命令
复制用cp,移动或重命名用mv,删除用rm。这三条命令本身不难,难在每个都有需要格外留神的参数。
cp -r /data/backup /data/backup_2025 # 复制目录必须加-r递归 cp -a /data/webapp /data/webapp_bak # -a参数保留权限、时间戳等属性 mv /data/old.txt /data/new.txt # 移动并重命名 rm -rf /tmp/temp_project # 强制递归删除,慎用!重点讲讲rm -rf。-r是递归删除目录下所有内容,-f是强制删除不提示。这两个参数组合在一起的力量很大,但危险程度也很高。生产环境里流传着各种因为rm -rf而误删数据的“事故传说”,大多数都是因为路径变量写错导致的。
我个人的习惯是:
- 能不用
rm就不用,优先操作到回收站式目录,比如把文件移到/tmp下观察一段时间再删 - 确实要删除重要数据,先
ls确认路径,再删除,绝对不打“盲删” - 删除前做一次目录备份,比如
cp -a,哪怕多占点空间,也比数据丢了强 - 严禁在变量为空时执行
rm -rf $VAR/这种写法,因为如果$VAR没赋值,命令就变成了rm -rf /,整个系统都没了
2.3 文本内容快速查看:cat、head、tail、grep的组合拳
服务器上的配置文件、日志文件全是文本,查看内容的命令必须熟练。简单文件可以直接:
cat /etc/hostname # 看全部内容 head -n 20 /var/log/messages # 看前20行 tail -f /var/log/syslog # 实时跟踪日志文件的输出,按Ctrl+C退出tail -f我不知道帮多少人省过时间,线上排障看日志的时候基本离不了它。它会把文件新追加的内容持续打印在终端上,程序运行时的报错、请求日志都能实时看到。
要在大文件里找特定内容,就得grep出场了:
grep -i "error" /var/log/app.log # 忽略大小写搜索error grep -rn "配置项名称" /etc/nginx/ # 递归搜索目录下所有文件,-r递归,-n显示行号 grep -v "^#" /etc/ssh/sshd_config # 过滤掉以#号开头的注释行,看有效配置grep -v这个反向过滤在日常操作里很实用,比如你要看nginx的有效配置,配置里全是注释,你可以把所有注释行去掉再看,配置文件结构就清爽多了。
3. 用户与权限:Linux安全模型的底线
3.1 看懂权限位:rwx到底是怎么算的
很多新手照着教程执行chmod 755 file能成功,但不知道755是怎么来的。实际上每个权限位都可以用一个数字表示:读(r)=4,写(w)=2,执行(x)=1。然后把三组权限各自相加,就得到三个数字。比如755的含义是:
- 属主拥有读+写+执行权限:4+2+1=7
- 属组拥有读+执行权限:4+1=5
- 其他用户拥有读+执行权限:4+1=5
所以chmod 755 script.sh就是把脚本设置为:属主可以读、写、执行,组内和其他人只能读和执行。这个权限模型在很多场景下都够用。
还有一种更直观的写法是用字母形式:
chmod u+x script.sh # 给属主(u)加上(+)执行(x)权限 chmod g-w,o-rwx report.txt # 去掉属组(g)的写权限,去掉其他人(o)的所有权限 chmod -R 750 /data/app # 递归修改目录下所有文件的权限为7503.2 用户和用户组的增删改查
用户管理也是一项基础高频操作。创建用户时我会强制加上指定家目录和Shell,避免出现用户没有家目录、报错找不到主目录的情况:
useradd -m -s /bin/bash zhangsan # 创建用户并创建家目录、指定Shell passwd zhangsan # 设置或修改密码 usermod -aG docker zhangsan # 把用户追加到docker组,-aG是追加,不是替换属组 userdel -r zhangsan # 删除用户同时删除家目录和邮件目录重点注意-aG的用法。如果你写usermod -G docker zhangsan,而用户之前已经属于多个其他组,那么他会从原有组里被剔除,只剩docker组。-a这个参数就是“追加”的意思,防止误伤原有所属组。这个坑在给用户加sudo权限、加docker用户组的时候特别容易踩。
顺便说一下查看用户的命令:
id zhangsan # 查看用户UID、GID以及所属组信息 groups zhangsan # 查看用户加入的所有组3.3 sudo到底是怎么回事
很多人对sudo的理解就是“提权用的”,但这个理解太笼统了。sudo的作用是允许授权用户以其他身份(默认是root)执行命令,注意是“执行命令的瞬间身份切换”,不是“登录到root”。
我在线上环境排查问题的时候,习惯凡是涉及状态查看的操作,尽量用普通用户身份做,只有确需改动系统配置、装软件、改权限时,才用sudo。这样可以降低误操作的风险。有些操作必须用sudo,比如:
- 编辑
/etc/目录下的系统配置文件 - 管理系统服务:
sudo systemctl restart nginx - 查看只有root才有权限看的日志:
sudo tail -f /var/log/secure - 安装或卸载系统级软件包
查看用户是否有sudo权限,只需要:
sudo -l这行命令会列出当前用户被允许以root身份执行的所有命令。如果输出的不是空白,说明有这个权限。
4. 进程与服务:系统运行状态怎么掌握
4.1 用ps查看进程,用kill来结束进程
很多时候你觉得“系统卡了”“程序不响应了”,首先得搞明白是哪个进程在占资源。查看进程最常用的命令就是ps和top。
ps -ef # 查看系统所有进程完整信息 ps -ef | grep java # 配合grep精确查找java进程 ps aux --sort=-%cpu | head # 按CPU占用排序,看谁最吃资源ps -ef输出的每一列信息包括:UID(哪个用户起的进程)、PID(进程号,找它就靠这个数字)、PPID(父进程号)、CPU占用、启动时间、实际的命令。排查问题时,我一般先按CPU排序看看有没有异常进程,再按内存排序看看谁占内存高。
结束进程的命令是kill:
kill 22345 # 先发TERM信号,请求进程正常退出 kill -9 22345 # 强制杀死进程,慎用 pkill -f "进程名关键字" # 按名字模糊匹配杀掉所有相关进程这里又有个关键知识点:kill默认发送的是TERM信号,这是给进程一个“自己退出”的机会,让它有机会清理临时文件、关闭连接,最后优雅退出。而kill -9发送的是SIGKILL强制信号,直接把进程从内核层面杀掉,进程没有机会做任何清理。所以杀进程的正确顺序是:先用默认的kill PID,等几秒看进程是否还在,实在不行再用-9。
还有个运维场景很常见:Java程序或者Python服务怎么杀都不退出。这种情况通常是有子进程没有退出,排查时用pstree -p PID看看进程树,把子进程先解决掉,父进程自然就退出了。
4.2 systemctl:现代Linux服务的启停管
现在主流的Linux发行版(Ubuntu 16.04之后、CentOS 7之后、Debian 8之后)都使用systemd作为系统初始化程序,管理服务就得用systemctl命令:
systemctl status nginx # 查看服务运行状态 systemctl start nginx # 启动服务 systemctl stop nginx # 停止服务 systemctl restart nginx # 重启服务 systemctl enable nginx # 设置开机自启 systemctl disable nginx # 取消开机自启 systemctl daemon-reload # 重新加载服务配置文件,改完单位文件后必须执行注意区分两件事:systemctl stop是把运行中的服务停掉,systemctl disable是禁止开机自动启动。这两条命令功能不同,也不是联动关系。如果要彻底停用某个服务,需要两条都执行。
我之前被人问过一个问题:为什么用systemctl查看服务状态时,明明配置文件改过了,重启也不生效?答案很可能是daemon-reload没有执行。编辑了/etc/systemd/system/目录下任何.service文件,都必须先执行systemctl daemon-reload让systemd重新读取配置,然后再restart服务。
4.3 查看系统整体状态:top、free、df
系统性能类似身体的健康指标,不需要总看,但出了问题就得知道怎么体检。三条命令就够了:
top:动态显示进程列表,按P按CPU排序,按M按内存排序,按q退出free -h:查看内存占用情况,-h让单位自动变成G或者Mdf -h:查看磁盘分区使用情况,-h同样是为了友好显示
我把它们串成一个检查套路,每次觉得系统不对劲就这么依次来一遍:
top # 看有没有进程占满CPU free -h # 看内存还剩多少,swap有没有被大量占用 df -h # 看哪个分区满了,日志是不是把磁盘撑爆了这个顺序很合理:CPU占用高说明有异常进程在跑,内存不足可能引发OOM重启进程,磁盘满则可能导致服务写入失败甚至写不进去任何数据。排查任何服务异常,先做这三步体检,能过滤掉至少一半的常见问题。
再看磁盘时注意一个细节:df -h看的是文件系统空间,但有时候明明删了文件,空间却不释放。这是因为有进程仍然在占用被删除文件的句柄。排查方法:
lsof | grep deleted找出来的进程要么重启,要么主动释放,磁盘空间才会真正回来。这个问题在清理日志文件时特别常见,属于运维必踩的坑。
5. 软件包管理与网络排查:装得上、连得上才算完
5.1 apt与yum的差异与常用操作
Linux系统装软件的方式,因发行版不同而不同。Debian/Ubuntu系列用apt,RedHat/CentOS/Rocky系列用yum或者dnf。命令结构高度类似,我只以apt为例:
sudo apt update # 更新软件源索引,装东西前先执行 sudo apt install -y nginx # 安装nginx,-y自动确认 sudo apt remove nginx # 卸载软件但保留配置文件 sudo apt purge nginx # 卸载软件并清除配置文件 sudo apt autoremove # 自动清理不再需要的依赖包apt update经常被忽略,但这一步非常关键。它会重新读取软件源的包索引,只有索引刷新到最新版本,之后apt install才能装到最新版软件。新服务器到手,第一步就是执行apt update,然后再用apt upgrade把所有已有包升级到源里的新版本。
5.2 修改进程名称:一个比较冷的技巧
很多运维面试题会问到“如何修改进程名称”,这东西听着偏门,但确实能解决一些实际问题。主要有几种做法:
- 脚本语言(如Python)里用
setproctitle库,直接修改显示在ps里的进程名 - C/C++程序里调用
prctl系统调用 - 启动进程时用
exec -a custom_name命令(Bash的exec -a参数)
比如我想让一个脚本在进程列表里显示成“web-server-main”,而不是默认的python3 main.py:
exec -a web-server-main python3 /opt/app/main.py跑起来之后用ps -ef看,进程名那块会变成web-server-main。这招在有些服务需要多实例部署,且需要快速区分不同实例场景下很有用。如果能看懂进程名的含义,排查问题时压力会小很多。
5.3 网络连通性排查:ping、ip、ss
最后说一说网络排查的四个基本动作。我判断网络问题遵循从本地到远端、逐层排查的思路:
ip addr # 查看本机IP地址与网卡状态,相当于Windows的ipconfig ping -c 4 8.8.8.8 # 测试与目标主机的连通性,-c限定次数为4,不会无限ping下去 ip route # 查看路由表和默认网关 ss -tlnp # 查看本机监听的TCP端口,-t TCP,-l监听,-n不解析域名,-p显示进程ss是新一代的socket查看命令,逐步替代老旧的netstat。如果程序连不上服务端,先在本机用ss -tlnp确认服务端口到底有没有在听,再用ping确认网络通不通,最后用curl或者telnet做端口级别的连通测试。排查路径清晰了,很多网络问题其实并不复杂。
比如测试某台服务器能不能访问另一台的8080端口:
curl -v http://192.168.1.100:8080/health如果通了会有响应头输出,如果不通则会有连接超时或者拒绝连接的错误提示,根据提示再往上排查。
6. 实战场景串讲:从零到一操作一台服务器
6.1 新服务器初始检查清单
把前面的零散命令串起来,模拟一下你刚拿到一台Linux云服务器或者刚装好一台虚拟机,该怎么一步步完成初始检查和配置。我自己每次拿到新机器都是这个流程,顺序很重要,因为每一步都是下一步的基础:
# 1. 确认系统版本和架构 cat /etc/os-release # 2. 查看CPU和内存 nproc && free -h # 3. 确认磁盘空间和分区 df -h # 4. 查看当前登录用户和IP whoami && ip addr # 5. 更新软件源 sudo apt update && sudo apt upgrade -y # 6. 创建自己的日常用户并加入sudo组 sudo useradd -m -s /bin/bash devops sudo passwd devops sudo usermod -aG sudo devops第6步特别值得一提。很多新手拿到服务器就直接root操作,这对云服务器来说是一个安全隐患,一个是误操作风险,一个是如果root账号被暴力破解尝试登录,被攻破后整台机器沦陷。正规做法是创建一个日常使用的普通用户,用这个用户登录,需要root权限时再sudo提权。
6.2 从解压安装包到运行服务的完整链路
再串一个“从拿到安装包到服务启动”的完整场景。假设你已经下载了一个软件压缩包app.tar.gz:
# 1. 查看压缩包内容,但不急着解压 tar -tzf app.tar.gz # 2. 解压到指定目录 tar -xzf app.tar.gz -C /data/ # 3. 进入解压后的目录查看结构 cd /data/app && ls -l # 4. 如果里面有可执行文件,先赋执行权限再运行 chmod +x bin/start.sh ./bin/start.sh # 5. 检查进程是否正常启动 ps -ef | grep app这里tar的参数要记牢:-x是提取解压,-z是处理gzip压缩格式,-f后面跟文件名,-t是列表查看,-C指定解压目标目录。压缩用的参数则是-czf,其中-c是创建压缩包。-v可以加显示详细过程,但很多场景下不加更干净。
后端服务起来之后,有些还需要注册成系统服务,让它开机自启。在/etc/systemd/system/下新建一个myapp.service文件,内容大概是:
[Unit] Description=My Custom App After=network.target [Service] ExecStart=/data/app/bin/start.sh Restart=always User=devops [Install] WantedBy=multi-user.target写完之后执行:
sudo systemctl daemon-reload sudo systemctl enable myapp sudo systemctl start myapp用systemd管理的服务有几个好处:进程崩溃能自动重启(Restart=always)、开机自动启动、日志纳入systemd统一管理(可以用journalctl -u myapp查看日志)。比你直接后台运行一个脚本丢在那里强得多。
6.3 日志查看套路:从启动失败到定位原因
服务没起来,第一反应不是去网上搜“为什么启动失败”,而是先看日志。定位问题的基本思路就是这么几步,我理一下顺序:
# 1. 确认服务状态和错误信息 sudo systemctl status myapp # 2. 查看服务的日志输出 sudo journalctl -u myapp -n 50 --no-pager # 3. 如果应用有独立日志文件,直接tail跟踪 sudo tail -f /data/app/logs/error.log很多启动失败的原因都是能在这个阶段被发现的,常见的有:
- 配置文件格式错误,程序启动时解析失败
- 端口被占用,报错
Address already in use - 依赖的后端服务尚未就绪
- 权限不足,没有读配置或者写日志的权限
看到了具体报错,解决方向就明确了。日志是Linux问题排查最好的老师,学会从日志里提取信息,比死记硬背一百个命令都管用。
7. 常用命令速查表与新手避坑指南
7.1 高频命令一页纸
把正文里提到的高频命令整理成一个速查表,方便日常对照使用。没必要背,多敲自然就记住了,实在忘了就回来查一下:
| 操作场景 | 命令 | 作用说明 |
|---|---|---|
| 查看当前位置 | pwd | 输出当前工作目录的绝对路径 |
| 查看文件列表 | ls -l | 显示文件详细信息,含权限、属主、大小 |
| 切换目录 | cd /path | 切换工作目录,cd -回到上一次目录 |
| 创建目录 | mkdir -p a/b/c | 递归创建多层目录 |
| 复制文件或目录 | cp -r src dst | 复制目录需加-r |
| 移动或重命名 | mv old new | 文件在同一个分区内操作很快 |
| 删除并备份习惯 | rm -rf /path | 慎用,删除前先确认路径 |
| 查看文件内容 | cat、head、tail -f | 分别对应全文、前N行、实时跟踪 |
| 文本搜索 | grep -rn 关键词 路径 | 递归搜索目录内文本内容 |
| 查看进程 | ps -ef | grep 关键词 | 查看进程及PID |
| 结束进程 | kill PID或kill -9 PID | 先用默认信号,无效再强制 |
| 系统资源查看 | top、free -h、df -h | CPU、内存、磁盘三板斧 |
| 查看端口 | ss -tlnp | 查看监听端口及对应进程 |
| 创建用户 | useradd -m -s /bin/bash 用户名 | 创建用户并指定家目录和Shell |
| 修改权限 | chmod 755 文件 | 把权限改为属主全权限、组和其他人读执行 |
| 安装软件 | sudo apt install -y 软件名 | Debian系安装软件并自动确认 |
| 服务管理 | systemctl start/stop/restart/status 服务名 | services的日常维护 |
7.2 新手最常见的五个坑
1. 盲目用root操作一切
Linux的权限模型再复杂,也是有道理的。日常操作尽量用普通用户身份登录,需要权限时再临时sudo,误操作的概率会低很多。root身份一旦操作失误,比如删错了系统目录,后果是不可逆的。
2. 路径写错导致命令作用到了错误的文件上
相对路径在脚本里是最大隐患。刚入门时写脚本尽量全部用绝对路径,目录变量最好在脚本开头统一声明,路径拼接用/明确连接。涉及删除操作时先使用echo把最终路径打印出来验证一下再执行。
3. 忘了chmod +x直接运行脚本报Permission denied
写好的脚本先执行chmod +x script.sh,再运行./script.sh,否则会报Permission denied。不要和“没有执行权限”搞混,这不是系统拒绝,只是权限位不够。
4. 配置文件改了但服务没有重新加载
改完系统服务的配置文件,必须执行systemctl daemon-reload再重启服务,改完应用程序自己的配置文件,必须重启对应服务或应用,否则配置不会热加载。这两个操作经常有人漏,排查时优先检查。
5. 磁盘满了但df显示还有空间,其实是inode耗尽
面试偶尔会问这个问题。文件系统除了磁盘空间,还有一个叫inode的概念,每个文件或目录都要消耗一个inode。当inode耗尽了,即使磁盘还有空间,也没办法创建新文件。排查用:
df -i如果显示的IUsed%接近100%,说明inode满了,解决办法通常是清理小文件数量太多的目录,比如日志目录、邮件队列目录。
7.3 学习路径建议:不是背命令,而是练场景
最后分享一点个人体会。我学Linux的过程,一开始也是到处找命令大全来背,背了忘,忘了再背,效果很差。直到后来开始做真实练习:装虚拟机、搭服务、写自动化脚本,才发现真正的学习方式是“问题驱动”。当你遇到一个具体的需求,然后为了满足这个需求去找命令、理解命令,那个印象会深得多。
建议你给自己设计几个“练手项目”:
- 在一台虚拟机里部署Nginx,并能通过浏览器访问一个HTML页面
- 把某个应用每天输出的日志定时打包压缩并清理7天前的文件
- 写一个一键巡检脚本,依次输出CPU、内存、磁盘、服务状态
- 创建一个用户,让它只能通过公钥登录,并具备sudo权限
每一项都不难,但做一遍下来,你基本就能把这些基础操作指令真正融会贯通了。遇到不会的命令,用man 命令名查官方手册,或者用命令名 --help看简要帮助,初期慢一点没关系,熟悉了以后自然就快了。