Linux运维必收藏:50个常用命令与实战技巧

作为运维工程师,每天与Linux服务器打交道,熟练掌握常用命令是基本功。本文整理了50个实战中最常用的命令及技巧,帮你快速提升运维效率。

一、文件与目录管理

1. 快速查找大文件

服务器磁盘告警?先用这条命令找出占用空间最大的文件和目录:

# 查找当前目录下大于100MB的文件
find . -type f -size +100M -exec ls -lh {} \; | awk '{print $5, $9}'

# 查找系统中最占空间的10个目录
du -ah / --max-depth=1 2>/dev/null | sort -rh | head -n 10

2. 批量重命名文件

# 将所有 .txt 文件重命名为 .log
rename 's/\.txt$/.log/' *.txt

# 将所有文件名中的空格替换为下划线
find . -type f -name "* *" -exec rename 's/ /_/g' {} \;

# 批量添加前缀
for f in *.jpg; do mv "$f" "backup_$f"; done

3. 安全删除与恢复

危险操作前务必三思!建议用trash替代rm或将文件先移动到临时目录。

# 创建回收站别名(推荐添加到 ~/.bashrc)
alias trash='mv --target-directory=$HOME/.trash'

# 安全删除:先移动到临时目录,等30天后再确认删除
mkdir -p /tmp/safe_delete
mv old_logs/*.log /tmp/safe_delete/

# 彻底删除超过30天的临时文件
find /tmp/safe_delete -type f -mtime +30 -delete

二、进程与性能监控

4. 实时监控系统资源

# 实时CPU、内存、进程监控(按CPU占用排序)
top -c

# 每2秒刷新一次,指定刷新10次后退出
vmstat 2 10

# 详细查看某个进程(PID替换为实际值)
pidstat -p <PID> -u 1 5

# 监控磁盘I/O
iostat -xz 1 5

5. 快速定位CPU/内存消耗最高的进程

# CPU占用最高的10个进程
ps aux --sort=-%cpu | head -n 11

# 内存占用最高的10个进程
ps aux --sort=-%mem | head -n 11

# 快速杀死占用最高的进程(确认后再执行!)
ps aux --sort=-%cpu | awk 'NR==2 {print $2}' | xargs kill -15

# 查看某个用户的进程
ps -u username -f

6. 分析CPU飙升的根本原因

# 记录CPU使用率,排查间歇性飙升
nohup sh -c 'while true; do ps aux --sort=-%cpu | head -20 >> /tmp/cpu_log.txt; sleep 60; done' &

# 分析日志中导致CPU飙升的时段
grep -n "high cpu" /var/log/syslog | awk '{print $1, $2}' | head -20

# 查看进程树,快速定位父进程
pstree -p $(pgrep -f "problem_process")

三、网络诊断与排障

7. 全面网络诊断链

# 1. 检查网络接口状态
ip addr show
ip link show

# 2. 测试网络连通性(发3个包)
ping -c 3 8.8.8.8

# 3. 追踪路由(定位在哪一跳出问题)
traceroute -m 15 example.com
mtr -n example.com  # 实时路由追踪

# 4. DNS解析检查
dig example.com
nslookup example.com

# 5. 检查端口是否开放
ss -tlnp | grep :80
netstat -tulnp | grep :443

8. 查看连接数和防御CC攻击

# 查看TCP连接数统计(按状态分类)
ss -s

# 查看与某个IP的连接数
ss -ant | awk '/:80\|:443/ {print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -10

# 查看连接数最多的前20个IP
netstat -anp | grep ESTABLISHED | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -20

# 封禁异常IP(替换为实际恶意IP)
iptables -A INPUT -s 1.2.3.4 -j DROP

# 封禁Ping(防止ICMP Flood)
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

9. 端口转发与代理

# 将本机8080端口转发到远程服务器的80端口(通过SSH隧道)
ssh -L 8080:localhost:80 user@remote-server

# 将远程服务器的3306端口映射到本地
ssh -L 3307:localhost:3306 user@remote-server

# 使用socat做端口转发(后台运行)
nohup socat TCP-LISTEN:8080,fork TCP:192.168.1.100:80 &

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

四、日志分析与安全

10. Nginx日志实时分析

# 实时查看最新日志
tail -f /var/log/nginx/access.log

# 统计HTTP状态码分布
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn

# 找出访问最频繁的IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20

# 统计每秒请求数(QPS)
awk '{print $4}' /var/log/nginx/access.log | cut -d: -f2,3,4 | sort | uniq -c | sort -rn | head -20

# 找出404最多的页面
awk '$9==404 {print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10

11. 系统安全检查清单

# 检查最近登录成功的用户
last | head -20

# 检查登录失败记录(排查暴力破解)
lastb | head -30

# 查看哪些用户有sudo权限
getent group sudo

# 检查开放的所有端口
nmap -p- -sT localhost

# 检查SSH是否被暴力破解
grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -rn | head -10

# 查找最近修改过的系统文件
find /bin /sbin /usr/bin /usr/sbin -mtime -7 -ls

五、定时任务与自动化

12. Crontab高效使用技巧

# 编辑当前用户定时任务
crontab -e

# 查看定时任务
crontab -l

# 系统级定时任务(/etc/crontab)
cat /etc/crontab

# 常用定时任务示例
# 每天凌晨2点执行数据库备份
0 2 * * * /opt/scripts/backup.sh >> /var/log/backup.log 2>&1

# 每5分钟执行一次健康检查
*/5 * * * * /opt/scripts/health_check.sh

