技术备忘 LinuxShell服务器

前言

Linux 是后端开发绕不开的环境。大多数服务器跑在 Linux 上,掌握基本的 Linux 操作能让日常开发和排查问题高效很多。

这篇文章整理了日常服务器操作中最常用的命令和概念,不求面面俱到,但求实用。

文件系统

目录结构

目录用途
/根目录
/bin基本命令(如 lscp
/sbin系统管理命令(如 fdiskiptables1iptables 是 Linux 内核防火墙的命令行工具,通过规则链(INPUT/OUTPUT/FORWARD)过滤网络数据包。现代系统推荐使用更易用的 firewalld 或 ufw。
/etc配置文件
/var可变数据(日志、数据库、缓存)
/tmp临时文件(重启后清空)
/home普通用户的家目录
/rootroot 用户的家目录
/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(执行)
bash
# 数字法
chmod 755 file # rwxr-xr-x
chmod 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-x755可执行的程序目录的典型权限
rw-r--r--644普通文件不可访问目录内容
rw-------600配置文件/密钥安全敏感

所有者与组管理

bash
chown user:group file # 修改所有者和组
chown user file # 只修改所有者
chgrp group file # 只修改组
# 递归修改目录权限
chown -R user:group dir/
NOTE

chmod 777偷懒的坏习惯。程序文件用 755,配置文件用 600 或 644,目录用 755。给所有用户写权限是安全漏洞。

umask3umask 是创建文件时从默认权限中减去的权限掩码。文件默认 666,目录默认 777,减去 umask 后得到实际权限。例如 umask 022 → 文件 644(rw-r—r—)。

umask 决定新建文件的默认权限:

bash
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 配置

进程管理

bash
# 查看进程
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 1234
pkill nginx # 按名杀进程
pgrep -l nginx # 按名查进程 ID
# 进程优先级
nice -n 10 ./script # 以低优先级运行
renice -n 5 -p 1234 # 调整已运行进程的优先级

信号(Signals)

信号编号说明
SIGHUP1挂起,通常用于重新加载配置
SIGINT2中断(Ctrl+C)
SIGQUIT3退出(Ctrl+\)
SIGKILL9强制杀死(无法被捕获
SIGTERM15终止(默认,请求正常退出)
SIGSTOP19暂停(无法被捕获
SIGCONT18继续被暂停的进程
bash
# 重新加载配置(比 kill 再启动更优雅)
kill -HUP $(pgrep nginx)
nginx -s reload

磁盘与存储

bash
df -h # 查看磁盘空间(人类可读格式)
du -sh * # 查看当前目录下各文件/目录大小
du -h --max-depth=1 # 限制深度
lsblk # 查看块设备
fdisk -l # 查看分区表(需 root)
mount # 查看挂载

网络

网络排查常用命令

命令说明示例
ping测试连通性ping -c 4 google.com
curlHTTP 请求curl -v https://example.com
wget下载文件wget https://example.com/file.zip
ss / netstat查看端口和连接ss -tlnp
traceroute路由追踪traceroute google.com
dig / nslookupDNS 查询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

端口占用排查

bash
# 查看某个端口被谁占用
ss -tlnp | grep :80
netstat -tlnp | grep :80
lsof -i :3000
# 查看所有监听的端口
ss -tlnp
netstat -tlnp
bash
# 如果端口被占用,找到 PID 后:
kill -15 <PID> # 优雅停止
kill -9 <PID> # 强制停止

包管理

发行版包管理器安装搜索更新卸载
Debian/Ubuntuaptapt installapt searchapt updateapt remove
RHEL/CentOS 7yumyum installyum searchyum updateyum remove
RHEL/CentOS 8+/Fedoradnfdnf installdnf searchdnf updatednf remove
Alpineapkapk addapk searchapk updateapk del
macOSbrewbrew installbrew searchbrew updatebrew uninstall
bash
# Debian/Ubuntu
apt update # 更新包索引
apt upgrade # 升级所有包
apt install nginx # 安装
apt remove nginx # 卸载(保留配置)
apt purge nginx # 彻底卸载(含配置)

日志查看

Linux 日志大部分在 /var/log/ 下:

bash
/var/log/syslog # 系统日志(Ubuntu)
/var/log/messages # 系统日志(CentOS)
/var/log/auth.log # 认证日志
/var/log/nginx/access.log # Nginx 访问日志
/var/log/nginx/error.log # Nginx 错误日志
bash
# 看日志的技巧
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搜索命令历史
!!重复上一条命令
!$上一条命令的最后一个参数

管道与重定向

bash
# 管道:将前一个命令的输出传给下一个命令
cat access.log | grep "404" | wc -l
# 重定向
echo "hello" > file.txt # 覆盖写入
echo "world" >> file.txt # 追加写入
ls non_exist 2> error.log # 重定向 stderr
ls > out.log 2>&1 # 合并 stdout + stderr
# /dev/null:丢弃数据
find / -name "*.log" 2>/dev/null
# && 和 ||
mkdir dir && cd dir # 前一个成功才执行后一个
rm file || echo "failed" # 前一个失败才执行后一个

文本处理三剑客

grep - 搜索

bash
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 - 流编辑

bash
sed 's/old/new/g' file.txt # 替换所有 old 为 new
sed -i 's/old/new/g' file.txt # 原地替换
sed '/pattern/d' file.txt # 删除匹配的行
sed -n '10,20p' file.txt # 打印第 10-20 行

awk - 列处理

bash
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 # 对第一列求和

一行命令技巧

bash
# 查找最大的 10 个文件
du -ah / | sort -rh | head -10
# 统计访问最多的 IP
awk '{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

系统信息

bash
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 执行环境变量有限,建议使用绝对路径。

bash
# 编辑当前用户的定时任务
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 -l
NOTE

cron 脚本中尽量使用绝对路径,因为 cron 运行时的环境变量很少(没有 $PATH 等)。

学习路线图

  • 熟悉 Linux 目录结构
  • 掌握文件和目录基本操作
  • 理解文件权限管理
  • 学会进程查看和管理
  • 会用 grep / sed / awk 处理文本
  • 掌握网络排查常用命令
  • 能编写简单的 Shell 脚本
  • 了解系统性能分析和调优

总结

知识点核心命令
文件操作lscpmvrmfind
权限chmodchownumask
进程pstopkillpgrep
网络curlpingssdig
文本处理grepsedawk
系统dfdufreeuname
包管理apt / yum / apk
日志tail -fjournalctl

Linux 的命令确实多,记不住所有参数是正常的,记住最常用的那些,其他用到时 man 一下或者谷歌一下就好。


参考来源

脚注
  1. iptables 是 Linux 内核防火墙的命令行工具,通过规则链(INPUT/OUTPUT/FORWARD)过滤网络数据包。现代系统推荐使用更易用的 firewalld 或 ufw。

  2. /proc 是 Linux 的虚拟文件系统,不占用磁盘空间,动态生成进程和内核信息。例如 /proc/cpuinfo 显示 CPU 信息,/proc/meminfo 显示内存信息。

  3. umask 是创建文件时从默认权限中减去的权限掩码。文件默认 666,目录默认 777,减去 umask 后得到实际权限。例如 umask 022 → 文件 644(rw-r—r—)。

  4. sudo(superuser do)允许授权用户以 root 权限执行命令。配置文件 /etc/sudoers 定义哪些用户可以执行哪些命令,通过 visudo 编辑以防语法错误。

  5. cron 是 Unix/Linux 的定时任务调度器。crontab 文件使用 5 个时间字段(分 时 日 月 周)定义任务执行时间。cron 执行环境变量有限,建议使用绝对路径。