☰
Linux基础操作指令实战:打通文件、进程与权限,掌握服务器运维核心
2026/10/11 11:32:31 网站建设 项目流程

说实话,每次看到有人一上来就找“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 # 递归修改目录下所有文件的权限为750

3.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或者M
  • df -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 -hCPU、内存、磁盘三板斧
查看端口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看简要帮助,初期慢一点没关系,熟悉了以后自然就快了。

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

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

立即咨询