前言
刚接触 Linux 的时候,很多人会被它纯命令行的操作方式劝退 ------ 没有桌面的文件双击,一切操作都要靠命令完成。但真正用熟之后会发现,这种高效的操作方式比图形界面快得多。作为大模型开发、后端运维的基础环境,Linux 是绕不开的基本功,这篇是我整理的入门阶段最常用的核心操作笔记,都是日常高频用到的内容。
一、先搞懂 Linux 的目录结构
和 Windows 把盘符分成 C 盘 D 盘不同,Linux 整个文件系统是一棵从根目录/长出来的树,所有文件、硬件设备都以文件的形式挂在这棵树上,Linux 有一个很重要的理念:一切皆文件。普通文件、目录、设备、进程信息,都可以通过文件或文件系统接口来访问。
不用一开始就把所有目录背下来,先记住几个高频用到的:
/bin、/sbin:存放系统自带的可执行命令,sbin是只有管理员能执行的系统管理命令/home:普通用户的家目录,每个用户进去之后默认在自己的/home/用户名目录下/root:超级管理员 root 的家目录,和普通用户的目录是分开的/etc:系统所有的配置文件都存在这里,改环境变量、用户配置、服务配置基本都在这个目录下找/usr:用户安装的软件默认装在这里,类似 Windows 的Program Files/var:经常变动的文件,比如各种日志文件,排查问题的时候经常来这里/tmp:临时文件目录,系统会自动清理这里的内容,重要文件别放这/dev:所有硬件设备都在这里以文件形式存在,比如硬盘、网卡
工作中最常打交道的通常是:
-
/etc:改配置 -
/var/log:看日志 -
/home:放用户数据 -
/opt:装自己的软件 -
/tmp:临时测试
二、环境准备:远程连接与软件安装
实际工作中服务器一般都是放在机房或者云上,我们不会直接碰物理机,都是通过 SSH 远程连接操作。常用的工具有 FinalShell、Xshell 这些,输入服务器 IP、账号密码就能连上。
Ubuntu 系统默认用 APT 作为包管理器,装软件不用自己去官网下安装包,几条命令就搞定:
bash
# 更新软件源列表
sudo apt update
# 安装软件,-y表示不需要确认直接装
sudo apt install 软件名 -y
# 卸载软件
sudo apt remove 软件名 -y
刚装好的 Ubuntu 如果没有ifconfig命令,就是因为没装net-tools工具包,跑一句sudo apt install net-tools -y就好。
bash
sudo apt update # 更新软件包索引
sudo apt install net-tools # 安装 net-tools 软件包
sudo apt remove net-tools # 卸载 net-tools 软件包
sudo apt search nginx # 搜索 nginx 相关软件包
sudo apt show nginx # 查看 nginx 软件包详情
另外记住几个终端高频快捷键,能省很多事:
| 快捷键 | 作用 |
|---|---|
Ctrl + L |
清屏,和输入clear效果一样 |
Ctrl + C |
停止当前进程 |
Tab |
自动补全命令、文件名,打错了按两下会弹出所有候选,防止输错 |
| 上下方向键 | 查找历史命令 |
Ctrl + U |
清除当前输入 |
三、高频文件目录操作命令
日常操作中 80% 的时间都在和文件目录打交道,这些命令必须形成肌肉记忆:
0. 帮助命令
bash
man ls # 查看 ls 命令的手册页
ls --help # 查看 ls 命令的简要帮助
help cd # 查看 Shell 内建命令 cd 的帮助
man 手册页分章节,常见的有:
-
第 1 章:用户命令
-
第 2 章:系统调用
-
第 3 章:库函数
-
第 5 章:文件格式
-
第 8 章:系统管理命令
例如:
bash
man 1 write # 查看第 1 章中的 write 用户命令
man 2 write # 查看第 2 章中的 write 系统调用
help 用于 Shell 内建命令:
bash
help cd # 查看内建命令 cd 的帮助信息
1. 基础路径查看
pwd:显示你当前在哪个目录,打印绝对路径
bash
pwd # 显示当前工作目录的绝对路径
cd 路径:切换目录,cd ~或者直接cd是直接回到自己的家目录,cd ..回到上一级,cd -回到上一次待过的目录
bash
cd /etc # 切换到 /etc 目录
cd ~ # 切换到当前用户的家目录
cd - # 切换回上一次所在的目录
cd .. # 切换到上一级目录
cd /var/log # 切换到 /var/log 目录
2. 查看目录内容
ls是 list 的缩写,最常用的两个参数:
ls -a:显示所有文件,包括以.开头的隐藏文件ls -l:长格式显示,能看到文件的权限、所有者、大小、修改时间,Ubuntu 里ll是ls -al的别名,直接敲ll更方便
bash
ls # 列出当前目录下的文件和目录
ls -l # 以长格式列出详细信息
ls -a # 列出所有文件,包括隐藏文件
ls -lh # 以人类可读格式显示文件大小
ls -R # 递归列出子目录内容
3. 文件与目录的增删复制
mkdir 目录名:创建目录,加-p参数可以一次性创建多级不存在的目录,比如mkdir -p a/b/ctouch 文件名:创建一个空文件
bash
mkdir /data/app # 创建 /data/app 目录
mkdir -p /data/app/logs/2026 # 递归创建多层目录
touch /data/app/readme.md # 创建空文件 readme.md
cp 源文件 目标位置:复制文件,复制整个目录要加-r递归rm 文件:删除文件,删除目录加-r,加-f是强制删除不弹确认
提醒:
rm -rf是高危命令,删之前一定要确认路径,别手滑删到系统目录
mv 源文件 目标位置:移动文件,同目录下用 mv 就是重命名
bash
cp app.conf app.conf.bak # 复制文件 app.conf 为 app.conf.bak
cp -r /data/app /backup/app # 递归复制目录 /data/app 到 /backup/app
mv old.txt new.txt # 将 old.txt 重命名为 new.txt
mv /data/app /opt/app # 将 /data/app 移动到 /opt/app
rm file.txt # 删除文件 file.txt
rm -r /tmp/test # 递归删除目录 /tmp/test
rm -f file.txt # 强制删除文件,不提示
4. 查看文件内容
cat 文件名:把整个文件内容一次性输出到终端,适合看小文件tail 文件名:默认看文件最后 10 行,加-n 行数指定看多少行,加-F是实时跟踪文件新增内容,看线上日志的时候特别好用
bash
cat /etc/hosts # 显示 /etc/hosts 文件内容
cat -n /etc/passwd # 显示 /etc/passwd 并加上行号
less /var/log/syslog # 分页查看日志文件
tail -n 20 /var/log/app.log # 查看文件末尾 20 行
tail -f /var/log/app.log # 实时追踪文件新增内容
- 输出重定向:
命令 > 文件是把输出覆盖写到文件里,命令 >> 文件是追加到文件末尾,不会覆盖原来的内容
bash
echo "hello linux" # 在终端输出 hello linux
echo "hello" > a.txt # 将 hello 覆盖写入 a.txt
echo "world" >> a.txt # 将 world 追加到 a.txt 末尾
5. 软链接
软链接相当于 Windows 的快捷方式,用ln -s 原文件路径 链接名创建,ll 查看的时候会看到链接指向原文件,删除软链接的时候直接rm 链接名就行,别在软链接后面加/,不然会误删原目录里的内容。
bash
ln -s /opt/app/current /opt/app/releases/v1 # 创建软链接 v1 指向 current
6. 历史命令
bash
history # 查看当前用户执行过的历史命令
四、VIM 编辑器:终端里的必备编辑器
在服务器上改配置文件,没有图形化编辑器,VIM 是绕不开的工具。它有三种工作模式,搞懂模式切换就入门了:
- 一般模式(默认打开就是这个模式) :进来之后不能直接输入文字,只能做复制、删除、移动光标的操作
yy复制当前行,p粘贴,dd删除当前行u撤销上一步操作gg跳到文件开头,G跳到文件末尾
- 编辑模式 :在一般模式下按
i/a/o这些键就会进入编辑模式,左下角会出现INSERT提示,这时候才能正常输入文字,按Esc退回一般模式 - 命令模式 :在一般模式下按
:进入,光标会跑到窗口最下面,常用操作::w保存,:q退出,:wq保存退出:q!强制退出不保存修改:set nu显示行号,:set nonu关闭行号
打开文件:
bash
vim /etc/hosts # 使用 vim 编辑 /etc/hosts 文件
常用操作:
| 操作 | 说明 |
|---|---|
i |
光标前插入 |
a |
光标后插入 |
o |
下一行插入 |
Esc |
回到一般模式 |
:w |
保存 |
:q |
退出 |
:wq |
保存并退出 |
:q! |
强制退出不保存 |
dd |
删除当前行 |
yy |
复制当前行 |
p |
粘贴 |
u |
撤销 |
:set nu |
显示行号 |
:%s/old/new/g |
全局替换 |
刚用 VIM 的时候最容易卡在这里:按了半天发现没法输入文字,就是因为忘了从一般模式按i进入编辑模式。
五、压缩解压与路径处理
tar 是最常用的打包压缩工具:
bash
tar -zcvf app.tar.gz /data/app # 将 /data/app 打包并 gzip 压缩为 app.tar.gz
tar -zxvf app.tar.gz # 解压 app.tar.gz 到当前目录
tar -zxvf app.tar.gz -C /opt # 解压 app.tar.gz 到 /opt 目录
参数含义:
-
-z:gzip 压缩 -
-c:创建包 -
-x:解包 -
-v:显示过程 -
-f:指定文件名 -
-C:解压到指定目录
路径处理:
bash
basename /data/app/conf/app.conf # 提取路径中的文件名,输出 app.conf
dirname /data/app/conf/app.conf # 提取路径中的目录部分,输出 /data/app/conf
basename 取文件名,dirname 取目录名,写脚本时很常用。
六、用户与用户组
Linux 是多用户系统。每个用户有自己的账号、家目录和权限。
1. root 用户
root 是系统的超级管理员,拥有最高权限,能改任何文件、装任何软件。但 Ubuntu 默认是锁定 root 账号的,日常操作都用普通用户,需要高权限的时候临时加sudo就行,避免误操作把系统搞崩。
bash
sudo apt update # 以 root 权限执行 apt update
如果确实要切到 root 身份,用su - root,这个命令会把 root 的环境变量也一起带过来,比su root更彻底;用完了输exit就切回普通用户。
bash
su - root # 切换到 root 并加载其环境变量
su root # 切换到 root 但不加载环境变量
exit # 退出当前用户,返回上一个用户
su - 会加载目标用户的环境变量,su 只切换身份。
2. 用户管理常用命令
所有用户信息都存在/etc/passwd文件里,常用操作:
useradd 用户名:创建新用户,加-m参数会自动在 /home 下创建这个用户的家目录passwd 用户名:给这个用户设置登录密码
bash
sudo useradd -m devops # 创建用户 devops,并创建家目录
sudo passwd devops # 为 devops 设置密码
id 用户名:查看这个用户的 UID、所属组信息
bash
id devops # 查看 devops 的用户 ID、组 ID 等信息
cat /etc/passwd # 查看系统中所有用户信息
userdel 用户名:删除用户,加-r参数会把用户的家目录一起删掉
bash
sudo userdel devops # 删除用户 devops,保留家目录
sudo userdel -r devops # 删除用户 devops,同时删除家目录
- 如果想让某个普通用户也能用 sudo 执行高权限命令,把他加到
/etc/sudoers配置文件里就行。 - 修改用户名:
bash
sudo usermod -l newname oldname # 将用户名 oldname 改为 newname
3. 用户组管理
每个用户创建的时候,系统会自动给他建一个和用户名同名的组。组的作用就是给一批统一权限的用户批量分配权限,不用一个个单独设置。
groupadd 组名:新建组groupdel 组名:删除组usermod -g 组名 用户名:把用户加到指定组里 所有组的信息都存在/etc/group文件里。
bash
sudo groupadd devteam # 创建用户组 devteam
sudo groupdel devteam # 删除用户组 devteam
sudo groupmod -n newteam devteam # 将组名 devteam 改为 newteam
sudo usermod -g devteam devops # 将用户 devops 的主组改为 devteam
查看组:
bash
cat /etc/group # 查看系统中所有组信息
4. sudo 权限
编辑 /etc/sudoers 可以给普通用户提权:
bash
sudo visudo # 安全地编辑 /etc/sudoers 文件
添加:
bash
devops ALL=(ALL) NOPASSWD:ALL
这样 devops 使用 sudo 时不需要重复输入密码。生产环境要谨慎配置。
七. 文件权限
1. 文件权限:搞懂 rwx 就不会再懵
用ll查看文件的时候,最前面的 10 个字符就是文件的类型和权限,比如-rwxr-xr--:
bash
-rwxr-xr-- 1 devops devteam 1024 Oct 10 10:00 app.sh
- 第一个字符:文件类型,
-是普通文件,d是目录,l是软链接 - 后面 9 个字符分成三组,每组三个:分别是文件所有者的权限 、文件所属组的权限 、其他所有人的权限
- 三个权限位分别是
r读、w写、x执行,对应的数字是r=4, w=2, x=1,加起来就能用数字代表权限,比如rwxr-xr--就是754
含义:
-
第 1 位:文件类型,
-普通文件,d目录,l软链接 -
第 2-4 位:属主权限
-
第 5-7 位:属组权限
-
第 8-10 位:其他用户权限
rwx 对应:
-
r:读,4 -
w:写,2 -
x:执行,1
这里有个很容易踩的坑:
- 对于文件来说,
w权限是能改文件内容,但不代表能删除这个文件 ------ 删除文件需要对文件所在的目录有w权限 - 对于目录来说,
r权限是能列出目录里的内容,w权限是能在这个目录里新建、删除文件,x权限是能进入这个目录
修改权限的三个命令:
chmod 权限文件:修改文件的权限,比如chmod 755 test.sh,或者chmod u+x test.sh给所有者加执行权限,加-R参数递归修改整个目录里所有文件的权限chown 所有者:所属组 文件:修改文件的所有者和所属组,比如chown -R app:app /opt/myapp把整个目录的归属给 app 用户chgrp 组名 文件:单独修改文件的所属组
bash
chmod u+x app.sh # 给属主增加执行权限
chmod g-w app.sh # 去掉属组的写权限
chmod o+r app.sh # 给其他用户增加读权限
chmod 750 app.sh # 设置权限为 rwxr-x---
chmod -R 755 /data/app # 递归设置 /data/app 权限为 rwxr-xr-x
修改所有者:
bash
sudo chown devops app.sh # 将 app.sh 的所有者改为 devops
sudo chown -R devops:devteam /data/app # 递归修改所有者和所属组
修改所属组:
bash
sudo chgrp devteam app.sh # 将 app.sh 的所属组改为 devteam
注意:目录的 x 权限表示可以进入目录,w 表示可以在目录内创建、删除、重命名文件。
八. 搜索与查找
1. 查找命令:find
find 搜索范围 -name "文件名":按文件名递归查找,支持通配符,比如find / -name "*.log"找系统里所有日志文件
按文件名查找:
bash
find /data -name "*.log" # 在 /data 下查找所有 .log 文件
按用户查找:
bash
find /home -user devops # 查找属于 devops 的文件
按时间查找:
bash
find /data -mtime -7 # 查找 7 天内修改过的文件
2.grep 与管道
配合管道符|把前一个命令的输出传给后一个命令过滤,grep 关键词是文本过滤的核心工具。
比如ps aux | grep nginx就是从所有进程里找 nginx 相关的进程,加-n参数显示匹配的行号
bash
cat /var/log/app.log | grep "ERROR" # 在日志中过滤包含 ERROR 的行
grep -n "ERROR" /var/log/app.log # 显示包含 ERROR 的行及行号
grep -i "timeout" /var/log/app.log # 忽略大小写搜索 timeout
管道 | 把前一个命令的输出交给后一个命令处理:
bash
ps -ef | grep nginx # 查看 nginx 相关进程
九. 系统监控与进程管理
服务跑起来之后经常要排查问题,这几个命令天天用:
1. 磁盘与内存
df -h:查看磁盘各个分区的使用情况,以人类可读的 G/M 单位显示du -h 目录:查看某个目录占了多大磁盘空间
bash
du -sh /var/log # 查看 /var/log 总占用大小
du -ah /data | sort -rh | head -n 20 # 列出 /data 下最大的 20 个文件/目录
du = disk usage ,作用:查看磁盘占用大小(不是查看文件内容,是看文件 / 目录占了多少硬盘空间)
拆参数(du 的选项)
-
-s:summary 汇总,只显示总计大小,不递归列出里面每一个子文件 / 子目录 -
-h:human-readable 人类可读,自动用 K/M/G 单位展示,而不是原始字节 -
-a:all 全部 ,不仅统计目录,所有文件都单独列出来(默认 du 只统计目录) -
free -m:查看内存使用情况,单位是 MB
2. 进程管理
ps -aux:查看系统所有进程的 CPU、内存占用情况ps -ef:查看进程的父进程 ID,用来梳理进程树kill 进程号:终止进程,加-9是强制杀掉进程killall 进程名:直接按进程名杀所有同名进程top:实时监控系统状态,按 CPU 占用排序默认,按 M 是按内存占用排序,按 q 退出,相当于 Linux 下的任务管理器
bash
ps -aux # 查看系统中所有进程的详细状态
ps -ef # 查看进程及父进程关系
ps -ef | grep java # 过滤出 java 相关进程
展示字段说明:
-
USER:用户 -
PID:进程号 -
%CPU:CPU 占用 -
%MEM:内存占用 -
STAT:状态 -
COMMAND:命令
结束进程:
bash
kill 12345 # 正常结束 PID 为 12345 的进程
kill -9 12345 # 强制杀死 PID 为 12345 的进程
killall nginx # 按名称杀死所有 nginx 进程
查看系统负载和实时进程:
bash
top # 实时显示系统进程和资源占用
top -d 1 # 每 1 秒刷新一次
top -p 12345 # 只监控 PID 12345
进入 top 界面之后,在 top 交互界面里常用按键:
-
P:按 CPU 排序 -
M:按内存排序 -
N:按 PID 排序 -
q:退出
3. 网络相关
ifconfig:查看本机 IP 地址
bash
ip addr # 查看所有网络接口的 IP 地址
ifconfig # 查看网络接口信息(需安装 net-tools)
ping 地址:测试网络通不通
bash
ping www.baidu.com # 测试与百度的网络连通性
ping -c 4 192.168.1.1 # 只发送 4 个 ping 包
netstat -nlp | grep 端口号:查看某个端口被哪个进程占用了,部署服务的时候端口冲突经常要查这个
bash
sudo netstat -nlp | grep 8080 # 查看 8080 端口占用情况
# -n:numeric 数字形式,不解析域名、主机名(加快速度,直接显示 IP,不反向解析)
# -l:listening 只看监听状态的端口(服务正在打开等待连接的端口)
# -p:program 显示进程 PID + 程序名(需要 root 权限,所以加 sudo)
sudo ss -lntp | grep 8080 # 用 ss 命令查看 8080 端口监听
#ss 是 netstat 的替代品(性能更好,推荐优先用 ss)
#-l:listening,只展示监听端口
#-n:numeric,数字 IP / 端口,不域名解析
#-t:tcp,只筛选 TCP 协议(UDP 用 `-u`)
#-p:program,显示进程 PID 和程序名(同样需要 sudo)
#只输出 TCP 监听,过滤掉 UDP,输出更干净
十. 定时任务:crontab 自动化执行
想让系统定时自动跑脚本,比如每天凌晨备份日志、清理临时文件,就用 crontab:
bash
crontab -e #编辑当前用户的定时任务
crontab -l #查看当前用户的所有定时任务 定时任务的格式是五个时间位加要执行的命令:
crontab -r #删除当前用户的所有定时任务
定时任务的格式是五个时间位加要执行的命令:
XML
* * * * * command
│ │ │ │ │
│ │ │ │ └── 星期几 0-7
│ │ │ └──── 月 1-12
│ │ └────── 日 1-31
│ └──────── 小时 0-23
└────────── 分钟 0-59
bash
0 2 * * * /data/scripts/backup.sh # 每天凌晨 2 点执行备份脚本
*/10 * * * * /data/scripts/health_check.sh # 每 10 分钟执行一次健康检查
30 8 * * 1-5 /data/scripts/report.sh # 周一到周五 8:30 执行报表脚本
注意:crontab 的环境变量和交互式 Shell 可能不同,脚本里建议使用绝对路径,并在脚本中显式设置 PATH。
十一、小结
这一篇覆盖了 Linux 入门、目录结构、远程连接、APT、帮助命令、文件目录操作、Vim、压缩解压、用户权限、搜索查找、磁盘网络进程和定时任务。下一篇学习 Shell 脚本编程和文本处理。