Skip to content

Linux 常用命令

大白话解释: Linux 命令就像"和服务器对话的语言"。你通过 SSH 连接到服务器后,用命令来操作服务器:查看文件、安装软件、查看日志、重启服务等。

为什么要学 Linux 命令?

  • 服务器运维:部署项目、查看日志、排查问题
  • 没有图形界面:服务器通常只有命令行,没有鼠标和窗口
  • 自动化脚本:把多个命令写成脚本,自动执行重复任务

最常用的命令:

  • ls — 查看文件列表
  • cd — 切换目录
  • cat — 查看文件内容
  • tail -f — 实时查看日志
  • grep — 搜索文件内容
  • chmod — 修改文件权限
  • ps — 查看进程
  • kill — 停止进程

服务器操作和文件管理的基础命令。

文件操作

目录导航

bash
# 查看当前目录
pwd

# 切换目录
cd /path/to/dir
cd ~          # 回到家目录
cd ..         # 上一级
cd -          # 上一次所在的目录

文件列表

bash
# 查看文件列表
ls
ls -la        # 详细信息(含隐藏文件)
ls -lh        # 文件大小可读格式
ls -lt        # 按修改时间排序

文件操作

bash
# 创建目录
mkdir dirname
mkdir -p a/b/c    # 递归创建

# 创建文件
touch filename

# 复制
cp file1 file2
cp -r dir1 dir2   # 复制目录

# 移动/重命名
mv file1 file2
mv dir1 dir2

# 删除
rm file
rm -r dir         # 删除目录
rm -rf dir        # 强制删除(慎用)

文件查看

bash
# 查看文件内容
cat filename
less filename     # 分页查看(q 退出)
head -n 20 file   # 前 20 行
tail -n 20 file   # 后 20 行
tail -f file      # 实时追踪(查看日志)

链接 ln

bash
# 软链接(符号链接,类似快捷方式)
ln -s /path/to/target link_name
ln -s /etc/nginx/nginx.conf ~/nginx.conf

# 硬链接(指向同一 inode,删除原文件仍可访问)
ln /path/to/file hard_link_name

# 查看链接
ls -la link_name        # 显示指向的目标
readlink link_name      # 只输出目标路径
类型说明跨文件系统可链接目录原文件删除后
软链接指向目标路径失效
硬链接指向同一 inode仍可访问

文件搜索

bash
# 按文件名查找
find /path -name "*.log"
find /path -name "filename"

# 按类型查找
find /path -type f    # 文件
find /path -type d    # 目录

# 按大小查找
find /path -size +100M    # 大于 100M
find /path -size -1M      # 小于 1M

# 按修改时间查找
find /path -mtime -7      # 7 天内修改

# 内容搜索
grep "keyword" filename
grep -r "keyword" /path   # 递归搜索
grep -i "keyword" file    # 忽略大小写
grep -n "keyword" file    # 显示行号
grep -v "keyword" file    # 反向匹配(排除)
grep -c "keyword" file    # 统计匹配行数
grep -l "keyword" *       # 只列出包含匹配的文件名
grep -E "regex" file      # 使用扩展正则表达式

sed 文本处理

bash
# 替换文本
sed 's/old/new/' file              # 替换每行第一个匹配
sed 's/old/new/g' file             # 替换所有匹配
sed -i 's/old/new/g' file          # 直接修改文件
sed -i.bak 's/old/new/g' file     # 修改前备份

# 删除行
sed '3d' file                      # 删除第 3 行
sed '2,5d' file                    # 删除第 2-5 行
sed '/pattern/d' file              # 删除匹配行
sed '/^$/d' file                   # 删除空行

# 插入/追加
sed '2a\new line' file             # 在第 2 行后追加
sed '1i\new line' file             # 在第 1 行前插入

# 打印指定行
sed -n '5p' file                   # 打印第 5 行
sed -n '2,5p' file                 # 打印第 2-5 行

awk 文本处理

bash
# 按列提取(默认以空格/Tab 分隔)
awk '{print $1}' file              # 打印第 1 列
awk '{print $1, $3}' file          # 打印第 1 和第 3 列
awk -F: '{print $1}' /etc/passwd   # 指定分隔符

# 条件过滤
awk '$3 > 100' file                # 第 3 列大于 100 的行
awk '/pattern/' file               # 匹配行

# 内置变量
awk '{print NR, $0}' file          # NR=行号,$0=整行
awk '{print NF}' file              # NF=每行的列数
awk -F: '{print NR": "$1}' /etc/passwd

# 统计
awk '{sum+=$1} END {print sum}' file       # 求和
awk '{sum+=$1} END {print sum/NR}' file    # 求平均

# 格式化输出
awk '{printf "%-20s %s\n", $1, $2}' file

权限管理

bash
# 查看权限
ls -la

# 修改权限
chmod 755 file        # rwxr-xr-x
chmod 644 file        # rw-r--r--
chmod +x script.sh    # 添加执行权限

# 修改所有者
chown user:group file
chown -R user:group dir

用户管理

用户操作

命令说明
useradd username创建用户
useradd -m -s /bin/bash username创建用户并指定 home 目录和 shell
useradd -G groupname username创建用户并加入附加组
usermod -aG groupname username将用户追加到附加组
usermod -s /bin/bash username修改用户默认 shell
usermod -l newname oldname修改用户名
userdel username删除用户(保留 home 目录)
userdel -r username删除用户并删除 home 目录

