前言
Linux 是后端开发绕不开的环境。大多数服务器跑在 Linux 上,掌握基本的 Linux 操作能让日常开发和排查问题高效很多。
这篇文章整理了日常服务器操作中最常用的命令和概念,不求面面俱到,但求实用。
文件系统
目录结构
| 目录 | 用途 |
|---|---|
/ | 根目录 |
/bin | 基本命令(如 ls、cp) |
/sbin | 系统管理命令(如 fdisk、iptables1iptables 是 Linux 内核防火墙的命令行工具,通过规则链(INPUT/OUTPUT/FORWARD)过滤网络数据包。现代系统推荐使用更易用的 firewalld 或 ufw。) |
/etc | 配置文件 |
/var | 可变数据(日志、数据库、缓存) |
/tmp | 临时文件(重启后清空) |
/home | 普通用户的家目录 |
/root | root 用户的家目录 |
/opt | 第三方软件安装目录 |
/usr | 系统资源(程序、库、文档) |
/proc2/proc 是 Linux 的虚拟文件系统,不占用磁盘空间,动态生成进程和内核信息。例如 /proc/cpuinfo 显示 CPU 信息,/proc/meminfo 显示内存信息。 | 虚拟文件系统,进程和内核信息 |
/dev | 设备文件 |
文件操作
| 命令 | 说明 | 示例 |
|---|---|---|
ls | 列出目录 | ls -la |
cd | 切换目录 | cd /var/log |
pwd | 当前目录路径 | pwd |
mkdir | 创建目录 | mkdir -p a/b/c |
rmdir | 删除空目录 | rmdir dir |
touch | 创建空文件 / 更新修改时间 | touch file.txt |
cp | 复制 | cp -r src/ dest/ |
mv | 移动或重命名 | mv old new |
rm | 删除 | rm -rf dir/ |
find | 查找文件 | find / -name "*.log" |
tree | 目录树 | tree -L 2 |
查看文件内容
| 命令 | 说明 |
|---|---|
cat file | 输出整个文件 |
less file | 分页查看(按 q 退出) |
head -n 20 file | 查看前 20 行 |
tail -n 20 file | 查看后 20 行 |
tail -f file | 实时跟踪文件输出(看日志常用) |
nl file | 显示行号输出 |
wc -l file | 统计行数 |
权限管理
文件权限
-rw-r--r-- 1 root root 1234 Sep 15 10:00 file.txt^ ^^^^^^^^^ ^ ^ ^| 权限位 链接数 所有者 组 大小 修改时间 文件名文件类型文件类型标识:
-:普通文件d:目录l:符号链接s:socket
权限位表示
所有者(u) 组(g) 其他人(o) rwx r-x r-- 421 421 421
r = 4(读取)w = 2(写入)x = 1(执行)# 数字法chmod 755 file # rwxr-xr-xchmod 644 file # rw-r--r--chmod 600 file # rw-------
# 符号法chmod u+x file # 所有者加执行权限chmod g-w file # 组移除写入权限chmod o+r file # 其他人加读取权限chmod a+x file # 所有人加执行权限常用权限组合
| 权限 | 数值 | 文件 | 目录 |
|---|---|---|---|
rwx------ | 700 | 所有者可读写执行 | 所有者有全部权限 |
rwxr-xr-x | 755 | 可执行的程序 | 目录的典型权限 |
rw-r--r-- | 644 | 普通文件 | 不可访问目录内容 |
rw------- | 600 | 配置文件/密钥 | 安全敏感 |
所有者与组管理
chown user:group file # 修改所有者和组chown user file # 只修改所有者chgrp group file # 只修改组
# 递归修改目录权限chown -R user:group dir/chmod 777 是偷懒的坏习惯。程序文件用 755,配置文件用 600 或 644,目录用 755。给所有用户写权限是安全漏洞。
umask3umask 是创建文件时从默认权限中减去的权限掩码。文件默认 666,目录默认 777,减去 umask 后得到实际权限。例如 umask 022 → 文件 644(rw-r—r—)。
umask 决定新建文件的默认权限:
umask # 查看当前 umask(如 022)umask 077 # 设置 umask
# 文件默认 666 - umask,目录默认 777 - umask# umask 022 → 文件 644,目录 755# umask 077 → 文件 600,目录 700用户管理
| 命令 | 说明 |
|---|---|
whoami | 当前用户名 |
id | 查看用户 UID/GID |
useradd / adduser | 创建用户 |
passwd user | 设置/修改密码 |
usermod | 修改用户属性 |
userdel | 删除用户 |
addgroup / groupadd | 创建组 |
su - user | 切换用户 |
sudo4sudo(superuser do)允许授权用户以 root 权限执行命令。配置文件 /etc/sudoers 定义哪些用户可以执行哪些命令,通过 visudo 编辑以防语法错误。 cmd | 以 root 执行命令 |
visudo | 编辑 sudo 配置 |
进程管理
# 查看进程ps aux # 所有进程ps aux --sort=-%mem # 按内存排序ps aux --sort=-%cpu # 按 CPU 排序ps -ef # 标准格式
# 动态监控top # 进程监控htop # 更友好的 top(需要安装)uptime # 系统负载
# 终止进程kill 1234 # 发送 SIGTERM[^sigterm-sigkill](请求正常退出)kill -9 1234 # 发送 SIGKILL(强制杀死)kill -15 1234 # 同 kill 1234pkill nginx # 按名杀进程pgrep -l nginx # 按名查进程 ID
# 进程优先级nice -n 10 ./script # 以低优先级运行renice -n 5 -p 1234 # 调整已运行进程的优先级信号(Signals)
| 信号 | 编号 | 说明 |
|---|---|---|
SIGHUP | 1 | 挂起,通常用于重新加载配置 |
SIGINT | 2 | 中断(Ctrl+C) |
SIGQUIT | 3 | 退出(Ctrl+\) |
SIGKILL | 9 | 强制杀死(无法被捕获) |
SIGTERM | 15 | 终止(默认,请求正常退出) |
SIGSTOP | 19 | 暂停(无法被捕获) |
SIGCONT | 18 | 继续被暂停的进程 |
# 重新加载配置(比 kill 再启动更优雅)kill -HUP $(pgrep nginx)nginx -s reload磁盘与存储
df -h # 查看磁盘空间(人类可读格式)du -sh * # 查看当前目录下各文件/目录大小du -h --max-depth=1 # 限制深度
lsblk # 查看块设备fdisk -l # 查看分区表(需 root)mount # 查看挂载网络
网络排查常用命令
| 命令 | 说明 | 示例 |
|---|---|---|
ping | 测试连通性 | ping -c 4 google.com |
curl | HTTP 请求 | curl -v https://example.com |
wget | 下载文件 | wget https://example.com/file.zip |
ss / netstat | 查看端口和连接 | ss -tlnp |
traceroute | 路由追踪 | traceroute google.com |
dig / nslookup | DNS 查询 | dig example.com |
nmap | 端口扫描 | nmap -p 80,443 example.com |
tcpdump | 抓包 | tcpdump -i eth0 port 80 |
ip addr | 查看 IP 地址 | ip addr show |
ip route | 查看路由表 | ip route show |
端口占用排查
# 查看某个端口被谁占用ss -tlnp | grep :80netstat -tlnp | grep :80lsof -i :3000
# 查看所有监听的端口ss -tlnpnetstat -tlnp# 如果端口被占用,找到 PID 后:kill -15 <PID> # 优雅停止kill -9 <PID> # 强制停止包管理
| 发行版 | 包管理器 | 安装 | 搜索 | 更新 | 卸载 |
|---|---|---|---|---|---|
| Debian/Ubuntu | apt | apt install | apt search | apt update | apt remove |
| RHEL/CentOS 7 | yum | yum install | yum search | yum update | yum remove |
| RHEL/CentOS 8+/Fedora | dnf | dnf install | dnf search | dnf update | dnf remove |
| Alpine | apk | apk add | apk search | apk update | apk del |
| macOS | brew | brew install | brew search | brew update | brew uninstall |
# Debian/Ubuntuapt update # 更新包索引apt upgrade # 升级所有包apt install nginx # 安装apt remove nginx # 卸载(保留配置)apt purge nginx # 彻底卸载(含配置)日志查看
Linux 日志大部分在 /var/log/ 下:
/var/log/syslog # 系统日志(Ubuntu)/var/log/messages # 系统日志(CentOS)/var/log/auth.log # 认证日志/var/log/nginx/access.log # Nginx 访问日志/var/log/nginx/error.log # Nginx 错误日志# 看日志的技巧tail -f /var/log/nginx/access.log # 实时跟踪less +F /var/log/nginx/access.log # less 中按 F 实时跟踪journalctl -xe # systemd[^systemd] 日志journalctl -u nginx # 某个服务的日志Shell 实用技巧
快捷键
| 快捷键 | 作用 |
|---|---|
Ctrl + C | 中断当前命令 |
Ctrl + D | 退出 Shell |
Ctrl + L | 清屏(同 clear) |
Ctrl + A | 行首 |
Ctrl + E | 行尾 |
Ctrl + U | 从光标删到行首 |
Ctrl + K | 从光标删到行尾 |
Ctrl + W | 删除前一个单词 |
Ctrl + R | 搜索命令历史 |
!! | 重复上一条命令 |
!$ | 上一条命令的最后一个参数 |
管道与重定向
# 管道:将前一个命令的输出传给下一个命令cat access.log | grep "404" | wc -l
# 重定向echo "hello" > file.txt # 覆盖写入echo "world" >> file.txt # 追加写入ls non_exist 2> error.log # 重定向 stderrls > out.log 2>&1 # 合并 stdout + stderr
# /dev/null:丢弃数据find / -name "*.log" 2>/dev/null
# && 和 ||mkdir dir && cd dir # 前一个成功才执行后一个rm file || echo "failed" # 前一个失败才执行后一个文本处理三剑客
grep - 搜索
grep "error" app.log # 匹配行grep -i "error" app.log # 忽略大小写grep -r "TODO" src/ # 递归搜索grep -v "debug" app.log # 反向匹配(不含 debug 的行)grep -c "error" app.log # 计数grep -n "error" app.log # 显示行号grep -l "error" *.log # 只输出匹配的文件名sed - 流编辑
sed 's/old/new/g' file.txt # 替换所有 old 为 newsed -i 's/old/new/g' file.txt # 原地替换sed '/pattern/d' file.txt # 删除匹配的行sed -n '10,20p' file.txt # 打印第 10-20 行awk - 列处理
awk '{print $1}' file.txt # 打印第一列awk '{print $1, $3}' file.txt # 打印第一和第三列awk -F: '{print $1}' /etc/passwd # 以 : 分隔awk '/error/ {print $0}' app.log # 匹配 error 的行awk '{sum+=$1} END {print sum}' nums # 对第一列求和一行命令技巧
# 查找最大的 10 个文件du -ah / | sort -rh | head -10
# 统计访问最多的 IPawk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10
# 杀死所有匹配的进程ps aux | grep "node app" | grep -v grep | awk '{print $2}' | xargs kill
# 批量重命名文件for f in *.txt; do mv "$f" "${f%.txt}.md"; done系统信息
uname -a # 内核版本信息cat /etc/os-release # 发行版信息hostname # 主机名lscpu # CPU 信息free -h # 内存使用df -h # 磁盘使用top / htop # 进程监控dmesg # 内核日志lsusb # USB 设备lspci # PCI 设备定时任务(cron5cron 是 Unix/Linux 的定时任务调度器。crontab 文件使用 5 个时间字段(分 时 日 月 周)定义任务执行时间。cron 执行环境变量有限,建议使用绝对路径。)
# 编辑当前用户的定时任务crontab -e
# 格式:分 时 日 月 周 命令0 3 * * * /usr/bin/backup.sh # 每天凌晨 3 点*/5 * * * * /usr/bin/check.sh # 每 5 分钟0 0 * * 0 /usr/bin/weekly.sh # 每周日零点@daily /usr/bin/daily.sh # 每天@reboot /usr/bin/start.sh # 重启时
# 查看定时任务crontab -lcron 脚本中尽量使用绝对路径,因为 cron 运行时的环境变量很少(没有 $PATH 等)。
学习路线图
- 熟悉 Linux 目录结构
- 掌握文件和目录基本操作
- 理解文件权限管理
- 学会进程查看和管理
- 会用 grep / sed / awk 处理文本
- 掌握网络排查常用命令
- 能编写简单的 Shell 脚本
- 了解系统性能分析和调优
总结
| 知识点 | 核心命令 |
|---|---|
| 文件操作 | ls、cp、mv、rm、find |
| 权限 | chmod、chown、umask |
| 进程 | ps、top、kill、pgrep |
| 网络 | curl、ping、ss、dig |
| 文本处理 | grep、sed、awk |
| 系统 | df、du、free、uname |
| 包管理 | apt / yum / apk |
| 日志 | tail -f、journalctl |
Linux 的命令确实多,记不住所有参数是正常的,记住最常用的那些,其他用到时 man 一下或者谷歌一下就好。
参考来源
iptables 是 Linux 内核防火墙的命令行工具,通过规则链(INPUT/OUTPUT/FORWARD)过滤网络数据包。现代系统推荐使用更易用的 firewalld 或 ufw。
↩/proc 是 Linux 的虚拟文件系统,不占用磁盘空间,动态生成进程和内核信息。例如 /proc/cpuinfo 显示 CPU 信息,/proc/meminfo 显示内存信息。
↩umask 是创建文件时从默认权限中减去的权限掩码。文件默认 666,目录默认 777,减去 umask 后得到实际权限。例如 umask 022 → 文件 644(rw-r—r—)。
↩sudo(superuser do)允许授权用户以 root 权限执行命令。配置文件 /etc/sudoers 定义哪些用户可以执行哪些命令,通过 visudo 编辑以防语法错误。
↩cron 是 Unix/Linux 的定时任务调度器。crontab 文件使用 5 个时间字段(分 时 日 月 周)定义任务执行时间。cron 执行环境变量有限,建议使用绝对路径。
↩
评论
GitHub 登录后可评论。
评论区会在滚动到这里时自动加载。