Linux 常用命令
大白话解释: Linux 命令就像"和服务器对话的语言"。你通过 SSH 连接到服务器后,用命令来操作服务器:查看文件、安装软件、查看日志、重启服务等。
为什么要学 Linux 命令?
- 服务器运维:部署项目、查看日志、排查问题
- 没有图形界面:服务器通常只有命令行,没有鼠标和窗口
- 自动化脚本:把多个命令写成脚本,自动执行重复任务
最常用的命令:
ls— 查看文件列表cd— 切换目录cat— 查看文件内容tail -f— 实时查看日志grep— 搜索文件内容chmod— 修改文件权限ps— 查看进程kill— 停止进程
服务器操作和文件管理的基础命令。
文件操作
目录导航
# 查看当前目录
pwd
# 切换目录
cd /path/to/dir
cd ~ # 回到家目录
cd .. # 上一级
cd - # 上一次所在的目录文件列表
# 查看文件列表
ls
ls -la # 详细信息(含隐藏文件)
ls -lh # 文件大小可读格式
ls -lt # 按修改时间排序文件操作
# 创建目录
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 # 强制删除(慎用)文件查看
# 查看文件内容
cat filename
less filename # 分页查看(q 退出)
head -n 20 file # 前 20 行
tail -n 20 file # 后 20 行
tail -f file # 实时追踪(查看日志)链接 ln
# 软链接(符号链接,类似快捷方式)
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 | ❌ | ❌ | 仍可访问 |
文件搜索
# 按文件名查找
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 文本处理
# 替换文本
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 文本处理
# 按列提取(默认以空格/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权限管理
# 查看权限
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 目录 |
密码管理
passwd username # 修改指定用户密码
passwd -l username # 锁定用户账户
passwd -u username # 解锁用户账户
passwd -e username # 强制下次登录时修改密码切换用户
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 | 组信息 |
# 查看 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 配置
# 编辑 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进程管理
# 查看进程
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 | 取消禁用 |
查看服务列表
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
[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.targetType 值说明:
| Type | 说明 |
|---|---|
simple | 默认值,ExecStart 进程即主进程 |
forking | 进程会 fork,适合传统 daemon |
oneshot | 执行一次就退出,配合 RemainAfterExit=yes |
notify | 进程就绪后会通知 systemd |
idle | 等待其他任务完成后才启动 |
Restart 值说明:
| Restart | 说明 |
|---|---|
no | 不自动重启(默认) |
on-success | 正常退出时重启 |
on-failure | 异常退出时重启 |
on-abnormal | 被信号杀死或超时时重启 |
on-abort | 收到未捕获信号时重启 |
always | 总是重启 |
# 重新加载 systemd 配置
systemctl daemon-reload
# 启动并设置开机自启
systemctl enable --now myservicejournalctl 日志查看
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 天日志日志级别(从高到低):
| 级别 | 关键字 | 说明 |
|---|---|---|
| 0 | emerg | 系统不可用 |
| 1 | alert | 需要立即处理 |
| 2 | crit | 严重条件 |
| 3 | err | 错误 |
| 4 | warning | 警告 |
| 5 | notice | 正常但重要 |
| 6 | info | 信息 |
| 7 | debug | 调试 |
网络相关
端口与连接
# 查看端口占用
netstat -tlnp
ss -tlnp
lsof -i :8080
# 查看 IP
ip addr
ifconfigcurl 详细用法
# 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.comcurl 常用参数:
| 参数 | 说明 |
|---|---|
-X | 指定 HTTP 方法 |
-H | 添加请求头 |
-d | 发送请求体数据 |
-F | 发送表单数据(文件上传用 @) |
-o / -O | 输出到文件 |
-s | 静默模式 |
-v | 详细输出 |
-k | 忽略 SSL 证书验证 |
-L | 跟随重定向 |
-u user:pass | Basic 认证 |
--max-time | 最大超时时间(秒) |
-w | 自定义输出格式 |
wget 详细用法
# 下载文件
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/filenc (netcat) 端口测试
# 测试端口是否开放
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 80traceroute 和 mtr 路由追踪
# 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 查询
# 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 # 反向解析测试连通性
ping google.com
ping -c 4 google.com # 发送 4 个包
ping6 ::1 # IPv6 pingiptables 基本用法
# 查看规则
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 推荐)
# 基本操作
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 resetfirewall-cmd(CentOS/RHEL)
# 基本操作
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常见场景配置
# 场景一: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/tcpSSH 配置
密钥管理
# 生成密钥对
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_keysSSH 客户端配置 ~/.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 用户请注释或删除此行。
使用:
ssh myserver # 等同于 ssh [email protected]
scp file myserver:/path/ # 传输文件sshd_config 安全配置
文件路径:/etc/ssh/sshd_config
# 修改端口
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# 修改后重启 sshd
systemctl restart sshd
# 测试配置是否有语法错误
sshd -t⚠️ 修改 sshd_config 前务必确保有其他方式(如控制台)访问服务器,避免配置错误导致无法登录。
SCP 文件传输
# 上传文件
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 文件传输
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 文件同步
# 本地同步
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)
# 更新软件源
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 keywordyum/dnf(CentOS/RHEL)
# 更新缓存
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 - 换源:
# 备份原配置
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 updateCentOS - 换源:
# 备份
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 |
磁盘管理
查看磁盘信息
# 查看块设备列表
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 详解
# 查看目录总大小
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 /homefdisk 磁盘分区
# 查看所有磁盘分区
fdisk -l
# 对指定磁盘进行分区
fdisk /dev/sdb
# fdisk 交互命令
# p 打印分区表
# n 新建分区
# d 删除分区
# t 更改分区类型
# w 写入并退出
# q 不保存退出创建文件系统
mkfs.ext4 /dev/sdb1 # ext4
mkfs.xfs /dev/sdb1 # xfs
mkfs.vfat /dev/sdb1 # FAT32挂载与卸载
# 临时挂载
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# 测试 fstab 配置(不会实际挂载)
mount -a
# 获取 UUID
blkid /dev/sdb1清理空间
find /tmp -type f -mtime +7 -delete # 清理 7 天前的临时文件压缩解压
# 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系统信息
# 系统信息
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)
- 常用于本地开发环境域名映射、内网服务发现
- 修改后立即生效,无需重启服务
# 测试 hosts 解析
ping web-server
nslookup web-serverhostnamectl 主机名管理
# 查看主机名及系统信息
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 时间时区管理
# 查看当前时间设置
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 语言和编码设置
# 查看当前语言和编码设置
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 | 排序规则 |
# 生成 locale(Debian/Ubuntu)
sudo locale-gen zh_CN.UTF-8
sudo update-locale LANG=zh_CN.UTF-8systemd-analyze 启动分析
# 查看启动总耗时
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 日志目录 |
实时查看日志
# 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
}# 手动测试轮转
logrotate -d /etc/logrotate.conf # 调试模式(不实际执行)
logrotate -f /etc/logrotate.d/nginx # 强制执行journalctl 用法
# 查看所有日志
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 详解
toptop 各列含义:
| 列 | 说明 |
|---|---|
PID | 进程 ID |
USER | 进程所有者 |
PR | 优先级 |
NI | nice 值(-20 到 19,越小优先级越高) |
VIRT | 虚拟内存大小 |
RES | 实际使用的物理内存 |
SHR | 共享内存大小 |
S | 进程状态(R=运行 S=睡眠 D=不可中断 Z=僵尸 T=停止) |
%CPU | CPU 使用率 |
%MEM | 内存使用率 |
TIME+ | 累计 CPU 时间 |
COMMAND | 命令名 |
top 交互快捷键:
| 按键 | 说明 |
|---|---|
1 | 显示每个 CPU 核心的使用情况 |
M | 按内存使用排序 |
P | 按 CPU 使用排序 |
T | 按累计时间排序 |
k | 杀死进程(输入 PID) |
r | 调整进程优先级(renice) |
q | 退出 |
H | 显示线程 |
c | 显示完整命令行 |
htop
htop比 top 更友好的交互界面,支持鼠标操作、树状视图、搜索进程。常用操作:
| 按键 | 说明 |
|---|---|
F1 | 帮助 |
F2 | 设置 |
F3 | 搜索进程 |
F4 | 过滤进程 |
F5 | 树状视图 |
F6 | 选择排序列 |
F9 | 杀死进程 |
F10 | 退出 |
free 内存详解
free -hfree -h 输出说明:
| 列 | 说明 |
|---|---|
total | 物理内存总量 |
used | 已使用内存 |
free | 完全空闲的内存 |
shared | 共享内存 |
buff/cache | 缓冲区和缓存占用 |
available | 可用内存(含可回收的缓存) |
💡 Linux 会积极使用内存做缓存,
available才是真正可分配给应用程序的内存大小。
# 持续监控(每 2 秒刷新)
free -h -s 2vmstat
# 每 1 秒采样,共 5 次
vmstat 1 5vmstat 输出列说明:
| 类别 | 列 | 说明 |
|---|---|---|
| procs | r | 等待运行的进程数 |
| procs | b | 不可中断睡眠的进程数 |
| memory | swpd | 使用的虚拟内存 |
| memory | free | 空闲内存 |
| memory | buff | 缓冲区 |
| memory | cache | 缓存 |
| swap | si | 从 swap 读入(KB/s) |
| swap | so | 写入 swap(KB/s) |
| io | bi | 块设备读入 |
| io | bo | 块设备写出 |
| system | in | 每秒中断次数 |
| system | cs | 每秒上下文切换次数 |
| cpu | us | 用户空间 CPU 占比 |
| cpu | sy | 内核空间 CPU 占比 |
| cpu | id | 空闲 CPU 占比 |
| cpu | wa | 等待 IO 的 CPU 占比 |
iostat
# 查看磁盘 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 详解
# 查看指定端口的进程
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 +L1strace
# 跟踪系统调用
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)
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
# 设置别名
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
# 设置环境变量(仅当前会话)
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_proxy | HTTP 代理 |
https_proxy | HTTPS 代理 |
~/.bashrc 和 ~/.profile
# ~/.bashrc — 每次打开新的交互式 bash 时加载
# 适合放:别名、函数、shell 选项、提示符配置
# ~/.profile — 登录时加载(适用于所有 shell)
# 适合放:环境变量、PATH 配置
# ~/.bash_profile — 登录时加载(仅 bash)
# 通常会 source ~/.bashrc
# 修改后立即生效
source ~/.bashrc
# 或
. ~/.bashrc典型 .bashrc 配置示例:
# 提示符
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
# 查看历史命令
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
# 基本用法:将输入转换为命令参数
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管道与重定向
# 管道:将前一个命令的输出作为后一个命令的输入
ps aux | grep node | grep -v grep
# 重定向
echo "hello" > file.txt # 覆盖写入
echo "hello" >> file.txt # 追加写入
command 2>&1 # 合并错误输出到标准输出
command > /dev/null 2>&1 # 丢弃所有输出后台运行
# 后台运行
command &
# nohup(终端关闭后继续运行)
nohup command &
# 查看后台任务
jobs
fg %1 # 切换到前台screen 终端复用
# 创建会话
screen -S session_name
# 分离会话(快捷键 Ctrl+A, D)
# 列出会话
screen -ls
# 恢复会话
screen -r session_name
# 恢复或创建
screen -R session_name
# 杀死会话
screen -X -S session_name quittmux 终端复用
# 创建会话
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_nametmux 常用快捷键(前缀键为 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 后进程不会中断。
定时任务
# 编辑定时任务
crontab -e
# 格式:分 时 日 月 周 命令
# 每天凌晨 3 点执行
0 3 * * * /path/to/script.sh
# 每 5 分钟执行
*/5 * * * * /path/to/script.sh
# 查看定时任务
crontab -l