密码管理

bash
passwd username          # 修改指定用户密码
passwd -l username       # 锁定用户账户
passwd -u username       # 解锁用户账户
passwd -e username       # 强制下次登录时修改密码

切换用户

bash
su - username            # 切换到指定用户(加载环境变量)
su username              # 切换用户(不加载环境变量)
sudo command             # 以 root 权限执行命令
sudo -u username cmd     # 以指定用户执行命令
sudo -i                  # 切换到 root 并加载环境变量
sudo -s                  # 切换到 root shell

用户信息文件

文件说明
/etc/passwd用户信息,格式 用户名:密码:UID:GID:注释:home目录:shell
/etc/shadow加密密码和账户策略
/etc/group组信息
bash
# 查看 UID 和 GID
id username

# 查看当前登录用户
who
w

# 查看最近登录记录
last
lastlog

用户组管理

命令说明
groupadd groupname创建用户组
groupadd -g 1001 groupname指定 GID 创建组
groupmod -n newname oldname修改组名
groupdel groupname删除用户组
gpasswd -a user group添加用户到组
gpasswd -d user group从组中移除用户
groups username查看用户所属组
getent group groupname查看组成员

sudoers 配置

bash
# 编辑 sudoers 文件(推荐使用 visudo,有语法检查)
visudo
visudo -f /etc/sudoers.d/custom

常见配置示例:

# 允许用户执行所有命令
username ALL=(ALL:ALL) ALL

# 允许用户无密码执行所有命令
username ALL=(ALL:ALL) NOPASSWD: ALL

# 允许组内用户执行所有命令
%groupname ALL=(ALL:ALL) ALL

# 限制只能执行特定命令
username ALL=(ALL) /usr/bin/systemctl restart nginx, /usr/bin/systemctl restart mysql

# 命令别名
Cmnd_Alias WEB_CMDS = /usr/bin/systemctl restart nginx, /usr/bin/systemctl reload nginx
username ALL=(ALL) WEB_CMDS

进程管理

bash
# 查看进程
ps aux
ps -ef | grep node

# 实时监控
top
htop          # 更好用的版本

# 杀死进程
kill PID
kill -9 PID   # 强制杀死
killall node  # 按名称杀死

服务管理 systemctl

基本操作

命令说明
systemctl start service启动服务
systemctl stop service停止服务
systemctl restart service重启服务
systemctl reload service重新加载配置(不中断服务)
systemctl status service查看服务状态
systemctl enable service设置开机自启
systemctl disable service取消开机自启
systemctl is-active service检查服务是否运行
systemctl is-enabled service检查是否开机自启
systemctl mask service彻底禁用服务(无法手动启动)
systemctl unmask service取消禁用

查看服务列表

bash
systemctl list-units                        # 列出所有已加载的单元
systemctl list-units --type=service         # 只列出服务
systemctl list-units --state=running        # 只列出运行中的
systemctl list-unit-files --type=service    # 列出所有服务文件
systemctl list-dependencies service         # 查看服务依赖关系
systemctl list-timers                       # 查看定时器列表

自定义 systemd service 文件

文件路径:/etc/systemd/system/myservice.service

ini
[Unit]
Description=My Application Service
Documentation=https://example.com/docs
After=network.target
Requires=postgresql.service
Wants=redis.service

[Service]
Type=simple
User=appuser
Group=appgroup
WorkingDirectory=/opt/myapp
ExecStartPre=/opt/myapp/pre-start.sh
ExecStart=/opt/myapp/start.sh
ExecStartPost=/opt/myapp/post-start.sh
ExecStop=/opt/myapp/stop.sh
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=5
StartLimitBurst=3
StartLimitIntervalSec=60
Environment=NODE_ENV=production
EnvironmentFile=/opt/myapp/.env
StandardOutput=journal
StandardError=journal
SyslogIdentifier=myapp
KillMode=mixed
KillSignal=SIGTERM
TimeoutStopSec=30

[Install]
WantedBy=multi-user.target

Type 值说明

Type说明
simple默认值,ExecStart 进程即主进程
forking进程会 fork,适合传统 daemon
oneshot执行一次就退出,配合 RemainAfterExit=yes
notify进程就绪后会通知 systemd
idle等待其他任务完成后才启动

Restart 值说明

Restart说明
no不自动重启(默认)
on-success正常退出时重启
on-failure异常退出时重启
on-abnormal被信号杀死或超时时重启
on-abort收到未捕获信号时重启
always总是重启
bash
# 重新加载 systemd 配置
systemctl daemon-reload

# 启动并设置开机自启
systemctl enable --now myservice

journalctl 日志查看

bash
journalctl -u service                  # 查看指定服务日志
journalctl -u service -f               # 实时追踪
journalctl -u service --since today    # 查看今天的日志
journalctl -u service --since "2024-01-01" --until "2024-01-02"
journalctl -u service -n 100           # 最近 100 行
journalctl -u service -p err           # 只看错误级别
journalctl -u service --no-pager       # 不分页输出
journalctl -b                          # 查看本次启动的日志
journalctl --disk-usage                # 查看日志占用空间
journalctl --vacuum-size=500M          # 清理日志到指定大小
journalctl --vacuum-time=7d            # 保留最近 7 天日志

日志级别(从高到低):