# 每周日凌晨3点清理临时文件
0 3 * * 0 find /tmp -type f -mtime +7 -delete

# 每月1日凌晨执行日志清理
0 0 1 * * /opt/scripts/clean_logs.sh

13. systemd定时器(推荐替代crontab)

# 创建定时器单元文件 /etc/systemd/system/backup.timer
cat > /etc/systemd/system/backup.timer << 'EOF'
[Unit]
Description=Database Backup Timer

[Timer]
OnCalendar=daily
AccuracySec=1min

[Install]
WantedBy=timers.target
EOF

# 创建对应的服务文件 backup.service
cat > /etc/systemd/system/backup.service << 'EOF'
[Unit]
Description=Database Backup Service

[Service]
Type=oneshot
ExecStart=/opt/scripts/backup.sh

[Install]
WantedBy=multi-user.target
EOF

# 启用并启动定时器
systemctl daemon-reload
systemctl enable backup.timer
systemctl start backup.timer

六、数据备份与恢复

14. MySQL数据库备份脚本

#!/bin/bash
# MySQL全量备份脚本
DB_HOST="localhost"
DB_USER="backup_user"
DB_PASS="your_password"
DB_NAME="your_database"
BACKUP_DIR="/data/backup/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=30

mkdir -p ${BACKUP_DIR}

# 备份并压缩
mysqldump -h${DB_HOST} -u${DB_USER} -p${DB_PASS}   --single-transaction --routines --triggers   --events ${DB_NAME} | gzip > ${BACKUP_DIR}/${DB_NAME}_${DATE}.sql.gz

# 验证备份文件
if [ -s "${BACKUP_DIR}/${DB_NAME}_${DATE}.sql.gz" ]; then
    echo "[$(date)] Backup successful: ${DB_NAME}_${DATE}.sql.gz"
else
    echo "[$(date)] Backup FAILED!" | mail -s "Backup Alert" admin@example.com
fi

# 清理旧备份
find ${BACKUP_DIR} -name "*.sql.gz" -mtime +${RETENTION_DAYS} -delete
echo "[$(date)] Old backups cleaned"

15. rsync远程同步备份

# 远程同步网站数据(保留权限和链接)
rsync -avz --delete   -e "ssh -p 22 -i /root/.ssh/id_rsa"   /var/www/html/   root@backup-server:/data/backup/www/

# 增量备份(只传差异部分)
rsync -avz --delete --delete-excluded   /data/   root@backup-server:/data/backup/

# 排除特定目录或文件
rsync -avz --exclude='*.log' --exclude='tmp/'   /data/website/   backup@192.168.1.200:/backup/

七、效率提升技巧

16. 历史命令的智慧用法

# 搜索之前用过的命令(非常实用!)
history | grep git

# 执行上一条命令(快速重复)
!!

# 执行包含"nginx"的历史命令
!nginx

# 使用Ctrl+R反向搜索(按TAB补全)
# 按Ctrl+R,然后输入关键字,重复按Ctrl+R切换

# 清除历史(登出前删除敏感命令)
history -c && exit

17. 一键生成服务器巡检报告

#!/bin/bash
# server_health_check.sh
echo "=========================================="
echo "服务器健康检查报告 - $(date '+%Y-%m-%d %H:%M:%S')"
echo "=========================================="
echo ""
echo "【系统信息】"
uname -a
echo ""
echo "【运行时间】"
uptime
echo ""
echo "【磁盘使用】"
df -h | grep -v tmpfs
echo ""
echo "【内存使用】"
free -h
echo ""
echo "【Top5 CPU进程】"
ps aux --sort=-%cpu | head -6
echo ""
echo "【Top5内存进程】"
ps aux --sort=-%mem | head -6
echo ""
echo "【网络连接状态】"
ss -s
echo ""
echo "【最近重启记录】"
last reboot | head -5
echo ""
echo "【系统服务状态】"
systemctl list-units --type=service --state=failed

18. 快速环境变量管理

# 临时设置(当前会话有效)
export JAVA_HOME=/usr/local/java
export PATH=$JAVA_HOME/bin:$PATH

# 永久设置(写入配置)
echo 'export JAVA_HOME=/usr/local/java' >> ~/.bashrc
source ~/.bashrc

# 查看所有环境变量
env | sort

# 查看特定变量
echo $PATH

# 从文件加载环境变量(.env文件)
set -a
source .env
set +a

总结

以上50个命令覆盖了Linux运维的日常核心场景。建议收藏本文作为速查手册,遇到问题时从对应的分类中快速定位解决方案。随着经验积累,你会发现这些命令的组合使用能解决80%以上的日常运维问题。

如有更多实战技巧,欢迎在评论区分享!

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容