级别关键字说明
0emerg系统不可用
1alert需要立即处理
2crit严重条件
3err错误
4warning警告
5notice正常但重要
6info信息
7debug调试

网络相关

端口与连接

bash
# 查看端口占用
netstat -tlnp
ss -tlnp
lsof -i :8080

# 查看 IP
ip addr
ifconfig

curl 详细用法

bash
# GET 请求
curl https://api.example.com/users
curl -s https://api.example.com/users          # 静默模式(不显示进度)
curl -s https://api.example.com/users | jq .   # 格式化 JSON

# POST 请求
curl -X POST https://api.example.com/users \
  -H "Content-Type: application/json" \
  -d '{"name":"test","email":"[email protected]"}'

# PUT 请求
curl -X PUT https://api.example.com/users/1 \
  -H "Content-Type: application/json" \
  -d '{"name":"updated"}'

# DELETE 请求
curl -X DELETE https://api.example.com/users/1

# 带 Header
curl -H "Authorization: Bearer token123" https://api.example.com/me
curl -H "Accept: application/json" https://api.example.com/data

# 上传文件
curl -X POST -F "file=@/path/to/file.pdf" https://api.example.com/upload
curl -X POST -F "[email protected]" -F "name=test" https://api.example.com/upload

# 下载文件
curl -O https://example.com/file.tar.gz              # 保留原文件名
curl -o custom_name.tar.gz https://example.com/file   # 指定文件名
curl -C - -O https://example.com/large_file           # 断点续传

# 显示详细信息
curl -v https://api.example.com               # 详细输出
curl -I https://api.example.com               # 只获取响应头
curl -w "HTTP Code: %{http_code}\nTime: %{time_total}s\n" -o /dev/null -s https://api.example.com

# 设置超时
curl --connect-timeout 5 --max-time 30 https://api.example.com

# 代理
curl -x http://proxy:8080 https://api.example.com

curl 常用参数

参数说明
-X指定 HTTP 方法
-H添加请求头
-d发送请求体数据
-F发送表单数据(文件上传用 @
-o / -O输出到文件
-s静默模式
-v详细输出
-k忽略 SSL 证书验证
-L跟随重定向
-u user:passBasic 认证
--max-time最大超时时间(秒)
-w自定义输出格式

wget 详细用法

bash
# 下载文件
wget https://example.com/file.tar.gz
wget -O custom_name.tar.gz https://example.com/file

# 断点续传
wget -c https://example.com/large_file

# 后台下载
wget -b https://example.com/large_file

# 限速下载
wget --limit-rate=1m https://example.com/large_file

# 下载整个网站(镜像)
wget -m -p -E -k https://example.com

# 递归下载
wget -r -np -l 2 https://example.com/dir/

# 从文件读取 URL 列表下载
wget -i urls.txt

# 静默模式
wget -q https://example.com/file

# 设置重试
wget --tries=3 --timeout=30 https://example.com/file

nc (netcat) 端口测试

bash
# 测试端口是否开放
nc -zv host 80
nc -zv host 22

# 扫描端口范围
nc -zv host 20-100

# 监听端口(调试用)
nc -l 8080

# 传输文件
# 接收端
nc -l 9999 > received_file
# 发送端
nc host 9999 < file_to_send

# 超时设置
nc -zv -w 3 host 80

traceroute 和 mtr 路由追踪

bash
# traceroute 追踪路由
traceroute example.com
traceroute -n example.com    # 不解析主机名(更快)
traceroute -T -p 80 example.com  # 使用 TCP 追踪

# mtr 实时路由诊断(推荐)
mtr example.com
mtr --report example.com     # 生成报告模式
mtr -n example.com           # 不解析主机名
mtr -c 100 example.com       # 发送 100 个包后退出

DNS 查询

bash
# nslookup
nslookup example.com
nslookup example.com 8.8.8.8     # 指定 DNS 服务器
nslookup -type=MX example.com    # 查询邮件记录

# dig(推荐,信息更详细)
dig example.com
dig example.com A                 # 查询 A 记录
dig example.com AAAA              # 查询 IPv6 记录
dig example.com MX                # 查询邮件记录
dig example.com NS                # 查询 NS 记录
dig example.com ANY               # 查询所有记录
dig @8.8.8.8 example.com         # 指定 DNS 服务器
dig +short example.com            # 只输出 IP
dig +trace example.com            # 追踪完整解析路径
dig -x 8.8.8.8                   # 反向解析

测试连通性

bash
ping google.com
ping -c 4 google.com     # 发送 4 个包
ping6 ::1                # IPv6 ping

iptables 基本用法

bash
# 查看规则
iptables -L -n
iptables -L -n -v
iptables -L -n --line-numbers

# 允许/拒绝特定端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -j DROP

# 允许特定 IP
iptables -A INPUT -s 192.168.1.100 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT

# 禁止特定 IP
iptables -A INPUT -s 10.0.0.5 -j DROP

# 删除规则
iptables -D INPUT -p tcp --dport 80 -j ACCEPT
iptables -D INPUT 3                  # 按行号删除

# 清空规则
iptables -F

# 设置默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# NAT 端口转发
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 80

# 保存规则
iptables-save > /etc/iptables.rules
iptables-restore < /etc/iptables.rules

防火墙

ufw(Ubuntu 推荐)

bash
# 基本操作
ufw enable                  # 启用防火墙
ufw disable                 # 禁用防火墙
ufw status                  # 查看状态
ufw status verbose          # 详细状态
ufw status numbered         # 带编号的状态

# 允许/拒绝
ufw allow 22                # 允许端口
ufw allow 80/tcp            # 允许 TCP 端口
ufw allow 1000:2000/tcp     # 允许端口范围
ufw deny 3306               # 拒绝端口
ufw reject 3306             # 拒绝并返回错误

# 基于 IP
ufw allow from 192.168.1.100
ufw allow from 192.168.1.0/24
ufw allow from 192.168.1.100 to any port 22

# 应用配置文件
ufw app list                # 列出可用的应用配置
ufw allow "OpenSSH"         # 使用应用名称
ufw allow "Nginx Full"      # 允许 Nginx HTTP+HTTPS

# 删除规则
ufw delete allow 80
ufw delete 3                # 按编号删除

# 重置
ufw reset

firewall-cmd(CentOS/RHEL)

bash
# 基本操作
firewall-cmd --state                    # 查看状态
firewall-cmd --reload                   # 重新加载规则
firewall-cmd --list-all                 # 列出所有规则
firewall-cmd --list-ports              # 列出开放端口
firewall-cmd --list-services           # 列出允许的服务

# 永久规则(需 --permanent 并 reload)
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --remove-port=80/tcp
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https

# 临时规则(重启后失效)
firewall-cmd --add-port=8080/tcp
firewall-cmd --remove-port=8080/tcp

# 端口转发
firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toport=8080

# 富规则(Rich Rules)
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="3306" protocol="tcp" accept'
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.5" drop'

# 区域操作
firewall-cmd --get-default-zone
firewall-cmd --set-default-zone=public
firewall-cmd --get-active-zones

常见场景配置

bash
# 场景一:Web 服务器(Ubuntu)
ufw allow 22
ufw allow 80
ufw allow 443
ufw enable

# 场景二:Web 服务器(CentOS)
firewall-cmd --permanent --add-service=ssh
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload

# 场景三:仅允许内网访问数据库
ufw allow from 192.168.1.0/24 to any port 3306

# 场景四:限制 SSH 登录尝试(配合 fail2ban)
ufw limit 22/tcp

SSH 配置

密钥管理

bash
# 生成密钥对
ssh-keygen -t ed25519 -C "[email protected]"
ssh-keygen -t rsa -b 4096 -C "[email protected]"

# 复制公钥到远程服务器
ssh-copy-id user@remote_host
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@remote_host

# 手动复制公钥
cat ~/.ssh/id_ed25519.pub | ssh user@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

# 修改权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
chmod 600 ~/.ssh/authorized_keys

SSH 客户端配置 ~/.ssh/config

# 简写登录
Host myserver
    HostName 192.168.1.100
    User admin
    Port 22
    IdentityFile ~/.ssh/id_ed25519

# 通过跳板机连接
Host internal
    HostName 10.0.0.5
    User admin
    ProxyJump jumpserver

Host jumpserver
    HostName 203.0.113.1
    User jumpuser

# 通配符配置
Host *.example.com
    User admin
    IdentityFile ~/.ssh/id_ed25519

# 保持连接
Host *
    ServerAliveInterval 60           # 每 60 秒发送一次心跳包,防止连接断开
    ServerAliveCountMax 3            # 连续 3 次无响应则断开
    AddKeysToAgent yes               # 自动将密钥添加到 ssh-agent
    # UseKeychain yes                # macOS 专用:将密钥密码存入系统钥匙串(Linux 请删除此行)

⚠️ UseKeychain yes 是 macOS 特有的选项,在 Linux 服务器上使用会导致报错。Linux 用户请注释或删除此行。

使用:

bash
ssh myserver                # 等同于 ssh [email protected]
scp file myserver:/path/    # 传输文件

sshd_config 安全配置

文件路径:/etc/ssh/sshd_config

bash
# 修改端口
Port 2222

# 禁用密码登录(确保已配置密钥)
PasswordAuthentication no
PermitRootLogin prohibit-password

# 仅允许特定用户登录
AllowUsers admin deploy

# 仅允许特定组登录
AllowGroups sshusers

# 限制最大尝试次数
MaxAuthTries 3

# 禁用空密码
PermitEmptyPasswords no

# 禁用 X11 转发
X11Forwarding no

# 设置登录超时
LoginGraceTime 30
ClientAliveInterval 300
ClientAliveCountMax 2
bash
# 修改后重启 sshd
systemctl restart sshd

# 测试配置是否有语法错误
sshd -t

⚠️ 修改 sshd_config 前务必确保有其他方式(如控制台)访问服务器,避免配置错误导致无法登录。

SCP 文件传输

bash
# 上传文件
scp file.txt user@host:/path/

# 上传目录
scp -r dir/ user@host:/path/

# 下载文件
scp user@host:/path/file.txt ./

# 指定端口
scp -P 2222 file.txt user@host:/path/

# 通过跳板机传输
scp -o ProxyJump=jumpserver file.txt user@internal:/path/

SFTP 文件传输

bash
sftp user@host

# 常用命令
sftp> ls                  # 远程目录列表
sftp> lls                 # 本地目录列表
sftp> cd /path            # 远程切换目录
sftp> lcd /path           # 本地切换目录
sftp> get file.txt        # 下载文件
sftp> get -r dir/         # 下载目录
sftp> put file.txt        # 上传文件
sftp> put -r dir/         # 上传目录
sftp> mkdir dirname       # 创建远程目录
sftp> rm file.txt         # 删除远程文件
sftp> exit                # 退出

rsync 文件同步

bash
# 本地同步
rsync -av /source/ /dest/

# 远程同步(通过 SSH)
rsync -avz /local/path/ user@host:/remote/path/
rsync -avz user@host:/remote/path/ /local/path/

# 常用参数组合
rsync -avz --progress /source/ /dest/
rsync -avz --delete /source/ /dest/     # 删除目标中源不存在的文件

# 排除文件
rsync -avz --exclude='node_modules' --exclude='.git' /source/ /dest/
rsync -avz --exclude-from=exclude.txt /source/ /dest/

# 试运行(不实际执行)
rsync -avzn /source/ /dest/

# 限速
rsync -avz --bwlimit=10000 /source/ /dest/    # 限速 10MB/s
参数说明
-a归档模式(保留权限、时间戳等)
-v详细输出
-z传输时压缩
--progress显示传输进度
--delete删除目标端多余文件
--exclude排除文件/目录
-n试运行
--bwlimit限速(KB/s)

💡 注意源路径末尾的 //source/ 表示同步目录内容,/source 表示同步目录本身。

包管理

apt(Ubuntu/Debian)

bash
# 更新软件源
apt update

# 升级已安装的包
apt upgrade
apt upgrade -y             # 自动确认

# 安装
apt install package_name
apt install package_name -y
apt install package=1.2.3  # 指定版本

# 卸载
apt remove package_name
apt purge package_name     # 卸载并删除配置文件
apt autoremove             # 清理不需要的依赖

# 搜索
apt search keyword
apt show package_name      # 查看包详情

# 查看已安装
apt list --installed
dpkg -l | grep keyword

yum/dnf(CentOS/RHEL)

bash
# 更新缓存
yum makecache
dnf makecache

# 安装
yum install package_name
dnf install package_name -y

# 卸载
yum remove package_name
dnf remove package_name

# 更新
yum update
dnf update

# 搜索
yum search keyword
dnf search keyword

# 查看包信息
yum info package_name

# 查看已安装
yum list installed
rpm -qa | grep keyword

# 清理缓存
yum clean all
dnf clean all

常用国内镜像源配置

Ubuntu/Debian - 换源

bash
# 备份原配置
cp /etc/apt/sources.list /etc/apt/sources.list.bak

# 替换为阿里云源(以 Ubuntu 22.04 为例)
cat > /etc/apt/sources.list << 'EOF'
deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
EOF

apt update

CentOS - 换源

bash
# 备份
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak

# 下载阿里云源
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

yum makecache

常用镜像源:

镜像源地址
阿里云mirrors.aliyun.com
清华大学mirrors.tuna.tsinghua.edu.cn
中科大mirrors.ustc.edu.cn
华为云mirrors.huaweicloud.com

磁盘管理

查看磁盘信息

bash
# 查看块设备列表
lsblk
lsblk -f                    # 显示文件系统类型和 UUID
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,FSTYPE,UUID

# 查看磁盘使用情况
df -h
df -h /path                 # 查看指定路径所在分区
df -i                       # 查看 inode 使用情况
df -T                       # 显示文件系统类型

df -h 输出列说明

说明
Filesystem文件系统或分区
Size总容量
Used已使用
Avail可用空间
Use%使用百分比
Mounted on挂载点

du 详解

bash
# 查看目录总大小
du -sh /path

# 查看当前目录下各项大小
du -sh *
du -sh * | sort -rh          # 按大小排序

# 查看指定深度
du -h --max-depth=1 /path    # 只看一级子目录
du -h -d 1 /path             # 同上

# 查看文件大小
du -h file.txt

# 排除特定目录
du -sh --exclude='node_modules' /path

# 汇总多个目录
du -shc /var/log /tmp /home

fdisk 磁盘分区

bash
# 查看所有磁盘分区
fdisk -l

# 对指定磁盘进行分区
fdisk /dev/sdb

# fdisk 交互命令
# p    打印分区表
# n    新建分区
# d    删除分区
# t    更改分区类型
# w    写入并退出
# q    不保存退出

创建文件系统

bash
mkfs.ext4 /dev/sdb1         # ext4
mkfs.xfs /dev/sdb1          # xfs
mkfs.vfat /dev/sdb1         # FAT32

挂载与卸载

bash
# 临时挂载
mount /dev/sdb1 /mnt/data

# 指定文件系统类型
mount -t ext4 /dev/sdb1 /mnt/data

# 只读挂载
mount -o ro /dev/sdb1 /mnt/data

# 卸载
umount /mnt/data
umount /dev/sdb1

# 强制卸载(设备忙时)
umount -l /mnt/data          # 延迟卸载
umount -f /mnt/data          # 强制卸载(NFS)

# 查看挂载信息
mount | grep sdb1
findmnt /mnt/data

永久挂载 /etc/fstab

# 设备文件    挂载点    文件系统类型    选项        dump  fsck
/dev/sdb1    /mnt/data  ext4           defaults     0     2
UUID=xxx     /mnt/data  ext4           defaults     0     2
bash
# 测试 fstab 配置(不会实际挂载)
mount -a

# 获取 UUID
blkid /dev/sdb1

清理空间

bash
find /tmp -type f -mtime +7 -delete    # 清理 7 天前的临时文件

压缩解压

bash
# tar 命令
tar -czf archive.tar.gz dir/     # 压缩
tar -xzf archive.tar.gz          # 解压
tar -xzf archive.tar.gz -C /path # 解压到指定目录

# zip
zip -r archive.zip dir/
unzip archive.zip
unzip archive.zip -d /path

系统信息

bash
# 系统信息
uname -a          # 内核信息
cat /etc/os-release   # 发行版信息

# 内存使用
free -h

# 用户信息
whoami
id

/etc/hosts 文件

文件路径:/etc/hosts

# 格式:IP地址    主机名    别名
127.0.0.1       localhost
192.168.1.100   web-server    web
10.0.0.5        db-server     db
  • 优先级高于 DNS 查询(先查 hosts,再查 DNS)
  • 常用于本地开发环境域名映射、内网服务发现
  • 修改后立即生效,无需重启服务
bash
# 测试 hosts 解析
ping web-server
nslookup web-server

hostnamectl 主机名管理

bash
# 查看主机名及系统信息
hostnamectl

# 设置主机名
hostnamectl set-hostname myserver

# 设置静态、瞬态、灵活主机名
hostnamectl set-hostname myserver --static
hostnamectl set-hostname myserver --transient
hostnamectl set-hostname myserver --pretty

# 查看特定主机名
hostnamectl status --static
类型说明
static写入 /etc/hostname,重启后保留
transient运行时临时名称,重启后恢复
pretty面向用户的描述性名称

timedatectl 时间时区管理

bash
# 查看当前时间设置
timedatectl

# 查看可用时区
timedatectl list-timezones
timedatectl list-timezones | grep Asia

# 设置时区
timedatectl set-timezone Asia/Shanghai

# 启用 NTP 时间同步
timedatectl set-ntp true

# 禁用 NTP 同步
timedatectl set-ntp false

# 手动设置时间(需先禁用 NTP)
timedatectl set-time "2024-01-01 12:00:00"

localectl 语言和编码设置

bash
# 查看当前语言和编码设置
localectl

# 查看可用 locale
localectl list-locales
localectl list-locales | grep zh

# 设置系统语言
localectl set-locale LANG=zh_CN.UTF-8

# 设置键盘布局
localectl set-keymap us
变量说明
LANG默认语言和编码
LC_CTYPE字符分类和大小写
LC_NUMERIC数字格式
LC_TIME日期时间格式
LC_COLLATE排序规则
bash
# 生成 locale(Debian/Ubuntu)
sudo locale-gen zh_CN.UTF-8
sudo update-locale LANG=zh_CN.UTF-8

systemd-analyze 启动分析

bash
# 查看启动总耗时
systemd-analyze

# 查看各服务启动耗时(排序)
systemd-analyze blame
systemd-analyze blame | head -20

# 查看关键链路(哪些服务串行等待)
systemd-analyze critical-chain

# 查看指定服务的关键链路
systemd-analyze critical-chain nginx.service

# 生成 SVG 启动图
systemd-analyze plot > startup.svg

# 查看安全评分
systemd-analyze security myservice.service

日志管理

/var/log/ 目录结构

文件/目录说明
/var/log/syslog系统日志(Ubuntu/Debian)
/var/log/messages系统日志(CentOS/RHEL)
/var/log/auth.log认证日志(Ubuntu)
/var/log/secure认证日志(CentOS)
/var/log/kern.log内核日志
/var/log/dmesg硬件和驱动日志
/var/log/boot.log启动日志
/var/log/cron定时任务日志
/var/log/maillog邮件日志
/var/log/nginx/Nginx 日志目录
/var/log/apache2/Apache 日志目录
/var/log/mysql/MySQL 日志目录

实时查看日志

bash
# tail -f 实时追踪
tail -f /var/log/syslog
tail -f /var/log/nginx/access.log
tail -f /var/log/nginx/error.log

# 多文件同时追踪
tail -f /var/log/syslog /var/log/auth.log

# less +F 实时追踪(可搜索,按 Ctrl+C 后可用 less 命令)
less +F /var/log/syslog

# grep 过滤实时日志
tail -f /var/log/syslog | grep "error"
tail -f /var/log/nginx/access.log | grep "404"

logrotate 配置

配置文件:/etc/logrotate.conf,独立配置在 /etc/logrotate.d/

# 示例:Nginx 日志轮转
/var/log/nginx/*.log {
    daily               # 每天轮转
    missingok           # 文件不存在时不报错
    rotate 14           # 保留 14 个备份
    compress            # 压缩旧日志
    delaycompress       # 延迟一次再压缩
    notifempty          # 空文件不轮转
    create 0640 www-data adm   # 创建新日志文件的权限
    sharedscripts       # 所有日志轮转后只执行一次脚本
    postrotate
        [ -s /run/nginx.pid ] && kill -USR1 $(cat /run/nginx.pid)
    endscript
}
bash
# 手动测试轮转
logrotate -d /etc/logrotate.conf     # 调试模式(不实际执行)
logrotate -f /etc/logrotate.d/nginx  # 强制执行

journalctl 用法

bash
# 查看所有日志
journalctl

# 查看指定服务日志
journalctl -u nginx
journalctl -u sshd -f

# 按时间筛选
journalctl --since today
journalctl --since "2024-01-01 10:00" --until "2024-01-01 12:00"

# 按优先级筛选
journalctl -p err              # 只看错误及以上
journalctl -p warning          # 只看警告及以上

# 查看本次启动的日志
journalctl -b
journalctl -b -1               # 上次启动的日志

# 查看内核日志
journalctl -k

# 输出格式
journalctl -o json-pretty      # JSON 格式
journalctl -o short-precise    # 精确时间戳

# 清理日志
journalctl --disk-usage
journalctl --vacuum-size=500M  # 限制日志大小
journalctl --vacuum-time=7d    # 只保留 7 天

# 永久配置 /etc/systemd/journald.conf
# SystemMaxUse=500M            # 最大占用空间
# MaxRetentionSec=7day         # 最大保留时间

性能监控

top 详解

bash
top

top 各列含义

说明
PID进程 ID
USER进程所有者
PR优先级
NInice 值(-20 到 19,越小优先级越高)
VIRT虚拟内存大小
RES实际使用的物理内存
SHR共享内存大小
S进程状态(R=运行 S=睡眠 D=不可中断 Z=僵尸 T=停止)
%CPUCPU 使用率
%MEM内存使用率
TIME+累计 CPU 时间
COMMAND命令名

top 交互快捷键

按键说明
1显示每个 CPU 核心的使用情况
M按内存使用排序
P按 CPU 使用排序
T按累计时间排序
k杀死进程(输入 PID)
r调整进程优先级(renice)
q退出
H显示线程
c显示完整命令行

htop

bash
htop

比 top 更友好的交互界面,支持鼠标操作、树状视图、搜索进程。常用操作:

按键说明
F1帮助
F2设置
F3搜索进程
F4过滤进程
F5树状视图
F6选择排序列
F9杀死进程
F10退出

free 内存详解

bash
free -h

free -h 输出说明

说明
total物理内存总量
used已使用内存
free完全空闲的内存
shared共享内存
buff/cache缓冲区和缓存占用
available可用内存(含可回收的缓存)

💡 Linux 会积极使用内存做缓存,available 才是真正可分配给应用程序的内存大小。

bash
# 持续监控(每 2 秒刷新)
free -h -s 2

vmstat

bash
# 每 1 秒采样,共 5 次
vmstat 1 5

vmstat 输出列说明

类别说明
procsr等待运行的进程数
procsb不可中断睡眠的进程数
memoryswpd使用的虚拟内存
memoryfree空闲内存
memorybuff缓冲区
memorycache缓存
swapsi从 swap 读入(KB/s)
swapso写入 swap(KB/s)
iobi块设备读入
iobo块设备写出
systemin每秒中断次数
systemcs每秒上下文切换次数
cpuus用户空间 CPU 占比
cpusy内核空间 CPU 占比
cpuid空闲 CPU 占比
cpuwa等待 IO 的 CPU 占比

iostat

bash
# 查看磁盘 IO 统计
iostat -x 1 5              # 每秒采样,共 5 次
iostat -x -d 1             # 只看磁盘信息

iostat 关键指标

说明
r/s每秒读次数
w/s每秒写次数
rkB/s每秒读取 KB
wkB/s每秒写入 KB
await平均 IO 等待时间(ms)
%util设备繁忙百分比

lsof 详解

bash
# 查看指定端口的进程
lsof -i :80
lsof -i :8080

# 查看指定用户打开的文件
lsof -u username

# 查看指定进程打开的文件
lsof -p PID

# 查看指定文件被谁打开
lsof /var/log/syslog

# 查看网络连接
lsof -i tcp
lsof -i udp
lsof -i -sTCP:LISTEN         # 只看监听状态
lsof -i -sTCP:ESTABLISHED    # 只看已建立连接

# 查看被删除但仍占用空间的文件
lsof +L1

strace

bash
# 跟踪系统调用
strace command

# 跟踪运行中的进程
strace -p PID

# 只跟踪特定系统调用
strace -e open,read,write command

# 统计系统调用
strace -c command

# 输出到文件
strace -o output.txt command

# 显示时间戳
strace -t command
strace -tt command            # 微秒级
strace -T command             # 显示每个调用耗时

sar(System Activity Reporter)

bash
sar -u 1 5                   # CPU 使用率(每秒,5次)
sar -r 1 5                   # 内存使用率
sar -d 1 5                   # 磁盘 IO
sar -n DEV 1 5               # 网络接口流量
sar -n TCP 1 5               # TCP 连接统计
sar -q 1 5                   # 负载和运行队列
sar -f /var/log/sa/sa$(date +%d)  # 查看历史数据

常用技巧

别名 alias

bash
# 设置别名
alias ll='ls -la'
alias gs='git status'
alias gp='git push'
alias dc='docker compose'
alias k='kubectl'

# 带参数的别名
alias grep='grep --color=auto'

# 查看所有别名
alias

# 取消别名
unalias ll

# 在命令中使用原始命令(跳过别名)
\ls
command ls

永久生效:写入 ~/.bashrc~/.zshrc

环境变量 export

bash
# 设置环境变量(仅当前会话)
export NODE_ENV=production
export PATH=$PATH:/usr/local/bin

# 查看所有环境变量
env
printenv

# 查看特定变量
echo $PATH
echo $HOME
echo $USER

# 删除环境变量
unset NODE_ENV

常用环境变量:

变量说明
PATH可执行文件搜索路径
HOME当前用户家目录
USER当前用户名
SHELL默认 shell
LANG系统语言和编码
EDITOR默认编辑器
http_proxyHTTP 代理
https_proxyHTTPS 代理

~/.bashrc 和 ~/.profile

bash
# ~/.bashrc — 每次打开新的交互式 bash 时加载
# 适合放:别名、函数、shell 选项、提示符配置

# ~/.profile — 登录时加载(适用于所有 shell)
# 适合放:环境变量、PATH 配置

# ~/.bash_profile — 登录时加载(仅 bash)
# 通常会 source ~/.bashrc

# 修改后立即生效
source ~/.bashrc
# 或
. ~/.bashrc

典型 .bashrc 配置示例:

bash
# 提示符
PS1='\[\e[32m\]\u@\h:\w\$\[\e[0m\] '

# 别名
alias ll='ls -la'
alias ..='cd ..'

# 历史命令设置
HISTSIZE=10000
HISTFILESIZE=20000
HISTCONTROL=ignoredups:erasedups

# 别名
alias ll='ls -la'

历史命令 history

bash
# 查看历史命令
history

# 执行历史命令
!123           # 执行第 123 条命令
!!             # 执行上一条命令
!grep          # 执行最近一条以 grep 开头的命令
!?keyword      # 执行最近一条包含 keyword 的命令

# 搜索历史命令(交互式)
Ctrl+R

# 清空历史
history -c

# 删除指定条目
history -d 123

# 设置历史大小(~/.bashrc)
HISTSIZE=10000
HISTFILESIZE=20000
HISTCONTROL=ignoredups:erasedups    # 忽略连续重复命令

Shell 快捷键

快捷键说明
Ctrl+C终止当前命令
Ctrl+D退出当前 shell / 输入 EOF
Ctrl+L清屏(等同 clear)
Ctrl+R反向搜索历史命令
Ctrl+A移动光标到行首
Ctrl+E移动光标到行尾
Ctrl+U删除光标前的内容
Ctrl+K删除光标后的内容
Ctrl+W删除光标前的一个单词
Ctrl+Y粘贴 Ctrl+U/K/W 删除的内容
Ctrl+T交换光标前两个字符
Ctrl+Z暂停进程(可用 fg 恢复)
Ctrl+S终端输出冻结
Ctrl+Q解冻终端输出
Alt+B光标向左移动一个单词
Alt+F光标向右移动一个单词
Tab自动补全命令或路径
Tab Tab显示所有补全选项

xargs

bash
# 基本用法:将输入转换为命令参数
echo "file1 file2 file3" | xargs rm

# 指定每次传递的参数个数
echo "1 2 3 4 5 6" | xargs -n 2 echo

# 使用占位符
echo "file1 file2" | xargs -I {} cp {} /backup/

# 处理含空格的文件名
find . -name "*.log" -print0 | xargs -0 rm

# 并行执行
find . -name "*.jpg" | xargs -P 4 -I {} convert {} -resize 50% {}

# 确认执行
echo "file1 file2" | xargs -p rm

# 结合 find 使用
find /tmp -name "*.tmp" -mtime +7 | xargs rm -f

# 限制命令行长度
cat urls.txt | xargs -s 1024 wget

管道与重定向

bash
# 管道:将前一个命令的输出作为后一个命令的输入
ps aux | grep node | grep -v grep

# 重定向
echo "hello" > file.txt      # 覆盖写入
echo "hello" >> file.txt     # 追加写入
command 2>&1                 # 合并错误输出到标准输出
command > /dev/null 2>&1     # 丢弃所有输出

后台运行

bash
# 后台运行
command &

# nohup(终端关闭后继续运行)
nohup command &

# 查看后台任务
jobs
fg %1         # 切换到前台

screen 终端复用

bash
# 创建会话
screen -S session_name

# 分离会话(快捷键 Ctrl+A, D)
# 列出会话
screen -ls

# 恢复会话
screen -r session_name

# 恢复或创建
screen -R session_name

# 杀死会话
screen -X -S session_name quit

tmux 终端复用

bash
# 创建会话
tmux new -s session_name

# 分离会话(快捷键 Ctrl+B, D)
# 列出会话
tmux ls

# 恢复会话
tmux attach -t session_name

# 恢复或创建
tmux new -A -s session_name

# 杀死会话
tmux kill-session -t session_name

tmux 常用快捷键(前缀键为 Ctrl+B):

快捷键说明
Ctrl+B, D分离会话
Ctrl+B, %左右分屏
Ctrl+B, "上下分屏
Ctrl+B, 方向键切换面板
Ctrl+B, C新建窗口
Ctrl+B, N下一个窗口
Ctrl+B, P上一个窗口
Ctrl+B, [进入复制模式(可滚动)

💡 推荐使用 tmux 替代 screen,功能更现代。适合运行耗时任务(编译、数据库迁移),断开 SSH 后进程不会中断。

定时任务

bash
# 编辑定时任务
crontab -e

# 格式:分 时 日 月 周 命令
# 每天凌晨 3 点执行
0 3 * * * /path/to/script.sh

# 每 5 分钟执行
*/5 * * * * /path/to/script.sh

# 查看定时任务
crontab -l

参考

个人学习笔记,部分内容借助 AI 辅助整理,仅供查阅参考,请以官方文档为准