古人学问无遗力，少壮工夫老始成。 纸上得来终觉浅，绝知此事要躬行。
服务器到手，如何安全加固？老运维的全方位实战指南
服务器到手，如何安全加固？老运维的全方位实战指南在互联网安全事故频发的今天，服务器安全已经成为每位运维工程师必须面对的头等大事。前几天刚接手一批新服务器，想到很多朋友经常问我："新服务器应该如何进行安全加固？"今天就借这个机会，和大家分享一下我十多年运维生涯中总结的服务器安全加固实战经验。无论你是刚入行的新手，还是有经验的运维人员，这篇文章都能帮你构建一个更加安全的服务器环境。一、系统基础安全1. 系统更新与补丁管理系统漏洞是黑客入侵的首选目标。记得去年某金融客户因为没及时打补丁，结果被勒索软件攻击，损失惨重。所以，拿到新服务器的第一件事就是更新系统：CentOS/RHEL系统:# 查看可更新的包 yum check-update # 更新所有包 yum update -y # 只更新安全补丁 yum update --securityUbuntu/Debian系统:# 更新软件包列表 apt update # 升级所有已安装的包 apt upgrade -y # 智能升级（处理依赖关系） apt dist-upgrade -y别忘了设置自动更新，但要注意生产环境中先在测试环境验证补丁的稳定性。2. 最小化安装原则上个月帮一个客户排查安全问题时，发现他们服务器上装了一堆用不到的服务，每一个都是潜在的安全风险。记住：不需要的服务就是风险。# 列出所有已安装的包 rpm -qa # RHEL/CentOS dpkg -l # Debian/Ubuntu # 删除不必要的服务 yum remove <package_name> # RHEL/CentOS apt purge <package_name> # Debian/Ubuntu常见可移除的服务： telnet、rsh、rlogin（使用SSH替代） 不必要的打印服务如CUPS 不使用的代理服务、邮件服务等 3. 禁用不必要的启动服务# 列出所有启动的服务 systemctl list-unit-files --state=enabled # 禁用不需要的服务 systemctl disable <service_name> systemctl mask <service_name> # 彻底禁用二、用户账户安全1. 加固root账户root账户是黑客的首要攻击目标。前段时间一个朋友的服务器被入侵，就是因为root密码太简单被暴力破解。# 设置强密码 passwd root # 禁止root远程登录（编辑/etc/ssh/sshd_config） PermitRootLogin no # 重启SSH服务 systemctl restart sshd2. 创建管理员账户# 创建管理员用户 useradd -m admin passwd admin # 赋予sudo权限 usermod -aG wheel admin # CentOS/RHEL usermod -aG sudo admin # Ubuntu/Debian3. 密码策略加固在/etc/login.defs和/etc/security/pwquality.conf中设置密码复杂度要求：PASS_MAX_DAYS 90 # 密码最长有效期 PASS_MIN_DAYS 7 # 两次修改密码的最小间隔 PASS_MIN_LEN 12 # 最小密码长度 PASS_WARN_AGE 7 # 过期前警告天数 # 密码复杂度 minlen = 12 minclass = 3 maxrepeat = 3别忘了配置PAM模块强制执行这些策略：# 编辑/etc/pam.d/system-auth（CentOS）或/etc/pam.d/common-password（Ubuntu） password requisite pam_pwquality.so retry=3三、SSH安全加固SSH是运维人员的必备工具，但也是黑客重点攻击的服务之一。1. 修改默认端口# 编辑/etc/ssh/sshd_config Port 2222 # 使用非标准端口 # 如果使用SELinux，需要设置 semanage port -a -t ssh_port_t -p tcp 22222. 密钥认证替代密码# 客户端生成密钥对 ssh-keygen -t ed25519 -C "admin@example.com" # 上传公钥到服务器 ssh-copy-id -i ~/.ssh/id_ed25519.pub admin@server_ip # 禁用密码认证（编辑/etc/ssh/sshd_config） PasswordAuthentication no ChallengeResponseAuthentication no3. 其他SSH加固措施编辑/etc/ssh/sshd_config：Protocol 2 # 只使用SSH v2协议 MaxAuthTries 3 # 最大认证尝试次数 MaxSessions 5 # 最大会话数 LoginGraceTime 60 # 登录超时时间 ClientAliveInterval 300 # 客户端活跃检测间隔 ClientAliveCountMax 2 # 客户端活跃检测次数 AllowUsers admin # 只允许特定用户登录重启SSH服务生效：systemctl restart sshd四、防火墙配置1. 配置iptables/firewalld# 使用firewalld（CentOS 7+/RHEL 7+） systemctl enable firewalld systemctl start firewalld # 只开放必要端口 firewall-cmd --permanent --add-port=2222/tcp # SSH firewall-cmd --permanent --add-port=80/tcp # HTTP firewall-cmd --permanent --add-port=443/tcp # HTTPS firewall-cmd --reload或者使用传统iptables：# 基本iptables规则 iptables -F iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp --dport 2222 -j ACCEPT iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT # 保存规则 service iptables save2. 防DDoS配置# 限制SYN洪水 iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT iptables -A INPUT -p tcp --syn -j DROP # 限制ICMP请求 iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 4 -j ACCEPT iptables -A INPUT -p icmp --icmp-type echo-request -j DROP五、文件系统安全1. 分区与挂载选项合理的分区策略可以有效防止某些攻击。去年一个客户因为/tmp目录和根目录在同一分区，被黑客利用填满磁盘导致系统崩溃。在/etc/fstab中添加安全挂载选项：/dev/sda1 /boot ext4 defaults,nosuid,nodev,noexec 1 2 /dev/sda2 /tmp ext4 defaults,nosuid,nodev,noexec 1 2 /dev/sda3 /var ext4 defaults,nosuid 1 2 /home /home ext4 defaults,nosuid,nodev 1 2这些选项的作用： nosuid: 禁止SUID/SGID位生效 nodev: 禁止解释设备文件 noexec: 禁止执行二进制文件 2. 文件权限审计与修复# 设置关键文件的正确权限 chmod 644 /etc/passwd chmod 000 /etc/shadow chmod 644 /etc/group chmod 600 /etc/gshadow # 查找并修复危险的SUID/SGID文件 find / -type f \( -perm -4000 -o -perm -2000 \) -exec ls -l {} \; # 查找世界可写文件 find / -type f -perm -o+w -not -path "/proc/*" -not -path "/sys/*" -exec ls -l {} \;3. 文件完整性检查安装AIDE（Advanced Intrusion Detection Environment）进行文件完整性监控：# 安装AIDE yum install aide # CentOS/RHEL apt install aide # Ubuntu/Debian # 初始化数据库 aide --init mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz # 设置定期检查 echo "0 4 * * * root /usr/sbin/aide --check | mail -s 'AIDE检查报告' admin@example.com" > /etc/cron.d/aide六、系统审计与日志1. 配置集中日志最近一个客户因为没有保存足够的日志，黑客入侵后无法追溯攻击路径。配置rsyslog将日志发送到集中服务器：# 编辑/etc/rsyslog.conf *.* @logserver.example.com:514 # UDP *.* @@logserver.example.com:514 # TCP+TLS # 重启服务 systemctl restart rsyslog2. 配置Auditd审计系统# 安装auditd yum install audit # CentOS/RHEL apt install auditd # Ubuntu/Debian # 启用并配置 systemctl enable auditd systemctl start auditd # 编辑/etc/audit/auditd.conf max_log_file = 50 max_log_file_action = rotate num_logs = 10 space_left_action = email action_mail_acct = root admin_space_left_action = halt添加关键审计规则（/etc/audit/rules.d/audit.rules）：# 监控/etc目录变更 -w /etc/ -p wa -k etc_changes # 监控用户/组变更 -w /etc/passwd -p wa -k user_modification -w /etc/shadow -p wa -k user_modification -w /etc/group -p wa -k user_modification -w /etc/gshadow -p wa -k user_modification # 监控sudo使用 -w /usr/bin/sudo -p x -k sudo_usage # 监控失败的访问尝试 -a always,exit -F arch=b64 -S open -F exit=-EACCES -k file_access -a always,exit -F arch=b64 -S open -F exit=-EPERM -k file_access3. 日志轮转与保留配置logrotate确保日志不会占满磁盘：# 编辑/etc/logrotate.conf rotate 90 # 保留90天 daily # 每天轮转 compress # 压缩旧日志 dateext # 使用日期扩展名七、入侵检测与防御1. 安装配置Fail2banFail2ban可以自动封禁尝试暴力破解的IP：# 安装Fail2ban yum install epel-release && yum install fail2ban # CentOS/RHEL apt install fail2ban # Ubuntu/Debian # 配置SSH防护 cat > /etc/fail2ban/jail.local << EOF [sshd] enabled = true port = 2222 filter = sshd logpath = /var/log/auth.log maxretry = 3 bantime = 3600 findtime = 600 EOF # 启动服务 systemctl enable fail2ban systemctl start fail2ban2. 安装配置rootkit检测工具# 安装rkhunter yum install rkhunter # CentOS/RHEL apt install rkhunter # Ubuntu/Debian # 更新数据库 rkhunter --update rkhunter --propupd # 设置定期扫描 echo "0 3 * * * root /usr/bin/rkhunter --check --skip-keypress --report-warnings-only" > /etc/cron.d/rkhunter3. 配置文件监控使用osquery进行高级监控：# 安装osquery # 从官网下载并安装对应系统的包 # 配置文件监控 cat > /etc/osquery/osquery.conf << EOF { "schedule": { "file_events": { "query": "SELECT * FROM file_events;", "interval": 60 }, "process_events": { "query": "SELECT * FROM process_events;", "interval": 60 } }, "file_paths": { "etc": ["/etc/%%"], "bin": ["/bin/%%", "/sbin/%%", "/usr/bin/%%", "/usr/sbin/%%"] } } EOF # 启动服务 systemctl enable osqueryd systemctl start osqueryd八、网络安全加固1. 内核参数优化编辑/etc/sysctl.conf：# 防止IP欺骗 net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 # 禁止IP源路由 net.ipv4.conf.all.accept_source_route = 0 net.ipv4.conf.default.accept_source_route = 0 # 防止SYN洪水攻击 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_syn_backlog = 2048 net.ipv4.tcp_synack_retries = 2 net.ipv4.tcp_syn_retries = 5 # 禁用ICMP重定向 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.all.secure_redirects = 0 net.ipv4.conf.default.secure_redirects = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 # 启用反向路径过滤 net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 # 记录可疑包 net.ipv4.conf.all.log_martians = 1 net.ipv4.conf.default.log_martians = 1应用配置：sysctl -p2. 网络服务加固对于Web服务器，配置TLS/SSL：# 生成强密钥和CSR openssl req -new -newkey rsa:4096 -nodes -keyout server.key -out server.csr # 在Nginx中配置安全参数 server { listen 443 ssl http2; ssl_certificate /etc/ssl/certs/server.crt; ssl_certificate_key /etc/ssl/private/server.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305'; ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; ssl_session_tickets off; ssl_stapling on; ssl_stapling_verify on; add_header Strict-Transport-Security "max-age=63072000" always; }3. 配置网络访问控制使用TCP Wrappers限制服务访问：# 编辑/etc/hosts.allow sshd: 192.168.1.0/24 10.0.0.0/8 # 编辑/etc/hosts.deny ALL: ALL九、定期安全检查1. 创建安全基线检查脚本#!/bin/bash # security_check.sh - 定期安全检查脚本 echo "=== 系统信息 ===" hostname date uname -a echo -e "\n=== 用户登录检查 ===" last | head -20 echo -e "\n=== 当前登录用户 ===" w echo -e "\n=== 失败的登录尝试 ===" grep "Failed password" /var/log/auth.log | tail -20 echo -e "\n=== 特权用户列表 ===" grep -v -E "^#|^$" /etc/sudoers echo -e "\n=== SUID/SGID文件检查 ===" find / -type f \( -perm -4000 -o -perm -2000 \) -exec ls -l {} \; 2>/dev/null echo -e "\n=== 开放端口检查 ===" ss -tuln echo -e "\n=== 系统服务检查 ===" systemctl list-units --type=service --state=running echo -e "\n=== 防火墙规则检查 ===" if command -v firewall-cmd &> /dev/null; then firewall-cmd --list-all elif command -v iptables &> /dev/null; then iptables -L -n fi echo -e "\n=== 系统更新状态 ===" if command -v yum &> /dev/null; then yum check-update --security | head -20 elif command -v apt &> /dev/null; then apt list --upgradable | head -20 fi echo -e "\n=== 磁盘空间使用情况 ===" df -h echo -e "\n=== 大文件检查 ===" find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null | head -20 echo -e "\n=== 检查可疑的cron任务 ===" for user in $(cut -f1 -d: /etc/passwd); do crontab -u $user -l 2>/dev/null | grep -v "^#" done echo -e "\n=== 异常进程检查 ===" ps aux --sort=-%cpu | head -20 echo -e "\n=== 检查最近修改的系统文件 ===" find /etc -type f -mtime -7 -exec ls -la {} \; 2>/dev/null echo -e "\n=== 检查网络连接 ===" netstat -antup | grep ESTABLISHED | head -20 echo -e "\n=== 检查登录失败记录 ===" lastb | head -20 echo -e "\n=== 安全检查完成 ===" 将此脚本设置为每周运行：chmod +x /usr/local/bin/security_check.sh echo "0 8 * * 1 root /usr/local/bin/security_check.sh | mail -s 'Weekly Security Check Report' admin@example.com" > /etc/cron.d/security_check2. 使用Lynis进行安全审计Lynis是一个强大的安全审计工具：# 安装Lynis wget https://downloads.cisofy.com/lynis/lynis-3.0.8.tar.gz tar xzf lynis-3.0.8.tar.gz cd lynis # 运行审计 ./lynis audit system # 查看报告 cat /var/log/lynis.log cat /var/log/lynis-report.dat设置定期审计：echo "0 2 * * 7 root cd /path/to/lynis && ./lynis audit system --cronjob" > /etc/cron.d/lynis3. 漏洞扫描使用OpenVAS或Nessus定期扫描服务器漏洞，或者使用更轻量级的工具如Vuls：# 安装Vuls（简化版安装步骤） # 详细安装步骤请参考官方文档 # 配置扫描目标 cat > config.toml << EOF [servers] [servers.localhost] host = "localhost" port = "local" EOF # 运行扫描 vuls scan vuls report -format-json十、应急响应准备1. 创建应急响应计划为服务器创建应急响应计划文档，包括： 紧急联系人列表 事件分类和响应程序 证据收集指南 恢复程序 事后分析模板 2. 配置系统快照和备份# 安装并配置备份工具（例如rsnapshot） yum install rsnapshot # CentOS/RHEL apt install rsnapshot # Ubuntu/Debian # 配置备份（编辑/etc/rsnapshot.conf） snapshot_root /backup/ retain daily 7 retain weekly 4 retain monthly 6 backup /etc/ localhost/ backup /home/ localhost/ backup /var/www/ localhost/ backup /var/log/ localhost/ backup /usr/local/ localhost/ # 设置定期备份 echo "0 1 * * * root /usr/bin/rsnapshot daily" > /etc/cron.d/rsnapshot echo "0 2 * * 7 root /usr/bin/rsnapshot weekly" >> /etc/cron.d/rsnapshot echo "0 3 1 * * root /usr/bin/rsnapshot monthly" >> /etc/cron.d/rsnapshot3. 创建紧急恢复工具包准备一个紧急恢复USB驱动器，包含： 系统安装介质 关键配置文件备份 恢复指南文档 取证工具（如CAINE、Kali Linux） 密码重置工具 总结经过多年的运维经验，我发现服务器安全不是一次性工作，而是持续的过程。这里是一些最佳实践： 定期更新和审计：每周至少检查一次系统更新，每月进行一次全面安全审计。 最小权限原则：只授予用户完成工作所需的最小权限。 深度防御策略：不要依赖单一安全措施，而是构建多层次防御体系。 监控和警报：设置全面的监控系统，确保异常行为能够及时触发警报。 文档和培训：记录所有安全配置，并确保团队成员了解安全策略。 定期测试：进行定期渗透测试和灾难恢复演练。 保持简单：复杂的系统更难以维护和审计，尽量保持简单明了。 记住，服务器安全是一场持久战。黑客只需找到一个漏洞，而我们必须防御所有可能的攻击。通过实施本文提到的安全加固措施，你的服务器将能够抵御大多数常见的攻击，但安全工作永远不会结束。希望这份全方位的服务器安全加固指南对你有所帮助。如果你有任何问题或需要进一步的建议，欢迎在评论区留言交流！你有没有遇到过服务器安全问题？你通常会采取哪些措施来保护你的服务器？欢迎在评论区分享你的经验和想法！
在服务器管理和系统运维的日常工作中，实时监控系统资源使用情况是一项基础且关键的任务。作为Linux系统管理员，你可能已经熟悉了传统的top命令，但今天我要向大家详细介绍一个更强大、更直观的替代工具——htop。这款开源工具不仅提供了更友好的界面，还带来了更丰富的功能和更灵活的操作体验。htop简介htop是一个跨平台的交互式进程查看器，它是top命令的增强版。与top相比，htop提供了全面的系统资源使用情况视图，支持使用鼠标操作，并且允许用户在不输入进程号(PID)的情况下对进程进行操作。htop使用ncurses库构建，提供了彩色的终端界面，使得系统监控工作更加直观高效。安装htop在开始使用前，首先需要在系统上安装htop。根据不同的Linux发行版，安装命令略有不同：Debian/Ubuntu系统:sudo apt update sudo apt install htopCentOS/RHEL系统:sudo yum install epel-release sudo yum install htopFedora系统:sudo dnf install htopArch Linux系统:sudo pacman -S htop安装完成后，只需在终端中输入htop命令即可启动。htop界面详解初次运行htop时，你会看到一个分为上下两部分的界面：顶部区域（系统概览）顶部区域显示系统的整体资源使用情况，包括： CPU使用率：每个CPU核心都有独立的使用率条，不同颜色代表不同类型的进程： 蓝色：低优先级进程 绿色：普通用户进程 红色：内核进程 黄色/橙色：IRQ时间 洋红色：软中断时间 灰色：IO等待时间 内存使用情况：显示物理内存和交换空间的使用百分比和具体数值 绿色：已使用内存 蓝色：缓冲区 黄色/橙色：缓存 负载平均值：显示1分钟、5分钟和15分钟的系统负载平均值 正常运行时间：系统启动至今的运行时间 任务统计：显示总进程数、运行中的进程数等信息 底部区域（进程列表）底部区域显示系统中运行的进程列表，默认按CPU使用率排序。每个进程显示以下信息： PID：进程ID USER：进程所有者 PRI：进程优先级 NI：nice值 VIRT：虚拟内存大小 RES：常驻内存大小 SHR：共享内存大小 S：进程状态（R=运行，S=睡眠，Z=僵尸等） CPU%：CPU使用百分比 MEM%：内存使用百分比 TIME+：进程运行时间 Command：命令名称和参数 htop的高级操作技巧基本操作 上下左右键：在进程列表中导航 F5：切换树形视图，显示进程父子关系 F6：选择排序字段 F9：向进程发送信号（如终止进程） F10或q：退出htop 进程管理htop最强大的功能之一是其直观的进程管理能力： 终止进程：选中进程后按F9，然后选择要发送的信号（如SIGTERM或SIGKILL） 调整进程优先级：选中进程后按F7（降低nice值）或F8（提高nice值） 追踪进程系统调用：选中进程后按s，启动strace（需要安装strace工具） 查看进程打开的文件：选中进程后按l，启动lsof（需要安装lsof工具） 搜索功能在htop中，按下/键可以搜索特定进程。输入关键字后，htop会高亮显示匹配的进程。这在系统运行大量进程时特别有用。过滤功能按下\键可以激活过滤功能，输入过滤条件后，htop只会显示符合条件的进程。例如，输入"apache"将只显示与apache相关的进程。自定义显示列htop允许你自定义显示哪些进程信息列： 按F2进入设置菜单 选择"Columns"选项 使用空格键选择或取消选择要显示的列 F10保存并退出设置 自定义配色方案如果你不喜欢默认的颜色方案，可以在设置菜单中进行更改： 按F2进入设置菜单 选择"Colors"选项 选择预设的配色方案或自定义各元素的颜色 F10保存并退出设置 实用场景分析场景一：系统资源异常高，定位问题进程当服务器CPU或内存使用率异常高时，可以通过以下步骤快速定位问题： 启动htop，查看顶部的CPU和内存使用情况 按F6，选择按CPU%或MEM%排序 观察排在顶部的进程，这些通常是资源消耗最大的 如果发现异常进程，可以进一步分析或终止它 例如，我曾经遇到一个Web服务器响应缓慢的问题，通过htop发现某个PHP-FPM进程CPU使用率达到100%，进一步分析发现是一个存在无限循环的PHP脚本导致的问题。场景二：监控多核CPU的负载均衡情况在多核服务器上，理想情况下工作负载应该均匀分布在各个CPU核心上： 启动htop，观察顶部的CPU使用率条 检查各个核心的使用率是否平衡 如果发现某个核心长期满负荷而其他核心空闲，可能表明应用程序不支持多线程或存在配置问题 场景三：内存泄漏排查对于疑似内存泄漏的情况，可以使用htop进行初步排查： 启动htop，按F6选择按MEM%排序 记录可疑进程的内存使用情况 定期观察这些进程的内存使用是否持续增长而不释放 如果确认某进程存在内存泄漏，可以重启该进程作为临时解决方案，并进一步分析根本原因 htop vs top：为什么选择htop？虽然传统的top命令在几乎所有Linux系统中都预装了，但htop在多个方面提供了显著改进： 用户友好的界面：彩色显示，更易于阅读和理解 交互性更强：支持鼠标操作和更丰富的键盘快捷键 垂直和水平滚动：可以查看完整的命令行，不会被截断 树形视图：直观显示进程的父子关系 无需输入PID：直接选择进程进行操作，减少出错可能 实时响应：对用户输入的反应更快 更详细的资源使用情况：分别显示每个CPU核心的使用率 高级技巧：htop配置文件定制htop的配置文件位于~/.config/htop/htoprc，你可以直接编辑这个文件来自定义htop的行为。一些有用的自定义选项包括：# 启动时默认按内存使用率排序 sort_key=M_RESIDENT # 默认显示树形视图 tree_view=1 # 显示隐藏进程 hide_userland_threads=0 # 高亮显示程序名称 highlight_base_name=1编辑完成后保存文件，下次启动htop时将应用这些设置。扩展工具：htop的替代品和补充虽然htop已经非常强大，但在特定场景下，你可能还需要了解一些其他工具： glances：提供更全面的系统监控，包括网络、磁盘IO等 atop：专注于长期性能监控和记录 iotop：专门监控磁盘IO使用情况 nmon：IBM开发的系统监控工具，提供更多性能数据 btop++：htop的现代替代品，提供更华丽的界面和更多功能 总结htop是一款功能强大且易于使用的Linux系统监控工具，它通过直观的界面和丰富的交互功能，大大提升了系统管理员监控和管理进程的效率。从基本的系统资源监控到复杂的进程管理，从简单的排序过滤到自定义显示配置，htop几乎能满足所有与进程监控相关的需求。在日常运维工作中，掌握htop的使用技巧不仅能帮助你快速定位系统问题，还能提高工作效率，减少排障时间。无论是处理高CPU负载、内存泄漏，还是需要快速终止失控进程，htop都能提供直观且高效的解决方案。特别值得一提的是，htop的学习曲线相当平缓。即使是Linux新手，也能在短时间内掌握其基本操作。而随着使用经验的积累，你会发现htop中蕴含的各种高级功能，能够应对越来越复杂的系统监控场景。实践建议 定期监控系统状态：养成使用htop定期检查系统状态的习惯，可以帮助你及早发现潜在问题 熟悉快捷键：掌握常用快捷键可以大大提高操作效率 创建自定义配置：根据个人习惯和工作需求定制htop配置 结合其他工具使用：htop虽然强大，但在特定场景下可能需要配合其他专业工具 保持更新：htop不断发布新版本，及时更新可以获得新功能和性能改进 常见问题解答Q: htop显示的内存使用与free命令不一致，哪个更准确？A: 两者计算方式不同。htop显示的是进程实际使用的物理内存，而free命令考虑了缓存和缓冲区。对于评估实际内存压力，两者都有参考价值，但角度不同。Q: 如何在htop中只显示特定用户的进程？A: 按u键，然后选择或输入用户名即可。Q: htop能否监控远程服务器？A: htop本身不支持远程监控，但可以通过SSH连接到远程服务器后运行htop。也可以考虑使用专门的远程监控工具如Nagios或Zabbix。Q: 为什么有时候CPU使用率显示超过100%？A: 在多核系统中，htop默认将所有CPU核心的使用率加总显示。例如，在8核系统中，理论上最大CPU使用率可达800%。可以在设置中修改这一显示方式。Q: htop能否显示历史资源使用情况？A: htop主要关注实时监控，不保存历史数据。如需查看历史资源使用情况，可以考虑使用sar、atop或专业监控系统。进阶应用方向随着云计算和容器技术的普及，系统监控工具也在不断演进。如果你已经熟练掌握了htop，可以考虑进一步学习以下相关技术： 容器监控：了解如何监控Docker、Kubernetes环境中的容器资源使用情况 分布式系统监控：学习Prometheus、Grafana等工具，实现跨服务器的统一监控 自动化监控与告警：将监控数据与自动化运维系统集成，实现异常自动处理 性能调优：基于监控数据进行系统和应用性能优化 htop作为一个基础但强大的工具，是系统管理员工具箱中不可或缺的一部分。在掌握它的基础上，你可以构建更全面、更强大的系统监控方案，为企业IT基础设施的稳定运行提供有力保障。你是否已经在使用htop？有没有发现一些特别实用的技巧？欢迎在评论区分享你的经验和见解！如果你觉得这篇文章有帮助，别忘了点赞和转发，让更多的Linux爱好者和系统管理员了解这个强大的工具。关注我的博客，获取更多实用的Linux运维技巧和工具介绍！Linux运维 #系统监控 #htop教程 #服务器管理 #性能优化
目录 文件操作命令 文件查看命令 系统管理命令 网络相关命令 用户管理命令 权限管理命令 压缩与解压缩命令 搜索命令 进程管理命令 磁盘管理命令 文本处理命令 Shell编程常用命令 文件操作命令ls - 列出目录内容# 列出当前目录所有文件和目录 ls # 列出详细信息 ls -l # 列出包括隐藏文件 ls -a # 按时间排序 ls -lt # 按大小排序 ls -lS # 递归显示子目录内容 ls -R # 显示文件大小时使用人类可读格式 ls -lhcd - 切换目录# 切换到指定目录 cd /path/to/directory # 切换到用户主目录 cd 或 cd ~ # 切换到上一级目录 cd .. # 切换到上一个工作目录 cd -mkdir - 创建目录# 创建单个目录 mkdir directory_name # 创建多个目录 mkdir dir1 dir2 dir3 # 递归创建目录(创建多级目录) mkdir -p parent/child/grandchildrm - 删除文件或目录# 删除文件 rm filename # 删除目录 rm -r directory # 强制删除 rm -f filename # 强制递归删除目录及其内容(危险操作) rm -rf directory # 交互式删除 rm -i filenamecp - 复制文件或目录# 复制文件 cp source_file destination_file # 复制目录及其内容 cp -r source_directory destination_directory # 保留文件属性复制 cp -p source_file destination_file # 交互式复制(覆盖前提示) cp -i source_file destination_file # 复制并显示进度 cp -v source_file destination_filemv - 移动或重命名文件# 移动文件 mv source_file destination_directory # 重命名文件 mv old_name new_name # 交互式移动(覆盖前提示) mv -i source_file destination_file # 不覆盖已存在的文件 mv -n source_file destination_filetouch - 创建空文件或更新时间戳# 创建空文件 touch filename # 创建多个文件 touch file1 file2 file3 # 只更新访问时间 touch -a filename # 只更新修改时间 touch -m filename # 使用指定时间更新时间戳 touch -t 202301011200 filename # 2023年1月1日12:00ln - 创建链接# 创建硬链接 ln source_file link_name # 创建软链接(符号链接) ln -s source_file link_name # 强制创建链接 ln -f source_file link_name文件查看命令cat - 查看文件内容# 显示文件内容 cat filename # 显示行号 cat -n filename # 显示非打印字符 cat -A filename # 合并多个文件并显示 cat file1 file2 file3less - 分页查看文件# 分页查看文件 less filename # 常用操作: # 空格键: 向下翻页 # b键: 向上翻页 # /关键词: 搜索 # n键: 下一个搜索结果 # q键: 退出head - 查看文件开头# 显示文件前10行 head filename # 显示指定行数 head -n 5 filename # 显示除了最后N行的所有内容 head -n -5 filenametail - 查看文件结尾# 显示文件最后10行 tail filename # 显示指定行数 tail -n 5 filename # 实时监控文件变化 tail -f filename # 从第N行开始显示 tail -n +5 filenamegrep - 搜索文件内容# 在文件中搜索关键词 grep "pattern" filename # 递归搜索目录 grep -r "pattern" directory/ # 显示匹配行号 grep -n "pattern" filename # 忽略大小写 grep -i "pattern" filename # 显示不匹配的行 grep -v "pattern" filename # 只显示匹配的部分 grep -o "pattern" filename # 统计匹配行数 grep -c "pattern" filename系统管理命令uname - 显示系统信息# 显示所有系统信息 uname -a # 显示内核名称 uname -s # 显示内核版本 uname -r # 显示机器硬件名称 uname -mhostname - 显示或设置主机名# 显示主机名 hostname # 设置主机名(需要root权限) hostname new_hostnamedate - 显示或设置系统日期和时间# 显示当前日期和时间 date # 以指定格式显示 date "+%Y-%m-%d %H:%M:%S" # 设置系统日期和时间(需要root权限) date -s "2023-01-01 12:00:00"uptime - 显示系统运行时间# 显示系统运行时间和负载 uptimeshutdown - 关机或重启系统# 立即关机 shutdown -h now # 计划关机(10分钟后) shutdown -h +10 # 立即重启 shutdown -r now # 取消预定的关机 shutdown -creboot - 重启系统# 重启系统 rebootpoweroff - 关闭系统# 关闭系统 poweroffwhich - 定位命令的位置# 显示命令的完整路径 which command_namewhereis - 定位命令的二进制文件、源码和手册页# 显示命令的二进制文件、源码和手册页位置 whereis command_name网络相关命令ifconfig - 配置网络接口# 显示所有网络接口 ifconfig # 显示特定网络接口 ifconfig eth0 # 启用网络接口 ifconfig eth0 up # 禁用网络接口 ifconfig eth0 down # 设置IP地址 ifconfig eth0 192.168.1.100 netmask 255.255.255.0ip - 显示/操作路由、设备、策略路由和隧道# 显示所有网络接口 ip addr show # 显示特定网络接口 ip addr show dev eth0 # 添加IP地址 ip addr add 192.168.1.100/24 dev eth0 # 删除IP地址 ip addr del 192.168.1.100/24 dev eth0 # 显示路由表 ip route showping - 测试网络连接# 发送ICMP请求到主机 ping hostname # 指定ping的次数 ping -c 5 hostname # 指定间隔时间(秒) ping -i 2 hostnamenetstat - 显示网络连接、路由表等# 显示所有连接 netstat -a # 显示监听的端口 netstat -l # 显示进程信息 netstat -p # 显示路由表 netstat -r # 显示所有TCP连接 netstat -atss - 显示套接字统计信息# 显示所有连接 ss -a # 显示监听的端口 ss -l # 显示TCP连接 ss -t # 显示UDP连接 ss -u # 显示进程信息 ss -pwget - 下载文件# 下载文件 wget URL # 后台下载 wget -b URL # 指定输出文件名 wget -O filename URL # 断点续传 wget -c URL # 限制下载速度 wget --limit-rate=200k URLcurl - 传输数据# 获取网页内容 curl URL # 下载文件 curl -o filename URL # 发送POST请求 curl -X POST -d "data" URL # 使用代理 curl -x proxy_server:port URL # 显示响应头 curl -I URLssh - 安全shell远程登录# 连接到远程服务器 ssh username@hostname # 指定端口 ssh -p 2222 username@hostname # 使用密钥文件 ssh -i key_file username@hostname # 执行远程命令 ssh username@hostname "command"scp - 安全复制文件# 从本地复制到远程 scp local_file username@hostname:/remote/directory # 从远程复制到本地 scp username@hostname:/remote/file local_directory # 复制目录 scp -r local_directory username@hostname:/remote/directory # 指定端口 scp -P 2222 local_file username@hostname:/remote/directory用户管理命令useradd - 创建用户# 创建新用户 useradd username # 创建用户并指定主目录 useradd -m -d /home/custom_dir username # 创建用户并指定shell useradd -s /bin/bash username # 创建用户并添加到组 useradd -G group1,group2 usernameuserdel - 删除用户# 删除用户 userdel username # 删除用户及其主目录 userdel -r usernameusermod - 修改用户账户# 修改用户所属组 usermod -g groupname username # 添加用户到附加组 usermod -a -G group1,group2 username # 修改用户shell usermod -s /bin/bash username # 修改用户主目录 usermod -d /new/home usernamepasswd - 修改用户密码# 修改当前用户密码 passwd # 修改指定用户密码(需要root权限) passwd username # 锁定用户账户 passwd -l username # 解锁用户账户 passwd -u username用户管理命令su - 切换用户# 切换到root用户 su # 切换到指定用户 su username # 切换用户并使用目标用户的环境 su - username # 以其他用户身份执行命令 su - username -c "command"sudo - 以其他用户身份执行命令# 以root身份执行命令 sudo command # 以指定用户身份执行命令 sudo -u username command # 显示sudo权限 sudo -l # 切换到root用户shell sudo -s # 切换到root用户环境 sudo -iid - 显示用户身份信息# 显示当前用户信息 id # 显示指定用户信息 id username # 只显示用户ID id -u username # 只显示组ID id -g usernamegroups - 显示用户所属组# 显示当前用户所属组 groups # 显示指定用户所属组 groups usernamewho - 显示当前登录用户# 显示当前登录的用户 who # 显示当前用户 who am i # 显示上次系统启动时间 who -bw - 显示登录用户及其活动# 显示登录用户及其活动 w # 显示指定用户信息 w username权限管理命令chmod - 修改文件权限# 使用数字设置权限 chmod 755 filename # rwxr-xr-x # 使用符号设置权限 chmod u+x filename # 给所有者添加执行权限 chmod g-w filename # 移除组写权限 chmod o=r filename # 设置其他用户只读 chmod a+x filename # 给所有用户添加执行权限 # 递归修改目录及其内容的权限 chmod -R 755 directorychown - 修改文件所有者# 修改文件所有者 chown username filename # 修改文件所有者和组 chown username:groupname filename # 递归修改目录及其内容的所有者 chown -R username directory # 只修改符号链接本身的所有者 chown -h username symlinkchgrp - 修改文件所属组# 修改文件所属组 chgrp groupname filename # 递归修改目录及其内容的所属组 chgrp -R groupname directoryumask - 设置默认权限掩码# 显示当前umask值 umask # 设置新的umask值 umask 022getfacl - 显示文件的访问控制列表# 显示文件的ACL getfacl filenamesetfacl - 设置文件的访问控制列表# 为用户设置权限 setfacl -m u:username:rwx filename # 为组设置权限 setfacl -m g:groupname:rx filename # 删除用户的ACL setfacl -x u:username filename压缩与解压缩命令tar - 归档文件# 创建tar归档 tar -cf archive.tar file1 file2 # 列出归档内容 tar -tf archive.tar # 提取归档 tar -xf archive.tar # 创建gzip压缩的tar归档 tar -czf archive.tar.gz directory/ # 提取gzip压缩的tar归档 tar -xzf archive.tar.gz # 创建bzip2压缩的tar归档 tar -cjf archive.tar.bz2 directory/ # 提取bzip2压缩的tar归档 tar -xjf archive.tar.bz2 # 提取到指定目录 tar -xf archive.tar -C /target/directory/gzip - 压缩文件# 压缩文件(替换原文件) gzip filename # 解压文件 gzip -d filename.gz # 保留原文件并压缩 gzip -c filename > filename.gz # 显示压缩比率 gzip -l filename.gzgunzip - 解压gzip文件# 解压gzip文件 gunzip filename.gzzip - 创建zip归档# 创建zip归档 zip archive.zip file1 file2 # 递归压缩目录 zip -r archive.zip directory/ # 添加文件到现有zip归档 zip -u archive.zip newfile # 使用密码保护 zip -e archive.zip file1 file2unzip - 解压zip归档# 解压zip归档 unzip archive.zip # 列出zip归档内容 unzip -l archive.zip # 解压到指定目录 unzip archive.zip -d /target/directory/ # 解压特定文件 unzip archive.zip filename搜索命令find - 查找文件# 按名称查找 find /path/to/search -name "filename" # 使用通配符 find /path/to/search -name "*.txt" # 忽略大小写 find /path/to/search -iname "filename" # 按类型查找(f:文件, d:目录, l:符号链接) find /path/to/search -type f # 按权限查找 find /path/to/search -perm 644 # 按所有者查找 find /path/to/search -user username # 按组查找 find /path/to/search -group groupname # 按大小查找 find /path/to/search -size +10M # 大于10MB的文件 find /path/to/search -size -10k # 小于10KB的文件 # 按修改时间查找 find /path/to/search -mtime -7 # 7天内修改的文件 # 查找并执行命令 find /path/to/search -name "*.txt" -exec rm {} \; # 查找并确认执行 find /path/to/search -name "*.txt" -ok rm {} \;locate - 快速查找文件# 查找文件 locate filename # 忽略大小写 locate -i filename # 限制结果数量 locate -l 10 filename # 显示匹配的确切数量 locate -c filenamewhereis - 查找二进制文件、源码和手册页# 查找命令的二进制文件、源码和手册页 whereis command # 只查找二进制文件 whereis -b command # 只查找手册页 whereis -m commandwhich - 查找可执行文件# 查找命令的完整路径 which command # 显示所有匹配的可执行文件 which -a command进程管理命令ps - 显示进程状态# 显示当前用户的进程 ps # 显示所有进程 ps -e 或 ps -A # 显示完整格式 ps -f # 显示所有进程的完整格式 ps -ef # 显示进程树 ps -ejH # 按CPU使用率排序 ps -aux --sort=-%cpu # 按内存使用率排序 ps -aux --sort=-%memtop - 动态显示进程信息# 启动top top # 按CPU排序(默认) top 然后按P # 按内存排序 top 然后按M # 按运行时间排序 top 然后按T # 只显示特定用户的进程 top -u username # 更新间隔(秒) top -d 2htop - 增强版top# 启动htop htop # 常用快捷键: # F2: 设置 # F3: 搜索 # F4: 过滤 # F5: 树状视图 # F6: 排序 # F9: 杀进程kill - 终止进程# 通过PID终止进程 kill PID # 强制终止 kill -9 PID # 终止多个进程 kill PID1 PID2 PID3 # 发送特定信号 kill -SIGTERM PIDkillall - 按名称终止进程# 终止所有指定名称的进程 killall process_name # 强制终止 killall -9 process_name # 交互式确认 killall -i process_namepkill - 按名称和其他条件终止进程# 按名称终止进程 pkill process_name # 按用户终止进程 pkill -u username # 发送特定信号 pkill -SIGTERM process_namenice - 以指定优先级运行程序# 以较低优先级运行命令 nice -n 10 command # 以较高优先级运行命令(需要root权限) nice -n -10 commandrenice - 修改运行中进程的优先级# 修改进程优先级 renice 10 -p PID # 修改用户所有进程的优先级 renice 10 -u usernamenohup - 忽略挂起信号运行命令# 后台运行命令，忽略挂起信号 nohup command & # 指定输出文件 nohup command > output.log 2>&1 &磁盘管理命令df - 显示磁盘空间使用情况# 显示所有文件系统 df # 使用人类可读格式 df -h # 显示文件系统类型 df -T # 只显示特定类型的文件系统 df -t ext4du - 显示目录或文件大小# 显示目录大小 du directory # 使用人类可读格式 du -h directory # 显示总计 du -s directory # 按大小排序 du -h --max-depth=1 | sort -hr # 只显示指定深度 du -h --max-depth=2 directoryfdisk - 磁盘分区工具# 列出分区表 fdisk -l # 操作特定设备 fdisk /dev/sdamount - 挂载文件系统# 显示已挂载的文件系统 mount # 挂载设备到目录 mount /dev/sda1 /mnt/disk # 指定文件系统类型 mount -t ext4 /dev/sda1 /mnt/disk # 以只读方式挂载 mount -o ro /dev/sda1 /mnt/diskumount - 卸载文件系统# 卸载文件系统 umount /mnt/disk # 强制卸载 umount -f /mnt/disk # 懒惰卸载(等待设备不再忙) umount -l /mnt/diskfsck - 检查和修复文件系统# 检查文件系统 fsck /dev/sda1 # 自动修复错误 fsck -a /dev/sda1 # 强制检查 fsck -f /dev/sda1 # 显示进度 fsck -C /dev/sda1 # 检查特定类型的文件系统 fsck -t ext4 /dev/sda1lsblk - 列出块设备# 列出所有块设备 lsblk # 显示完整设备路径 lsblk -p # 显示文件系统信息 lsblk -f # 以字节为单位显示大小 lsblk -bmkfs - 创建文件系统# 创建ext4文件系统 mkfs -t ext4 /dev/sda1 # 或使用特定命令 mkfs.ext4 /dev/sda1 # 创建带标签的文件系统 mkfs.ext4 -L "LABEL" /dev/sda1 # 检查坏块并创建文件系统 mkfs.ext4 -c /dev/sda1parted - 磁盘分区工具# 列出分区表 parted -l # 打开特定设备 parted /dev/sda # 常用parted命令: # print - 显示分区表 # mklabel gpt - 创建GPT分区表 # mkpart primary ext4 1MiB 100% - 创建分区 # rm 1 - 删除分区1 # quit - 退出badblocks - 检查坏块# 检查设备坏块 badblocks /dev/sda1 # 详细输出 badblocks -v /dev/sda1 # 非破坏性读写测试(危险操作) badblocks -w /dev/sda1文本处理命令grep - 搜索文本# 在文件中搜索模式 grep "pattern" filename # 递归搜索目录 grep -r "pattern" directory/ # 显示行号 grep -n "pattern" filename # 忽略大小写 grep -i "pattern" filename # 使用正则表达式 grep -E "pattern1|pattern2" filename # 显示匹配行的上下文 grep -A 2 -B 2 "pattern" filename # 显示匹配行的前2行和后2行sed - 流编辑器# 替换文本 sed 's/old/new/' filename # 全局替换 sed 's/old/new/g' filename # 直接修改文件 sed -i 's/old/new/g' filename # 删除行 sed '5d' filename # 删除第5行 sed '5,10d' filename # 删除第5-10行 sed '/pattern/d' filename # 删除匹配pattern的行 # 插入和追加 sed '5i\new line' filename # 在第5行前插入 sed '5a\new line' filename # 在第5行后追加 # 打印特定行 sed -n '5,10p' filename # 只打印第5-10行awk - 文本处理语言# 打印特定列 awk '{print $1}' filename # 打印第一列 awk '{print $1, $3}' filename # 打印第一列和第三列 # 使用自定义分隔符 awk -F: '{print $1}' /etc/passwd # 条件处理 awk '$3 > 100 {print $1}' filename # 打印第三列大于100的行的第一列 # 内置变量 awk '{print NR, $0}' filename # 打印行号和整行 awk 'END {print NR}' filename # 打印总行数 # 计算总和 awk '{sum += $1} END {print sum}' filenamesort - 排序文本# 基本排序 sort filename # 数字排序 sort -n filename # 反向排序 sort -r filename # 按特定列排序 sort -k 2 filename # 按第二列排序 # 忽略大小写 sort -f filename # 删除重复行 sort -u filename # 检查文件是否已排序 sort -c filenameuniq - 报告或忽略重复行# 删除重复行(输入必须已排序) uniq filename # 只显示重复行 uniq -d filename # 只显示不重复的行 uniq -u filename # 计算重复次数 uniq -c filenamecut - 提取文件的列# 提取特定字符 cut -c 1-5 filename # 提取每行的前5个字符 # 使用分隔符提取字段 cut -d: -f1 /etc/passwd # 提取以冒号分隔的第一个字段 # 提取多个字段 cut -d: -f1,3,5 /etc/passwdtr - 转换或删除字符# 转换字符 echo "hello" | tr 'a-z' 'A-Z' # 小写转大写 # 删除字符 echo "hello" | tr -d 'l' # 删除所有'l' # 压缩重复字符 echo "hello world" | tr -s ' ' # 压缩空格wc - 计算行数、单词数和字符数# 计算行数、单词数和字符数 wc filename # 只计算行数 wc -l filename # 只计算单词数 wc -w filename # 只计算字符数 wc -c filenamediff - 比较文件# 比较两个文件 diff file1 file2 # 忽略空白 diff -w file1 file2 # 并排显示差异 diff -y file1 file2 # 统一格式输出 diff -u file1 file2 # 递归比较目录 diff -r dir1 dir2patch - 应用diff文件# 应用patch patch file < patchfile # 反向应用patch patch -R file < patchfile # 应用到目录 patch -p1 < patchfileShell编程常用命令echo - 显示文本# 显示文本 echo "Hello World" # 不换行 echo -n "Hello " # 解释转义字符 echo -e "Hello\nWorld"printf - 格式化输出# 基本格式化 printf "Name: %s, Age: %d\n" "John" 25 # 格式化数字 printf "%.2f\n" 3.14159read - 读取用户输入# 基本读取 read var echo "You entered: $var" # 提示信息 read -p "Enter your name: " name # 设置超时 read -t 5 -p "Enter input within 5 seconds: " var # 不显示输入(用于密码) read -s -p "Password: " passwordif - 条件语句# 基本if语句 if [ "$a" = "$b" ]; then echo "a equals b" fi # if-else语句 if [ "$a" = "$b" ]; then echo "a equals b" else echo "a does not equal b" fi # if-elif-else语句 if [ "$a" = "$b" ]; then echo "a equals b" elif [ "$a" = "$c" ]; then echo "a equals c" else echo "a equals neither b nor c" fifor - 循环# 基本for循环 for i in 1 2 3 4 5; do echo "Number: $i" done # 范围循环 for i in {1..5}; do echo "Number: $i" done # 步进循环 for i in {1..10..2}; do echo "Odd number: $i" done # C风格循环 for ((i=1; i<=5; i++)); do echo "Number: $i" done # 遍历文件 for file in *.txt; do echo "Processing $file" donewhile - 循环# 基本while循环 count=1 while [ $count -le 5 ]; do echo "Count: $count" ((count++)) done # 读取文件每一行 while read line; do echo "Line: $line" done < filenamecase - 多条件分支# 基本case语句 case "$var" in "option1") echo "Option 1 selected" ;; "option2"|"option3") echo "Option 2 or 3 selected" ;; *) echo "Unknown option" ;; esacfunction - 函数定义# 定义函数 function greet { echo "Hello, $1!" } # 调用函数 greet "World" # 返回值 function add { local result=$(($1 + $2)) echo $result } sum=$(add 5 3) echo "Sum: $sum"export - 导出环境变量# 导出变量 export VAR="value" # 导出函数 export -f function_namesource - 执行脚本# 在当前shell执行脚本 source script.sh # 简写形式 . script.shtest - 条件测试# 文件测试 test -f file # 文件存在且是普通文件 test -d dir # 目录存在 test -r file # 文件可读 test -w file # 文件可写 test -x file # 文件可执行 # 字符串测试 test -z "$var" # 字符串长度为0 test -n "$var" # 字符串长度不为0 test "$a" = "$b" # 字符串相等 test "$a" != "$b" # 字符串不相等 # 数值比较 test $a -eq $b # 相等 test $a -ne $b # 不相等 test $a -lt $b # 小于 test $a -le $b # 小于等于 test $a -gt $b # 大于 test $a -ge $b # 大于等于expr - 表达式求值# 算术运算 result=$(expr 5 + 3) echo $result # 字符串长度 length=$(exprShell编程常用命令(续)expr - 表达式求值(续)# 算术运算 result=$(expr 5 + 3) echo $result # 字符串长度 length=$(expr length "string") echo $length # 子字符串 substr=$(expr substr "string" 2 3) # 从位置2开始的3个字符 echo $substrlet - 算术运算# 基本运算 let a=5+3 echo $a # 自增/自减 let a++ let b-- # 复合赋值 let "a += 5" let "b *= 2"trap - 捕获信号# 捕获Ctrl+C (SIGINT) trap "echo 'Ctrl+C pressed'; exit" SIGINT # 清除trap trap - SIGINT # 在脚本退出时执行清理 trap "echo 'Cleaning up...'; rm -f temp_file" EXITgetopts - 处理命令行选项# 处理选项 while getopts "a:bc" opt; do case $opt in a) echo "Option -a with value $OPTARG" ;; b) echo "Option -b" ;; c) echo "Option -c" ;; \?) echo "Invalid option: -$OPTARG" ;; esac doneshift - 移动位置参数# 移动位置参数 echo "Original parameters: $@" shift echo "After shift: $@" # 移动多个位置参数 shift 2 echo "After shift 2: $@"网络命令ping - 测试网络连接# 基本ping ping example.com # 指定次数 ping -c 4 example.com # 指定间隔(秒) ping -i 2 example.com # 指定超时(秒) ping -W 2 example.com # 洪水ping(需要root权限) ping -f example.comtraceroute - 跟踪路由# 基本跟踪 traceroute example.com # 指定最大跳数 traceroute -m 15 example.com # 不解析IP地址 traceroute -n example.com # 指定协议(ICMP) traceroute -I example.comnetstat - 网络统计# 显示所有连接 netstat -a # 显示监听的端口 netstat -l # 显示TCP连接 netstat -t # 显示UDP连接 netstat -u # 显示进程信息 netstat -p # 不解析名称 netstat -n # 显示路由表 netstat -r # 常用组合 netstat -tuln # 显示所有监听的TCP和UDP端口，不解析 netstat -tulnp # 同上，并显示进程信息ss - 显示套接字统计# 显示所有连接 ss # 显示监听的端口 ss -l # 显示TCP连接 ss -t # 显示UDP连接 ss -u # 显示进程信息 ss -p # 不解析名称 ss -n # 常用组合 ss -tuln # 显示所有监听的TCP和UDP端口，不解析ip - 显示/操作路由、设备、策略路由和隧道# 显示所有网络接口 ip link show # 显示IP地址 ip addr show # 显示路由表 ip route show # 添加路由 ip route add 192.168.2.0/24 via 192.168.1.1 # 删除路由 ip route del 192.168.2.0/24 # 启用网络接口 ip link set eth0 up # 禁用网络接口 ip link set eth0 down # 设置IP地址 ip addr add 192.168.1.10/24 dev eth0 # 删除IP地址 ip addr del 192.168.1.10/24 dev eth0ifconfig - 配置网络接口(已过时，推荐使用ip命令)# 显示所有网络接口 ifconfig # 显示特定接口 ifconfig eth0 # 设置IP地址 ifconfig eth0 192.168.1.10 netmask 255.255.255.0 # 启用网络接口 ifconfig eth0 up # 禁用网络接口 ifconfig eth0 downwget - 非交互式网络下载器# 下载文件 wget https://example.com/file.zip # 指定输出文件名 wget -O output.zip https://example.com/file.zip # 后台下载 wget -b https://example.com/large-file.zip # 继续之前的下载 wget -c https://example.com/large-file.zip # 递归下载 wget -r https://example.com/ # 限制下载速度(KB/s) wget --limit-rate=100k https://example.com/file.zip # 设置重试次数 wget --tries=10 https://example.com/file.zipcurl - URL传输工具# 获取网页内容 curl https://example.com # 下载文件 curl -O https://example.com/file.zip # 指定输出文件名 curl -o output.zip https://example.com/file.zip # 显示响应头 curl -I https://example.com # 发送POST请求 curl -X POST -d "param1=value1&param2=value2" https://example.com/api # 发送JSON数据 curl -X POST -H "Content-Type: application/json" -d '{"key":"value"}' https://example.com/api # 使用基本认证 curl -u username:password https://example.com # 使用代理 curl -x proxy-server:port https://example.com # 跟随重定向 curl -L https://example.comssh - 安全Shell客户端# 连接到远程服务器 ssh username@hostname # 指定端口 ssh -p 2222 username@hostname # 使用密钥认证 ssh -i private_key.pem username@hostname # 执行远程命令 ssh username@hostname "ls -la" # 压缩传输 ssh -C username@hostname # 启用X11转发 ssh -X username@hostname # 本地端口转发 ssh -L local-port:remote-host:remote-port username@hostname # 远程端口转发 ssh -R remote-port:local-host:local-port username@hostnamescp - 安全复制# 从本地复制到远程 scp local-file username@hostname:/remote/directory # 从远程复制到本地 scp username@hostname:/remote/file local-directory # 复制目录 scp -r local-directory username@hostname:/remote/directory # 指定端口 scp -P 2222 local-file username@hostname:/remote/directory # 保持文件属性 scp -p local-file username@hostname:/remote/directory # 限制带宽(KB/s) scp -l 1000 local-file username@hostname:/remote/directoryrsync - 远程同步# 同步本地目录到远程 rsync -av source-directory/ username@hostname:/remote/directory # 同步远程目录到本地 rsync -av username@hostname:/remote/directory/ local-directory # 删除目标中不存在于源的文件 rsync -av --delete source-directory/ username@hostname:/remote/directory # 只同步差异部分 rsync -av --update source-directory/ username@hostname:/remote/directory # 排除特定文件 rsync -av --exclude='*.log' source-directory/ username@hostname:/remote/directory # 限制带宽(KB/s) rsync -av --bwlimit=1000 source-directory/ username@hostname:/remote/directory # 使用SSH指定端口 rsync -av -e "ssh -p 2222" source-directory/ username@hostname:/remote/directorync (netcat) - 网络工具# 连接到服务器 nc hostname port # 监听端口 nc -l port # 端口扫描 nc -z -v hostname 20-30 # 传输文件(接收端) nc -l 1234 > received_file # 传输文件(发送端) nc hostname 1234 < file_to_send # 创建简单的聊天服务器 nc -l 1234 # 连接到聊天服务器 nc hostname 1234dig - DNS查询工具# 查询A记录 dig example.com # 查询特定类型记录 dig example.com MX dig example.com NS # 使用特定DNS服务器 dig @8.8.8.8 example.com # 简短输出 dig +short example.com # 跟踪DNS查询 dig +trace example.com # 反向查询 dig -x 8.8.8.8nslookup - 查询DNS记录# 交互模式 nslookup # 查询A记录 nslookup example.com # 查询特定类型记录 nslookup -type=MX example.com # 使用特定DNS服务器 nslookup example.com 8.8.8.8 # 反向查询 nslookup 8.8.8.8host - DNS查询工具# 基本查询 host example.com # 查询特定类型记录 host -t MX example.com # 详细输出 host -v example.com # 反向查询 host 8.8.8.8iptables - 配置Linux防火墙# 查看规则 iptables -L # 查看规则(带行号) iptables -L --line-numbers # 允许端口 iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 阻止IP地址 iptables -A INPUT -s 192.168.1.10 -j DROP # 允许已建立的连接 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 保存规则 iptables-save > /etc/iptables/rules.v4 # 恢复规则 iptables-restore < /etc/iptables/rules.v4tcpdump - 网络数据包分析器# 捕获特定接口的数据包 tcpdump -i eth0 # 捕获特定主机的数据包 tcpdump host 192.168.1.1 # 捕获特定端口的数据包 tcpdump port 80 # 捕获特定协议的数据包 tcpdump tcp # 保存捕获的数据包到文件 tcpdump -w capture.pcap # 读取捕获文件 tcpdump -r capture.pcap# 显示详细信息 tcpdump -v # 显示数据包内容 tcpdump -X # 不解析主机名 tcpdump -n # 组合过滤器 tcpdump 'tcp port 80 and host 192.168.1.1' # 限制捕获数量 tcpdump -c 100 # 显示时间戳 tcpdump -ttttnmap - 网络扫描器# 扫描主机 nmap 192.168.1.1 # 扫描网络 nmap 192.168.1.0/24 # 扫描特定端口 nmap -p 80,443 192.168.1.1 # 扫描所有端口 nmap -p- 192.168.1.1 # 操作系统检测 nmap -O 192.168.1.1 # 服务版本检测 nmap -sV 192.168.1.1 # 综合扫描 nmap -A 192.168.1.1 # 快速扫描 nmap -F 192.168.1.1 # 隐蔽扫描 nmap -sS 192.168.1.1telnet - 远程登录# 连接到服务器 telnet hostname port # 测试端口是否开放 telnet hostname 80ftp - 文件传输协议客户端# 连接到FTP服务器 ftp hostname # 匿名登录 ftp -a hostname # 下载文件 get remote-file [local-file] # 上传文件 put local-file [remote-file] # 下载多个文件 mget *.txt # 上传多个文件 mput *.txt # 切换到二进制模式 binary # 切换到ASCII模式 ascii # 列出远程目录 lssftp - 安全文件传输协议# 连接到服务器 sftp username@hostname # 指定端口 sftp -P 2222 username@hostname # 下载文件 get remote-file [local-file] # 上传文件 put local-file [remote-file] # 下载目录 get -r remote-directory # 上传目录 put -r local-directory # 列出远程目录 ls系统监控和性能分析top - 实时系统监控# 基本使用 top # 批处理模式(非交互) top -b -n 1 # 显示特定用户的进程 top -u username # 按CPU排序(默认) top -o %CPU # 按内存排序 top -o %MEM # 显示完整命令 top -c # 交互命令: # P - 按CPU排序 # M - 按内存排序 # k - 杀死进程 # r - 调整优先级 # q - 退出htop - 增强版top# 基本使用 htop # 显示树状视图 htop -t # 显示特定用户的进程 htop -u username # 按CPU排序 htop --sort-key CPU # 按内存排序 htop --sort-key MEMvmstat - 虚拟内存统计# 显示内存使用情况 vmstat # 每2秒更新一次，共5次 vmstat 2 5 # 显示详细内存统计 vmstat -s # 显示磁盘统计 vmstat -d # 显示事件计数器 vmstat -aiostat - 输入/输出统计# 显示CPU和设备统计 iostat # 每2秒更新一次，共5次 iostat 2 5 # 显示扩展统计 iostat -x # 只显示设备统计 iostat -d # 显示NFS统计 iostat -nmpstat - 多处理器统计# 显示所有CPU统计 mpstat # 每2秒更新一次，共5次 mpstat 2 5 # 显示特定CPU统计 mpstat -P 0 # CPU 0 mpstat -P ALL # 所有CPUsar - 系统活动报告# 显示CPU使用情况 sar # 每2秒更新一次，共5次 sar 2 5 # 显示内存使用情况 sar -r # 显示磁盘I/O统计 sar -d # 显示网络统计 sar -n DEV # 显示特定时间的历史数据 sar -s 10:00:00 -e 11:00:00 # 显示指定日期的数据 sar -f /var/log/sa/sa20 # 20日的数据free - 显示内存使用情况# 显示内存使用情况 free # 以MB为单位显示 free -m # 以GB为单位显示 free -g # 以人类可读方式显示 free -h # 每2秒更新一次，共5次 free -s 2 -c 5 # 显示总计行 free -tdstat - 系统资源统计# 基本使用 dstat # 显示CPU、磁盘、网络、分页和系统统计 dstat -cdnpm # 每2秒更新一次，共5次 dstat 2 5 # 显示最高资源消耗的进程 dstat --top-cpu --top-mem # 显示磁盘使用情况 dstat -d # 显示网络使用情况 dstat -nnmon - 系统监控# 交互模式 nmon # 收集数据模式 nmon -f -s 2 -c 30 # 每2秒收集一次，共30次 # 交互命令: # c - CPU统计 # m - 内存统计 # d - 磁盘统计 # n - 网络统计 # t - 进程统计 # q - 退出strace - 跟踪系统调用# 跟踪命令的系统调用 strace ls # 跟踪特定进程 strace -p PID # 跟踪特定系统调用 strace -e open ls # 显示时间戳 strace -t ls # 统计系统调用 strace -c ls # 输出到文件 strace -o output.txt lsltrace - 跟踪库调用# 跟踪命令的库调用 ltrace ls # 跟踪特定进程 ltrace -p PID # 显示时间戳 ltrace -t ls # 统计库调用 ltrace -c ls # 输出到文件 ltrace -o output.txt lslsof - 列出打开的文件# 列出所有打开的文件 lsof # 列出特定用户打开的文件 lsof -u username # 列出特定进程打开的文件 lsof -p PID # 列出特定文件的进程 lsof /path/to/file # 列出监听的网络连接 lsof -i # 列出特定端口的连接 lsof -i :80 # 列出TCP连接 lsof -i tcp # 列出UDP连接 lsof -i udpperf - 性能分析工具# 列出可用事件 perf list # 记录性能数据 perf record -a sleep 10 # 分析记录的数据 perf report # 实时统计 perf stat ls # CPU性能计数器 perf stat -e cycles,instructions,cache-misses ls # 跟踪特定进程 perf record -p PID sleep 10sysctl - 配置内核参数# 显示所有内核参数 sysctl -a # 显示特定参数 sysctl vm.swappiness # 设置参数 sysctl -w vm.swappiness=10 # 从文件加载设置 sysctl -p /etc/sysctl.confulimit - 控制shell资源# 显示所有限制 ulimit -a # 设置文件大小限制(KB) ulimit -f 1000 # 设置最大进程数 ulimit -u 100 # 设置最大打开文件数 ulimit -n 1024 # 设置核心转储文件大小(KB) ulimit -c 1000 # 设置无限制 ulimit -c unlimitednice - 以指定优先级运行程序# 以较低优先级运行 nice command # 指定优先级(-20到19，越低优先级越高) nice -n 10 command # 以较高优先级运行(需要root权限) nice -n -10 commandrenice - 改变运行中进程的优先级# 改变进程优先级 renice 10 -p PID # 改变用户所有进程的优先级 renice 10 -u username # 改变进程组的优先级 renice 10 -g pgrp用户和权限管理useradd - 创建新用户# 创建基本用户 useradd username # 指定主目录 useradd -d /home/custom username # 指定shell useradd -s /bin/bash username # 指定UID useradd -u 1001 username # 指定组 useradd -g groupname username # 添加到附加组 useradd -G group1,group2 username # 创建主目录 useradd -m username # 创建系统用户 useradd -r usernameusermod - 修改用户账户# 修改用户名 usermod -l newname oldname # 修改主目录 usermod -d /new/home username # 修改shell usermod -s /bin/zsh username # 修改UID usermod -u 1002 username # 修改主组 usermod -g groupname username # 添加到附加组 usermod -a -G group1,group2 username # 锁定账户 usermod -L username # 解锁账户 usermod -U usernameuserdel - 删除用户# 删除用户 userdel username # 删除用户及主目录 userdel -r username用户和权限管理passwd - 修改用户密码# 修改指定用户密码 passwd username # 删除用户密码 passwd -d username # 锁定用户密码 passwd -l username # 解锁用户密码 passwd -u username # 设置密码过期 passwd -e username # 显示状态信息 passwd -S usernamechage - 修改用户密码过期信息# 显示用户密码过期信息 chage -l username # 设置密码最大有效期(天) chage -M 90 username # 设置密码最小有效期(天) chage -m 7 username # 设置密码过期前警告天数 chage -W 7 username # 设置密码过期后的宽限期(天) chage -I 7 username # 设置账户过期日期 chage -E 2023-12-31 username # 强制用户下次登录时修改密码 chage -d 0 usernamegroupadd - 创建新组# 创建基本组 groupadd groupname # 指定GID groupadd -g 1001 groupname # 创建系统组 groupadd -r groupnamegroupmod - 修改组# 修改组名 groupmod -n newname oldname # 修改GID groupmod -g 1002 groupnamegroupdel - 删除组# 删除组 groupdel groupnamegpasswd - 管理组成员和密码# 添加用户到组 gpasswd -a username groupname # 从组中删除用户 gpasswd -d username groupname # 设置组管理员 gpasswd -A username groupname # 设置组密码 gpasswd groupnameid - 显示用户ID和组ID# 显示当前用户信息 id # 显示指定用户信息 id username # 只显示UID id -u username # 只显示主GID id -g username # 显示所有组ID id -G username # 显示名称而非ID id -n usernamegroups - 显示用户所属组# 显示当前用户所属组 groups # 显示指定用户所属组 groups usernamesu - 切换用户# 切换到root su # 切换到指定用户 su username # 使用登录shell切换 su - username # 以其他用户执行命令 su username -c 'command' # 保留环境变量切换 su -p usernamesudo - 以其他用户身份执行命令# 以root身份执行命令 sudo command # 以指定用户身份执行命令 sudo -u username command # 切换到root shell sudo -i # 切换到指定用户shell sudo -i -u username # 编辑sudoers文件 sudo visudo # 显示sudo权限 sudo -l # 保留环境变量 sudo -E commandchmod - 修改文件权限# 符号模式 chmod u+x file # 给所有者添加执行权限 chmod g-w file # 移除组写权限 chmod o=r file # 设置其他用户只读权限 chmod a+r file # 给所有人添加读权限 # 数字模式 chmod 755 file # rwxr-xr-x chmod 644 file # rw-r--r-- chmod 700 file # rwx------ # 递归修改 chmod -R 755 directory # 保留目录权限模式 chmod -R u+rw,go-w directory # 设置SUID权限 chmod u+s file # 4755 # 设置SGID权限 chmod g+s directory # 2755 # 设置粘滞位 chmod +t directory # 1777chown - 修改文件所有者和组# 修改所有者 chown username file # 修改所有者和组 chown username:groupname file # 只修改组 chown :groupname file # 递归修改 chown -R username:groupname directory # 修改符号链接本身(而非目标) chown -h username symlink # 保留引用文件的所有者和组 chown --reference=ref_file filechgrp - 修改文件组# 修改组 chgrp groupname file # 递归修改 chgrp -R groupname directory # 修改符号链接本身(而非目标) chgrp -h groupname symlink # 保留引用文件的组 chgrp --reference=ref_file fileumask - 设置默认权限掩码# 显示当前umask umask # 设置umask(数字模式) umask 022 # 目录权限755，文件权限644 # 设置umask(符号模式) umask u=rwx,g=rx,o=rx # 显示创建的权限 umask -S系统管理systemctl - 控制systemd系统和服务管理器# 启动服务 systemctl start service # 停止服务 systemctl stop service # 重启服务 systemctl restart service # 重新加载配置 systemctl reload service # 启用服务(开机自启) systemctl enable service # 禁用服务(开机不启动) systemctl disable service # 查看服务状态 systemctl status service # 列出所有服务 systemctl list-units --type=service # 列出所有失败的服务 systemctl list-units --failed # 查看系统启动时间 systemctl --version # 电源管理 systemctl poweroff # 关机 systemctl reboot # 重启 systemctl suspend # 挂起 systemctl hibernate # 休眠service - 运行System V初始化脚本# 启动服务 service service_name start # 停止服务 service service_name stop # 重启服务 service service_name restart # 查看状态 service service_name status # 列出所有服务 service --status-allchkconfig - 更新和查询运行级别信息# 列出所有服务 chkconfig --list # 添加服务 chkconfig --add service_name # 删除服务 chkconfig --del service_name # 启用服务 chkconfig service_name on # 禁用服务 chkconfig service_name off # 设置特定运行级别 chkconfig --level 35 service_name onshutdown - 关闭系统# 立即关机 shutdown -h now # 定时关机 shutdown -h +10 # 10分钟后关机 # 取消关机 shutdown -c # 立即重启 shutdown -r now # 指定时间重启 shutdown -r 23:00reboot - 重启系统# 重启系统 reboot # 强制重启 reboot -fpoweroff - 关闭系统# 关闭系统 poweroff # 强制关闭 poweroff -fhalt - 停止系统# 停止系统 halt # 强制停止 halt -finit - 改变运行级别# 切换到单用户模式 init 1 # 切换到多用户模式 init 3 # 切换到图形界面 init 5 # 重启 init 6 # 关机 init 0crontab - 计划任务# 编辑当前用户的crontab crontab -e # 列出当前用户的crontab crontab -l # 编辑指定用户的crontab crontab -u username -e # 删除当前用户的crontab crontab -r # 删除指定用户的crontab crontab -u username -r # crontab格式: # 分 时 日 月 周 命令 # * * * * * command # 0 2 * * * /path/to/script # 每天2:00执行 # */5 * * * * command # 每5分钟执行一次 # 0 9-17 * * 1-5 command # 工作日9点到17点整点执行at - 在指定时间执行命令# 指定时间执行 at 2:00 tomorrow command [Ctrl+D] # 列出等待的作业 atq # 删除作业 atrm job_numberdmesg - 显示内核环形缓冲区信息# 显示所有信息 dmesg # 实时显示 dmesg -w # 显示人类可读时间戳 dmesg -T # 清除缓冲区 dmesg -c # 按级别过滤 dmesg --level=err,warn # 搜索特定内容 dmesg | grep "USB"journalctl - 查询systemd日志# 显示所有日志 journalctl # 显示内核消息 journalctl -k # 显示特定服务的日志 journalctl -u service_name # 显示特定进程的日志 journalctl _PID=1234 # 显示特定时间段的日志 journalctl --since="2023-01-01" --until="2023-01-02" # 显示最近的日志 journalctl -n 100 # 实时跟踪 journalctl -f # 按优先级过滤 journalctl -p errlogrotate - 日志轮转# 手动运行 logrotate /etc/logrotate.conf # 调试模式 logrotate -d /etc/logrotate.conf # 强制轮转 logrotate -f /etc/logrotate.conf # 轮转特定配置 logrotate /etc/logrotate.d/specific_configlogger - 向系统日志添加条目# 添加日志消息 logger "Test message" # 指定标签 logger -t TAG "Test message" # 指定优先级 logger -p local0.info "Test message" # 指定ID logger -i "Test message"hostnamectl - 控制系统主机名# 显示主机名信息 hostnamectl # 设置主机名 hostnamectl set-hostname new-hostname # 设置特定主机名 hostnamectl set-hostname "pretty-hostname" --pretty hostnamectl set-hostname "static-hostname" --static hostnamectl set-hostname "transient-hostname" --transienttimedatectl - 控制系统时间和日期# 显示当前时间设置 timedatectl # 设置时间 timedatectl set-time "2023-01-01 12:00:00" # 设置时区 timedatectl set-timezone Asia/Shanghai # 列出可用时区 timedatectl list-timezones # 启用NTP同步 timedatectl set-ntp true # 禁用NTP同步 timedatectl set-ntp falselocalectl - 控制系统区域设置# 显示当前区域设置 localectl # 设置系统区域 localectl set-locale LANG=en_US.UTF-8 # 设置键盘布局 localectl set-keymap us # 列出可用键盘布局 localectl list-keymapsupdate-alternatives - 管理命令的符号链接# 显示特定命令的可选项 update-alternatives --display editor # 配置特定命令 update-alternatives --config editor # 安装新的可选项 update-alternatives --install /usr/bin/editor editor /usr/bin/vim 100 # 移除可选项 update-alternatives --remove editor /usr/bin/vim磁盘和文件系统管理df - 报告文件系统磁盘空间使用情况# 显示所有文件系统 df # 以人类可读格式显示 df -h # 以MB为单位显示 df -m # 显示特定文件系统类型 df -t ext4 # 显示inode使用情况 df -i # 显示文件系统类型 df -Tdu - 估计文件空间使用量# 显示目录大小 du /path/to/directory # 以人类可读格式显示 du -h /path/to/directory # 显示总计 du -s /path/to/directory # 显示总计(人类可读) du -sh /path/to/directory # 显示指定深度 du -h --max-depth=2 /path/to/directory # 按大小排序 du -h /path/to/directory | sort -hfdisk - 磁盘分区表操作工具# 列出分区表 fdisk -l # 操作特定设备 fdisk /dev/sda # 交互命令: # m - 显示帮助 # p - 显示分区表 # n - 创建新分区 # d - 删除分区 # t - 更改分区类型 # w - 写入分区表并退出 # q - 不保存退出parted - 磁盘分区工具# 列出分区表 parted -l # 操作特定设备 parted /dev/sda # 交互命令: # help - 显示帮助 # print - 显示分区表 # mklabel - 创建分区表类型 # mkpart - 创建分区 # rm - 删除分区 # quit - 退出mkfs - 创建文件系统# 创建ext4文件系统 mkfs.ext4 /dev/sda1 # 创建XFS文件系统 mkfs.xfs /dev/sda2 # 创建FAT32文件系统 mkfs.fat -F32 /dev/sda3 # 指定标签 mkfs.ext4 -L LABEL /dev/sda1 # 检查坏块 mkfs.ext4 -c /dev/sda1fsck - 检查和修复文件系统# 检查文件系统 fsck /dev/sda1 # 自动修复错误 fsck -a /dev/sda1 # 交互式修复 fsck -r /dev/sda1 # 强制检查 fsck -f /dev/sda1 # 检查特定类型 fsck.ext4 /dev/sda1mount - 挂载文件系统# 挂载设备 mount /dev/sda1 /mnt # 指定文件系统类型 mount -t ext4 /dev/sda1 /mnt # 只读挂载 mount -o ro /dev/sda1 /mnt # 读写挂载 mount -o rw /dev/sda1 /mnt # 挂载ISO镜像 mount -o loop file.iso /mnt # 显示已挂载的文件系统 mountumount - 卸载文件系统# 卸载设备 umount /dev/sda1 # 卸载挂载点 umount /mnt # 强制卸载 umount -f /mnt # 延迟卸载 umount -l /mntlsblk - 列出块设备# 列出所有块设备 lsblk # 显示详细信息 lsblk -a # 显示文件系统信息 lsblk -f # 以字节为单位显示大小 lsblk -b # 显示设备拓扑 lsblk -tblkid - 显示块设备属性# 显示所有块设备 blkid # 显示特定设备 blkid /dev/sda1 # 显示UUID blkid -s UUID /dev/sda1 # 显示标签 blkid -s LABEL /dev/sda1 # 显示类型 blkid -s TYPE /dev/sda1tune2fs - 调整ext文件系统参数# 显示文件系统信息 tune2fs -l /dev/sda1 # 设置最大挂载次数 tune2fs -c 30 /dev/sda1 # 设置检查间隔(天) tune2fs -i 30d /dev/sda1 # 设置标签 tune2fs -L LABEL /dev/sda1 # 启用日志 tune2fs -j /dev/sda1 # 设置保留块百分比 tune2fs -m 5 /dev/sda1e2fsck - 检查ext文件系统# 检查文件系统 e2fsck /dev/sda1 # 自动修复错误 e2fsck -p /dev/sda1 # 强制检查 e2fsck -f /dev/sda1 # 显示详细信息 e2fsck -v /dev/sda1 # 显示进度 e2fsck -C 0 /dev/sda1badblocks - 搜索坏块# 检查坏块(只读) badblocks /dev/sda1 # 非破坏性读写测试 badblocks -n /dev/sda1 # 破坏性写测试(危险!) badblocks -w /dev/sda1 # 显示详细信息 badblocks -v /dev/sda1 # 显示进度 badblocks -s /dev/sda1fstab - 文件系统表# 编辑文件系统表 nano /etc/fstab # 格式: # <file system> <mount point> <type> <options> <dump> <pass> # /dev/sda1 /boot ext4 defaults 0 2 # UUID=xxxx / ext4 defaults 0 1swapoff/swapon - 停用/启用交换空间# 启用交换分区 swapon /dev/sda2 # 启用交换文件 swapon /path/to/swapfile # 启用所有交换空间 swapon -a # 停用交换分区 swapoff /dev/sda2 # 停用所有交换空间 swapoff -a # 显示交换空间 swapon --showmkswap - 创建交换空间# 创建交换分区 mkswap /dev/sda2 # 创建交换文件 mkswap /path/to/swapfile # 设置标签 mkswap -L SWAP /dev/sda2LVM命令pvcreate - 创建物理卷# 创建物理卷 pvcreate /dev/sda3 # 创建多个物理卷 pvcreate /dev/sda3 /dev/sdb1 # 强制创建 pvcreate -f /dev/sda3pvdisplay - 显示物理卷信息# 显示所有物理卷 pvdisplay # 显示特定物理卷 pvdisplay /dev/sda3 # 简短格式 pvdisplay -svgcreate - 创建卷组# 创建卷组 vgcreate vg_name /dev/sda3 # 创建使用多个物理卷的卷组 vgcreate vg_name /dev/sda3 /dev/sdb1 # 指定PE大小 vgcreate -s 16M vg_name /dev/sda3vgdisplay - 显示卷组信息# 显示所有卷组 vgdisplay # 显示特定卷组 vgdisplay vg_name # 简短格式 vgdisplay -slvcreate - 创建逻辑卷# 创建逻辑卷(大小为10GB) lvcreate -L 10G -n lv_name vg_name # 创建使用卷组百分比的逻辑卷 lvcreate -l 80%VG -n lv_name vg_name # 创建使用剩余空间的逻辑卷 lvcreate -l 100%FREE -n lv_name vg_namelvdisplay - 显示逻辑卷信息# 显示所有逻辑卷 lvdisplay # 显示特定逻辑卷 lvdisplay /dev/vg_name/lv_name # 简短格式 lvdisplay -s网络管理ip - 显示/操作路由、设备、策略路由和隧道# 显示所有网络接口 ip link show # 显示IP地址 ip addr show # 显示路由表 ip route show # 启用网络接口 ip link set dev eth0 up # 禁用网络接口 ip link set dev eth0 down # 添加IP地址 ip addr add 192.168.1.10/24 dev eth0 # 删除IP地址 ip addr del 192.168.1.10/24 dev eth0 # 添加默认路由 ip route add default via 192.168.1.1 # 添加静态路由 ip route add 10.0.0.0/24 via 192.168.1.254 # 删除路由 ip route del 10.0.0.0/24 # 显示ARP表 ip neigh showifconfig - 配置网络接口(传统命令)# 显示所有网络接口 ifconfig # 显示特定接口 ifconfig eth0 # 设置IP地址 ifconfig eth0 192.168.1.10 netmask 255.255.255.0 # 启用接口 ifconfig eth0 up # 禁用接口 ifconfig eth0 down # 设置MTU ifconfig eth0 mtu 1500route - 显示/操作IP路由表(传统命令)# 显示路由表 route # 添加默认网关 route add default gw 192.168.1.1 # 添加静态路由 route add -net 10.0.0.0/24 gw 192.168.1.254 # 删除路由 route del -net 10.0.0.0/24netstat - 网络连接、路由表和接口统计# 显示所有连接 netstat -a # 显示监听端口 netstat -l # 显示进程信息 netstat -p # 显示路由表 netstat -r # 显示接口统计 netstat -i # 不解析主机名 netstat -n # 持续显示 netstat -c # 显示TCP连接 netstat -t # 显示UDP连接 netstat -u # 显示UNIX套接字 netstat -x # 显示所有TCP和UDP端口号 netstat -at -au # 显示统计信息 netstat -s # 显示特定协议统计 netstat -s --tcp # 显示内核路由信息 netstat -rnss - 显示套接字统计# 显示所有连接 ss # 显示监听端口 ss -l # 显示进程信息 ss -p # 显示TCP连接 ss -t # 显示UDP连接 ss -u # 不解析服务名 ss -n # 显示详细信息 ss -v # 显示内部TCP信息 ss -i # 显示内存使用 ss -mping - 测试网络连接# 发送ICMP请求 ping example.com # 指定次数 ping -c 4 example.com # 指定间隔(秒) ping -i 2 example.com # 指定超时(秒) ping -W 2 example.com # 指定包大小 ping -s 1000 example.com # 洪水ping(需要root权限) ping -f example.comtraceroute - 显示到目标的路由路径# 跟踪路由 traceroute example.com # 指定最大跳数 traceroute -m 20 example.com # 不解析主机名 traceroute -n example.com # 使用TCP traceroute -T example.com # 使用UDP traceroute -U example.com # 指定源接口 traceroute -i eth0 example.com # 指定源IP traceroute -s 192.168.1.10 example.comnslookup - 查询DNS记录# 查询A记录 nslookup example.com # 查询特定记录类型 nslookup -type=MX example.com # 使用特定DNS服务器 nslookup example.com 8.8.8.8 # 交互模式 nslookup > server 8.8.8.8 > example.com > set type=MX > example.com > exitdig - DNS查询工具# 查询A记录 dig example.com # 查询特定记录类型 dig example.com MX # 使用特定DNS服务器 dig @8.8.8.8 example.com # 简短输出 dig +short example.com # 跟踪DNS解析 dig +trace example.com # 反向查询 dig -x 8.8.8.8 # 显示DNSSEC信息 dig +dnssec example.comhost - DNS查询工具# 查询主机 host example.com # 查询特定记录类型 host -t MX example.com # 使用特定DNS服务器 host example.com 8.8.8.8 # 详细输出 host -v example.com # 反向查询 host 8.8.8.8hostname - 显示或设置系统主机名# 显示主机名 hostname # 设置主机名(临时) hostname new-hostname # 显示FQDN hostname -f # 显示IP地址 hostname -i # 显示所有IP地址 hostname -Ihostnamectl - 控制系统主机名# 显示主机名信息 hostnamectl # 设置主机名(永久) hostnamectl set-hostname new-hostname # 设置静态主机名 hostnamectl set-hostname "New Host" --static # 设置瞬态主机名 hostnamectl set-hostname "new-host" --transient # 设置漂亮主机名 hostnamectl set-hostname "New Host" --prettynmcli - NetworkManager命令行工具# 显示所有连接 nmcli connection show # 显示活动连接 nmcli connection show --active # 启用连接 nmcli connection up "Wired connection 1" # 禁用连接 nmcli connection down "Wired connection 1" # 显示设备 nmcli device status # 连接WiFi nmcli device wifi connect SSID password PASSWORD # 显示WiFi列表 nmcli device wifi list # 创建新连接 nmcli connection add type ethernet ifname eth0 con-name "My Connection" # 修改连接 nmcli connection modify "My Connection" ipv4.method manual ipv4.addresses 192.168.1.10/24 ipv4.gateway 192.168.1.1 ipv4.dns "8.8.8.8,8.8.4.4"firewall-cmd - firewalld防火墙管理# 显示状态 firewall-cmd --state # 重新加载规则 firewall-cmd --reload # 列出所有区域 firewall-cmd --list-all-zones # 列出默认区域 firewall-cmd --list-all # 列出特定区域 firewall-cmd --zone=public --list-all # 添加服务 firewall-cmd --zone=public --add-service=http # 永久添加服务 firewall-cmd --zone=public --add-service=http --permanent # 添加端口 firewall-cmd --zone=public --add-port=8080/tcp # 移除服务 firewall-cmd --zone=public --remove-service=http # 设置默认区域 firewall-cmd --set-default-zone=publiciptables - 管理IPv4数据包过滤规则# 列出规则 iptables -L # 带行号列出规则 iptables -L --line-numbers # 列出NAT表规则 iptables -t nat -L # 添加允许规则 iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 添加拒绝规则 iptables -A INPUT -p tcp --dport 23 -j DROP # 删除规则(按行号) iptables -D INPUT 3 # 清空规则链 iptables -F INPUT # 设置默认策略 iptables -P INPUT DROP # 允许已建立连接 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 保存规则 iptables-save > /etc/iptables/rules.v4netcat (nc) - 网络工具# 连接到服务器 nc example.com 80 # 监听端口 nc -l 8080 # 端口扫描 nc -zv example.com 20-30 # 文件传输(接收端) nc -l 8080 > received_file # 文件传输(发送端) nc example.com 8080 < file_to_send # UDP模式 nc -u example.com 53 # 持久监听 nc -lk 8080 # 指定超时 nc -w 10 example.com 80curl - 传输URL数据# 获取网页 curl http://example.com # 保存到文件 curl -o file.html http://example.com # 下载文件(使用远程名称) curl -O http://example.com/file.zip # 跟随重定向 curl -L http://example.com # 显示响应头 curl -I http://example.com # 发送POST请求 curl -X POST -d "name=value" http://example.com # 发送JSON数据 curl -X POST -H "Content-Type: application/json" -d '{"key":"value"}' http://example.com # 使用基本认证 curl -u username:password http://example.com # 上传文件 curl -F "file=@localfile.jpg" http://example.com/upload # 使用代理 curl -x proxy.example.com:8080 http://example.comwget - 网络下载器# 下载文件 wget http://example.com/file.zip # 指定输出文件名 wget -O output.zip http://example.com/file.zip # 后台下载 wget -b http://example.com/file.zip # 继续下载 wget -c http://example.com/file.zip # 镜像网站 wget -m http://example.com # 递归下载 wget -r http://example.com # 限制深度 wget -r -l 2 http://example.com # 限制速度 wget --limit-rate=200k http://example.com/file.zip # 使用基本认证 wget --http-user=username --http-password=password http://example.com系统监控和性能分析top - 实时系统监控# 启动top top # 批处理模式 top -b -n 1 # 监控特定用户 top -u username # 监控特定进程 top -p 1234 # 按内存排序 top -o %MEM # 按CPU排序 top -o %CPU # 显示完整命令 top -c # 交互命令: # h - 帮助 # k - 杀死进程 # r - 调整优先级 # q - 退出 # f - 添加/删除字段 # o - 改变排序htop - 增强的交互式进程查看器# 启动htop htop # 显示线程 htop -t # 显示树视图 htop -t # 按用户过滤 htop -u username # 延迟更新(秒) htop -d 10 # 交互命令: # F1-F10 - 功能键 # h - 帮助 # k - 杀死进程 # u - 按用户过滤 # t - 树视图 # s - 跟踪系统调用ps - 报告进程状态# 显示当前用户进程 ps # 显示所有进程 ps -e # 显示所有进程(完整格式) ps -ef # 显示所有进程(BSD格式) ps aux # 显示进程树 ps -ejH # 按CPU排序 ps aux --sort=-%cpu # 按内存排序 ps aux --sort=-%mem # 显示特定用户进程 ps -u username # 显示特定进程及其子进程 ps -p 1234 --forestfree - 显示内存使用情况# 显示内存信息 free # 以MB为单位显示 free -m # 以GB为单位显示 free -g # 人类可读格式 free -h # 显示总计 free -t # 每秒更新一次 free -s 1vmstat - 报告虚拟内存统计# 显示内存统计 vmstat # 每秒更新一次,共5次 vmstat 1 5 # 显示内存统计(-S指定单位) vmstat -S M # 显示磁盘统计 vmstat -d # 显示分区统计 vmstat -p /dev/sda1 # 显示活动/非活动内存 vmstat -a # 显示系统事件计数器和内存统计 vmstat -siostat - 报告CPU和I/O统计# 显示CPU和I/O统计 iostat # 每秒更新一次,共5次 iostat 1 5 # 显示扩展统计 iostat -x # 显示设备利用率 iostat -d # 显示CPU利用率 iostat -c # 以MB为单位 iostat -m # 显示特定设备 iostat -p sdasar - 系统活动报告# 显示CPU使用情况 sar # 每秒更新一次,共5次 sar 1 5 # 显示内存使用情况 sar -r # 显示I/O活动 sar -b # 显示网络统计 sar -n DEV # 显示特定日期的历史数据 sar -f /var/log/sa/sa20 # 显示所有统计 sar -Ampstat - 多处理器统计# 显示所有CPU统计 mpstat # 每秒更新一次,共5次 mpstat 1 5 # 显示特定CPU mpstat -P 0 # 显示所有CPU单独统计 mpstat -P ALL # 显示中断统计 mpstat -I ALLdstat - 系统资源统计# 显示CPU、磁盘、网络、分页、系统统计 dstat # 显示CPU统计 dstat -c # 显示磁盘统计 dstat -d # 显示网络统计 dstat -n # 显示内存统计 dstat -m # 显示进程统计 dstat -p # 显示电源统计 dstat --power # 自定义输出 dstat -cdnmuptime - 系统运行时间和负载# 显示系统运行时间和负载 uptime # 简短格式 uptime -p # 显示自系统启动以来的秒数 uptime -sw - 显示已登录用户及其活动# 显示登录用户信息 w # 简短格式 w -s # 显示登录来源IP w -i # 不显示标题 w -h # 显示特定用户 w usernamewho - 显示已登录用户# 显示登录用户 who # 显示登录时间 who -a # 显示运行级别 who -r # 显示系统启动时间 who -b # 显示死进程 who -dlast - 显示用户登录历史# 显示登录历史 last # 显示特定用户 last username # 显示特定数量 last -n 10 # 显示主机名 last -a # 显示IP地址 last -i # 显示系统重启 last reboot # 显示系统关机 last shutdownlsof - 列出打开的文件# 列出所有打开的文件 lsof # 列出特定用户打开的文件 lsof -u username # 列出特定进程打开的文件 lsof -p 1234 # 列出特定程序打开的文件 lsof -c program_name # 列出特定端口打开的文件 lsof -i :22 # 列出所有网络连接 lsof -i # 列出特定文件的打开进程 lsof /path/to/file # 列出特定目录的打开文件 lsof +D /path/to/directorynmon - 性能监视器# 启动nmon nmon # 捕获数据到文件 nmon -f -s 60 -c 60 # 显示特定资源 nmon -c 60 -s 1 -f -m /home/userstrace - 跟踪系统调用和信号# 跟踪程序的系统调用 strace program_name # 跟踪特定进程 strace -p 1234 # 跟踪特定系统调用 strace -e open,read program_name # 显示调用时间 strace -t program_name # 显示相对时间戳 strace -r program_name # 将输出保存到文件 strace -o output.txt program_name # 跟踪子进程 strace -f program_name # 统计系统调用 strace -c program_nameltrace - 跟踪库调用# 跟踪程序的库调用 ltrace program_name # 跟踪特定进程 ltrace -p 1234 # 显示调用时间 ltrace -t program_name # 将输出保存到文件 ltrace -o output.txt program_name # 跟踪子进程 ltrace -f program_name # 统计库调用 ltrace -c program_nameperf - 性能分析工具# 列出可用事件 perf list # 记录性能数据 perf record -a sleep 10 # 分析性能数据 perf report # 实时统计 perf stat program_name # 跟踪特定进程 perf record -p 1234 sleep 10 # 跟踪特定事件 perf record -e cpu-clock program_name # 显示调用图 perf report --call-graphsysctl - 配置内核参数# 显示所有内核参数 sysctl -a # 显示特定参数 sysctl vm.swappiness # 设置参数 sysctl -w vm.swappiness=10 # 从配置文件加载 sysctl -p # 从特定文件加载 sysctl -p /etc/sysctl.conffuser - 识别使用文件或套接字的进程# 显示使用文件的进程 fuser /path/to/file # 显示使用端口的进程 fuser -n tcp 80 # 显示详细信息 fuser -v /path/to/file # 杀死使用文件的进程 fuser -k /path/to/file # 显示使用挂载点的进程 fuser -m /mnt/point用户和权限管理useradd - 创建新用户# 创建用户 useradd username # 创建用户并指定家目录 useradd -m username # 创建用户并指定shell useradd -m -s /bin/bash username # 创建用户并指定UID useradd -u 1001 username # 创建用户并添加到组 useradd -m -G wheel,users username # 创建系统用户 useradd -r username # 创建用户并设置过期时间 useradd -e 2023-12-31 usernameusermod - 修改用户账户# 修改用户名 usermod -l new_username old_username # 修改家目录 usermod -d /new/home username # 修改shell usermod -s /bin/zsh username # 添加到组 usermod -aG group1,group2 username # 锁定账户 usermod -L username # 解锁账户 usermod -U username # 修改UID usermod -u 1002 username # 设置过期时间 usermod -e 2023-12-31 usernameuserdel - 删除用户# 删除用户 userdel username # 删除用户及其家目录 userdel -r username # 强制删除 userdel -f usernamepasswd - 修改用户密码# 修改当前用户密码 passwd # 修改指定用户密码 passwd username # 删除用户密码 passwd -d username # 锁定用户密码 passwd -l username # 解锁用户密码 passwd -u username # 显示状态 passwd -S username # 设置密码过期 passwd -e usernamegroupadd - 创建新组# 创建组 groupadd groupname # 创建指定GID的组 groupadd -g 1001 groupname # 创建系统组 groupadd -r groupnamegroupmod - 修改组# 修改组名 groupmod -n new_groupname old_groupname # 修改GID groupmod -g 1002 groupnamegroupdel - 删除组# 删除组 groupdel groupnamegpasswd - 管理组成员# 添加用户到组 gpasswd -a username groupname # 从组中删除用户 gpasswd -d username groupname # 设置组管理员 gpasswd -A admin_user groupname # 设置组密码 gpasswd groupnamegroups - 显示用户组成员关系# 显示当前用户的组 groups # 显示指定用户的组 groups usernameid - 显示用户身份# 显示当前用户ID信息 id # 显示指定用户ID信息 id username # 仅显示UID id -u username # 仅显示GID id -g username # 显示所有组ID id -G username # 显示名称而非ID id -n usernamechown - 改变文件所有者和组# 更改所有者 chown username file # 更改所有者和组 chown username:groupname file # 递归更改 chown -R username:groupname directory # 仅更改符号链接 chown -h username:groupname symlink # 参考文件 chown --reference=reference_file target_filechmod - 改变文件权限# 设置权限(数字模式) chmod 755 file # 设置权限(符号模式) chmod u=rwx,g=rx,o=rx file # 添加权限 chmod u+x file # 移除权限 chmod o-w file # 递归更改 chmod -R 755 directory # 保留权限位 chmod +t directorychgrp - 改变文件组# 更改组 chgrp groupname file # 递归更改 chgrp -R groupname directory # 参考文件 chgrp --reference=reference_file target_fileumask - 设置默认权限掩码# 设置umask umask 022 # 显示符号形式 umask -S # 设置符号形式 umask u=rwx,g=rx,o=rx# 显示当前umask umask # 设置umask umask 022 # 显示符号形式 umask -S # 设置符号形式 umask u=rwx,g=rx,o=rxchage - 修改用户密码过期信息# 显示用户密码信息 chage -l username # 设置密码过期日期 chage -E 2023-12-31 username # 设置最小密码使用天数 chage -m 7 username # 设置最大密码使用天数 chage -M 90 username # 设置密码过期前的警告天数 chage -W 7 username # 设置密码过期后的宽限天数 chage -I 7 username # 强制用户下次登录时修改密码 chage -d 0 usernamesu - 切换用户# 切换到root su # 切换到特定用户 su username # 切换并使用登录环境 su - username # 执行单个命令 su -c "command" username # 保留环境变量 su -m usernamesudo - 以其他用户身份执行命令# 以root身份执行命令 sudo command # 以特定用户身份执行命令 sudo -u username command # 保留环境变量 sudo -E command # 编辑sudoers文件 sudo visudo # 显示sudo权限 sudo -l # 切换到root shell sudo -i # 切换到用户shell sudo -i -u usernamevisudo - 安全编辑sudoers文件# 编辑sudoers文件 visudo # 检查语法 visudo -c # 指定特定文件 visudo -f /etc/sudoers.d/customgetfacl - 显示文件访问控制列表# 显示ACL getfacl file # 显示所有信息 getfacl -a file # 显示目录内容 getfacl -R directorysetfacl - 设置文件访问控制列表# 为用户设置权限 setfacl -m u:username:rwx file # 为组设置权限 setfacl -m g:groupname:rx file # 删除特定ACL setfacl -x u:username file # 删除所有ACL setfacl -b file # 递归设置 setfacl -R -m u:username:rwx directory # 设置默认ACL setfacl -d -m u:username:rwx directory软件和包管理apt (Debian/Ubuntu) - 高级包管理工具# 更新包列表 apt update # 升级所有包 apt upgrade # 安装包 apt install package_name # 移除包 apt remove package_name # 移除包及其配置 apt purge package_name # 自动移除不需要的包 apt autoremove # 搜索包 apt search keyword # 显示包信息 apt show package_name # 列出可升级的包 apt list --upgradable # 列出已安装的包 apt list --installed # 清理本地仓库 apt clean # 下载但不安装包 apt download package_nameapt-get (Debian/Ubuntu) - 包管理工具# 更新包列表 apt-get update # 升级所有包 apt-get upgrade # 安装包 apt-get install package_name # 移除包 apt-get remove package_name # 移除包及其配置 apt-get purge package_name # 自动移除不需要的包 apt-get autoremove # 清理本地仓库 apt-get clean # 下载但不安装包 apt-get download package_name # 仅下载源码 apt-get source package_name # 构建依赖 apt-get build-dep package_namedpkg (Debian/Ubuntu) - 包管理器# 安装包 dpkg -i package.deb # 移除包 dpkg -r package_name # 移除包及其配置 dpkg -P package_name # 列出已安装的包 dpkg -l # 列出特定包的文件 dpkg -L package_name # 查找文件所属的包 dpkg -S /path/to/file # 显示包信息 dpkg -s package_name # 检查包是否安装 dpkg -l | grep package_name # 重新配置包 dpkg-reconfigure package_nameyum (RHEL/CentOS) - 包管理器# 安装包 yum install package_name # 移除包 yum remove package_name # 更新所有包 yum update # 更新特定包 yum update package_name # 搜索包 yum search keyword # 列出可用包 yum list available # 列出已安装的包 yum list installed # 显示包信息 yum info package_name # 清理缓存 yum clean all # 列出包组 yum grouplist # 安装包组 yum groupinstall "group_name" # 移除包组 yum groupremove "group_name"dnf (Fedora/RHEL8+) - 新一代包管理器# 安装包 dnf install package_name # 移除包 dnf remove package_name # 更新所有包 dnf update # 更新特定包 dnf update package_name # 搜索包 dnf search keyword # 列出可用包 dnf list available # 列出已安装的包 dnf list installed # 显示包信息 dnf info package_name # 清理缓存 dnf clean all # 列出包组 dnf group list # 安装包组 dnf group install "group_name" # 移除包组 dnf group remove "group_name"rpm (RHEL/CentOS/Fedora) - RPM包管理器# 安装包 rpm -i package.rpm # 安装包(显示进度) rpm -ivh package.rpm # 升级包 rpm -U package.rpm # 移除包 rpm -e package_name # 查询所有已安装的包 rpm -qa # 查询特定包 rpm -q package_name # 列出包中的文件 rpm -ql package_name # 查找文件所属的包 rpm -qf /path/to/file # 显示包信息 rpm -qi package_name # 验证包 rpm -V package_name # 导入GPG密钥 rpm --import key.asczypper (openSUSE) - 包管理器# 安装包 zypper install package_name # 移除包 zypper remove package_name # 更新所有包 zypper update # 更新特定包 zypper update package_name # 搜索包 zypper search keyword # 列出可用包 zypper se # 列出已安装的包 zypper se -i # 显示包信息 zypper info package_name # 刷新仓库 zypper refresh # 添加仓库 zypper addrepo URL alias # 移除仓库 zypper removerepo alias # 列出仓库 zypper repospacman (Arch Linux) - 包管理器# 安装包 pacman -S package_name # 移除包 pacman -R package_name # 移除包及其依赖 pacman -Rs package_name # 更新所有包 pacman -Syu # 搜索包 pacman -Ss keyword # 列出已安装的包 pacman -Q # 显示包信息 pacman -Qi package_name # 列出包中的文件 pacman -Ql package_name # 查找文件所属的包 pacman -Qo /path/to/file # 清理缓存 pacman -Sc # 同步数据库 pacman -Sysnap - 通用Linux包管理系统# 安装snap包 snap install package_name # 移除snap包 snap remove package_name # 更新所有snap包 snap refresh # 更新特定snap包 snap refresh package_name # 列出已安装的snap包 snap list # 搜索snap包 snap find keyword # 显示snap包信息 snap info package_name # 切换到特定通道 snap switch --channel=edge package_name # 启用/禁用snap包 snap enable/disable package_name # 查看snap日志 snap logs package_nameflatpak - 应用程序沙盒# 安装flatpak包 flatpak install application_id # 移除flatpak包 flatpak uninstall application_id # 更新所有flatpak包 flatpak update # 更新特定flatpak包 flatpak update application_id # 列出已安装的flatpak包 flatpak list # 搜索flatpak包 flatpak search keyword # 显示flatpak包信息 flatpak info application_id # 运行flatpak应用 flatpak run application_id # 添加远程仓库 flatpak remote-add name URL # 列出远程仓库 flatpak remotesmake - 构建程序# 构建程序 make # 安装程序 make install # 清理构建文件 make clean # 执行特定目标 make target_name # 并行构建 make -j4 # 显示调试信息 make -d # 指定makefile make -f custom_makefile # 只打印命令 make -n网络管理和配置ifconfig - 配置网络接口# 显示所有网络接口 ifconfig # 显示特定接口 ifconfig eth0 # 启用接口 ifconfig eth0 up # 禁用接口 ifconfig eth0 down # 设置IP地址 ifconfig eth0 192.168.1.100 # 设置子网掩码 ifconfig eth0 netmask 255.255.255.0 # 设置广播地址 ifconfig eth0 broadcast 192.168.1.255 # 设置MAC地址 ifconfig eth0 hw ether 00:11:22:33:44:55 # 设置MTU ifconfig eth0 mtu 1500ip - 显示/操作路由、设备、策略路由和隧道# 显示所有网络接口 ip link show # 显示IP地址 ip addr show # 显示特定接口 ip addr show dev eth0 # 添加IP地址 ip addr add 192.168.1.100/24 dev eth0 # 删除IP地址 ip addr del 192.168.1.100/24 dev eth0 # 启用接口 ip link set eth0 up # 禁用接口 ip link set eth0 down # 设置MTU ip link set eth0 mtu 1500 # 显示路由表 ip route show # 添加默认路由 ip route add default via 192.168.1.1 # 添加静态路由 ip route add 10.0.0.0/24 via 192.168.1.254 # 删除路由 ip route del 10.0.0.0/24 # 显示ARP表 ip neigh show # 添加ARP条目 ip neigh add 192.168.1.5 lladdr 00:11:22:33:44:55 dev eth0 # 删除ARP条目 ip neigh del 192.168.1.5 dev eth0route - 显示/操作IP路由表# 显示路由表 route # 显示数字形式 route -n # 添加默认网关 route add default gw 192.168.1.1 # 添加网络路由 route add -net 10.0.0.0 netmask 255.255.255.0 gw 192.168.1.254 # 添加主机路由 route add -host 10.0.0.1 gw 192.168.1.254 # 删除默认网关 route del default # 删除网络路由 route del -net 10.0.0.0 netmask 255.255.255.0 # 添加接口路由 route add -net 10.0.0.0 netmask 255.255.255.0 dev eth0netstat - 网络连接、路由表和接口统计# 显示所有连接 netstat -a # 显示监听端口 netstat -l # 显示TCP连接 netstat -t # 显示UDP连接 netstat -u # 显示进程名/PID netstat -p # 显示路由表 netstat -r # 显示接口统计 netstat -i # 不解析名称 netstat -n # 持续显示 netstat -c # 显示所有TCP连接且不解析 netstat -atnss - 显示套接字统计# 显示所有连接 ss # 显示监听端口 ss -l # 显示TCP连接 ss -t # 显示UDP连接 ss -u # 显示进程名/PID ss -p # 不解析名称 ss -n # 显示详细信息 ss -v # 显示内部TCP信息 ss -i # 显示摘要统计 ss -s # 显示所有TCP连接且不解析 ss -atnping - 测试网络连接# 基本ping ping example.com # 指定次数 ping -c 4 example.com # 指定间隔(秒) ping -i 2 example.com # 指定超时(秒) ping -W 2 example.com # 指定包大小 ping -s 1000 example.com # 洪水ping(需root权限) ping -f example.com # 只显示摘要 ping -q example.com # 使用特定接口 ping -I eth0 example.com # 记录路由 ping -R example.comtraceroute - 跟踪网络路径# 基本路径跟踪 traceroute example.com # 指定最大跳数 traceroute -m 15 example.com # 不解析主机名 traceroute -n example.com # 指定端口 traceroute -p 53 example.com # 使用ICMP traceroute -I example.com # 使用TCP traceroute -T example.com # 指定源IP traceroute -s 192.168.1.100 example.com # 显示AS号 traceroute -A example.com # 指定接口 traceroute -i eth0 example.commtr - 网络诊断工具(结合ping和traceroute)# 基本网络诊断 mtr example.com # 报告模式 mtr -r example.com # 指定报告循环次数 mtr -r -c 10 example.com # 不解析主机名 mtr -n example.com # 使用TCP代替ICMP mtr -T example.com # 使用UDP mtr -u example.com # 指定端口 mtr -P 80 example.com # 指定间隔(秒) mtr -i 2 example.com # 显示IP地址和主机名 mtr -b example.comnslookup - 查询DNS记录# 查询A记录 nslookup example.com # 指定DNS服务器 nslookup example.com 8.8.8.8 # 查询MX记录 nslookup -type=mx example.com # 查询NS记录 nslookup -type=ns example.com # 查询所有记录 nslookup -type=any example.com # 反向查询 nslookup 8.8.8.8 # 调试模式 nslookup -debug example.com # 交互模式 nslookup > server 8.8.8.8 > example.comdig - DNS查询工具# 查询A记录 dig example.com # 指定DNS服务器 dig @8.8.8.8 example.com # 查询特定记录类型 dig example.com MX # 简短输出 dig +short example.com # 跟踪DNS查询 dig +trace example.com # 反向查询 dig -x 8.8.8.8 # 查询所有记录 dig example.com ANY # 显示DNSSEC信息 dig +dnssec example.com # 指定端口 dig @8.8.8.8 -p 53 example.comhost - DNS查询工具# 基本查询 host example.com # 指定DNS服务器 host example.com 8.8.8.8 # 查询特定记录类型 host -t MX example.com # 详细输出 host -v example.com # 反向查询 host 8.8.8.8 # 查询所有记录 host -a example.comwhois - 查询域名注册信息# 基本查询 whois example.com # 指定whois服务器 whois -h whois.verisign-grs.com example.com # 简短输出 whois -b example.com # 递归查询 whois -r example.com # 查询IP地址 whois 8.8.8.8nc (netcat) - TCP/UDP连接和监听# 连接到服务器 nc example.com 80 # 指定超时 nc -w 5 example.com 80 # UDP模式 nc -u example.com 53 # 监听端口 nc -l 8080 # 端口扫描 nc -zv example.com 20-30 # 传输文件(接收端) nc -l 8080 > received_file # 传输文件(发送端) nc example.com 8080 < file_to_send # 聊天服务器 nc -l 8080 # 聊天客户端 nc example.com 8080 # 持久监听 nc -k -l 8080curl - 传输数据的工具# 获取网页 curl http://example.com # 保存到文件 curl -o file.html http://example.com # 使用原始文件名保存 curl -O http://example.com/file.zip # 显示响应头 curl -I http://example.com # 发送POST请求 curl -d "param1=value1&param2=value2" http://example.com # 发送JSON数据 curl -H "Content-Type: application/json" -d '{"key":"value"}' http://example.com # 使用基本认证 curl -u username:password http://example.com # 跟随重定向 curl -L http://example.com # 使用代理 curl -x proxy.example.com:8080 http://example.com # 上传文件 curl -F "file=@localfile.jpg" http://example.com/upload # 设置cookie curl -b "name=value" http://example.com # 保存cookie curl -c cookies.txt http://example.com # 限制传输速率 curl --limit-rate 100k http://example.com # 断点续传 curl -C - -O http://example.com/large_file.zipwget - 网络下载工具# 下载文件 wget http://example.com/file.zip # 指定输出文件名 wget -O output.zip http://example.com/file.zip # 后台下载 wget -b http://example.com/large_file.zip # 继续下载 wget -c http://example.com/large_file.zip # 递归下载网站 wget -r http://example.com/ # 递归下载限制深度 wget -r -l 2 http://example.com/ # 镜像网站 wget --mirror http://example.com/ # 接受/拒绝文件类型 wget -A "*.pdf" -R "*.html" http://example.com/ # 使用基本认证 wget --http-user=username --http-password=password http://example.com/ # 使用代理 wget -e use_proxy=yes -e http_proxy=proxy.example.com:8080 http://example.com/ # 限制带宽 wget --limit-rate=100k http://example.com/large_file.zipiptables - 配置Linux防火墙# 显示所有规则 iptables -L # 显示规则(带行号) iptables -L --line-numbers # 显示特定链的规则 iptables -L INPUT # 添加允许规则 iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 添加拒绝规则 iptables -A INPUT -p tcp --dport 23 -j DROP # 删除规则(按号码) iptables -D INPUT 3 # 设置默认策略 iptables -P INPUT DROP # 允许已建立的连接 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 允许特定IP iptables -A INPUT -s 192.168.1.100 -j ACCEPT # 允许特定网段 iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT # 端口转发 iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080 # 保存规则 iptables-save > /etc/iptables.rules # 恢复规则 iptables-restore < /etc/iptables.rulesfirewalld - 动态防火墙管理器# 显示状态 firewall-cmd --state # 重新加载规则 firewall-cmd --reload # 列出所有区域 firewall-cmd --get-zones # 列出默认区域 firewall-cmd --get-default-zone # 设置默认区域 firewall-cmd --set-default-zone=public # 列出特定区域的规则 firewall-cmd --zone=public --list-all # 添加服务 firewall-cmd --zone=public --add-service=http # 永久添加服务 firewall-cmd --permanent --zone=public --add-service=http # 移除服务 firewall-cmd --zone=public --remove-service=http # 添加端口 firewall-cmd --zone=public --add-port=8080/tcp # 永久添加端口 firewall-cmd --permanent --zone=public --add-port=8080/tcp # 移除端口 firewall-cmd --zone=public --remove-port=8080/tcp # 添加源地址 firewall-cmd --permanent --zone=trusted --add-source=192.168.1.0/24 # 移除源地址 firewall-cmd --permanent --zone=trusted --remove-source=192.168.1.0/24 # 端口转发 firewall-cmd --permanent --zone=public --add-forward-port=port=80:proto=tcp:toport=8080 # 添加富规则 firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.10" accept' # 列出所有服务 firewall-cmd --get-services # 查询端口是否开放 firewall-cmd --zone=public --query-port=80/tcpnmap - 网络探测和安全审计# 扫描单个主机 nmap 192.168.1.1 # 扫描整个网段 nmap 192.168.1.0/24 # 扫描多个主机 nmap 192.168.1.1,2,3 # 扫描主机列表 nmap -iL hosts.txt # 扫描特定端口 nmap -p 80,443 192.168.1.1 # 扫描端口范围 nmap -p 1-100 192.168.1.1 # 扫描所有端口 nmap -p- 192.168.1.1 # 快速扫描 nmap -F 192.168.1.1 # 操作系统检测 nmap -O 192.168.1.1 # 服务版本检测 nmap -sV 192.168.1.1 # 全面扫描 nmap -A 192.168.1.1 # SYN扫描(半开扫描) nmap -sS 192.168.1.1 # TCP连接扫描 nmap -sT 192.168.1.1 # UDP扫描 nmap -sU 192.168.1.1 # 保存输出到文件 nmap -oN output.txt 192.168.1.1 # XML输出 nmap -oX output.xml 192.168.1.1 # 脚本扫描 nmap --script=vuln 192.168.1.1 # 隐蔽扫描 nmap -T0 192.168.1.1tcpdump - 网络数据包分析器# 捕获特定接口的数据包 tcpdump -i eth0 # 捕获特定数量的数据包 tcpdump -c 100 -i eth0 # 显示详细信息 tcpdump -v -i eth0 # 显示更详细信息 tcpdump -vv -i eth0 # 显示十六进制和ASCII输出 tcpdump -X -i eth0 # 不解析主机名和端口 tcpdump -n -i eth0 # 捕获特定主机的数据包 tcpdump host 192.168.1.1 # 捕获源主机的数据包 tcpdump src host 192.168.1.1 # 捕获目标主机的数据包 tcpdump dst host 192.168.1.1 # 捕获特定端口的数据包 tcpdump port 80 # 捕获特定协议的数据包 tcpdump tcp # 使用过滤表达式 tcpdump 'tcp port 80 and host 192.168.1.1' # 保存捕获到文件 tcpdump -w capture.pcap # 读取捕获文件 tcpdump -r capture.pcap # 捕获HTTP GET请求 tcpdump -i eth0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'nmcli - NetworkManager命令行工具# 显示所有连接 nmcli connection show # 显示活动连接 nmcli connection show --active # 显示设备状态 nmcli device status # 显示特定设备详情 nmcli device show eth0 # 连接到网络 nmcli connection up "Connection Name" # 断开连接 nmcli connection down "Connection Name" # 创建新连接 nmcli connection add type ethernet con-name "My Connection" ifname eth0 # 修改连接属性 nmcli connection modify "My Connection" ipv4.addresses 192.168.1.100/24 # 设置自动连接 nmcli connection modify "My Connection" connection.autoconnect yes # 删除连接 nmcli connection delete "My Connection" # 显示WiFi网络 nmcli device wifi list # 连接到WiFi网络 nmcli device wifi connect SSID password PASSWORD # 启用设备 nmcli device connect eth0 # 禁用设备 nmcli device disconnect eth0 # 设置系统主机名 nmcli general hostname myhost.example.comiwconfig - 无线网络接口配置# 显示所有无线接口 iwconfig # 显示特定接口 iwconfig wlan0 # 设置ESSID iwconfig wlan0 essid "NetworkName" # 设置操作模式 iwconfig wlan0 mode Managed # 设置频道 iwconfig wlan0 channel 6 # 设置传输速率 iwconfig wlan0 rate 54M # 设置加密密钥 iwconfig wlan0 key 1234567890 # 设置WEP密钥 iwconfig wlan0 key s:password # 设置传输功率 iwconfig wlan0 txpower 15 # 启用/禁用接口 iwconfig wlan0 txpower on/offiw - 无线设备配置工具# 列出所有无线设备 iw dev # 显示设备信息 iw dev wlan0 info # 扫描可用网络 iw dev wlan0 scan # 连接到网络 iw dev wlan0 connect "NetworkName" # 断开网络 iw dev wlan0 disconnect # 设置接口类型 iw dev wlan0 set type ibss # 加入ad-hoc网络 iw dev wlan0 ibss join "NetworkName" 2412 # 显示链接信息 iw dev wlan0 link # 显示站点信息 iw dev wlan0 station dump # 设置功率保存 iw dev wlan0 set power_save onssh - 安全Shell客户端# 连接到远程服务器 ssh username@hostname # 指定端口 ssh -p 2222 username@hostname # 使用密钥认证 ssh -i key.pem username@hostname # 执行远程命令 ssh username@hostname "ls -la" # 启用压缩 ssh -C username@hostname # X11转发 ssh -X username@hostname # 本地端口转发 ssh -L 8080:localhost:80 username@hostname # 远程端口转发 ssh -R 8080:localhost:80 username@hostname # 动态端口转发(SOCKS代理) ssh -D 1080 username@hostname # 禁用主机密钥检查 ssh -o StrictHostKeyChecking=no username@hostname # 保持连接活动 ssh -o ServerAliveInterval=60 username@hostname # 多跳SSH ssh -J user1@host1 user2@host2scp - 安全复制# 从本地复制到远程 scp file.txt username@hostname:/remote/directory # 从远程复制到本地 scp username@hostname:/remote/file.txt local_directory # 指定端口 scp -P 2222 file.txt username@hostname:/remote/directory # 复制目录(递归) scp -r directory username@hostname:/remote/directory # 保留文件属性 scp -p file.txt username@hostname:/remote/directory # 限制带宽 scp -l 1000 file.txt username@hostname:/remote/directory # 压缩传输 scp -C file.txt username@hostname:/remote/directory # 使用密钥认证 scp -i key.pem file.txt username@hostname:/remote/directory # 安静模式 scp -q file.txt username@hostname:/remote/directory # 详细模式 scp -v file.txt username@hostname:/remote/directoryrsync - 远程文件同步# 本地同步 rsync -a source/ destination/ # 远程同步(推送) rsync -a source/ username@hostname:/remote/directory/ # 远程同步(拉取) rsync -a username@hostname:/remote/directory/ local-dir/ # 使用SSH rsync -a -e ssh source/ username@hostname:/remote/directory/ # 显示进度 rsync -a --progress source/ destination/ # 删除目标中多余的文件 rsync -a --delete source/ destination/ # 排除文件 rsync -a --exclude='*.txt' source/ destination/ # 包含文件 rsync -a --include='*.txt' --exclude='*' source/ destination/ # 限制带宽 rsync -a --bwlimit=1000 source/ destination/ # 只同步更新的文件 rsync -a --update source/ destination/ # 模拟运行 rsync -a --dry-run source/ destination/ # 压缩传输 rsync -az source/ destination/lftp - 高级文件传输程序# 连接到FTP服务器 lftp ftp://username:password@hostname # 连接到SFTP服务器 lftp sftp://username@hostname # 列出文件 ls # 更改远程目录 cd remote-dir # 更改本地目录 lcd local-dir # 下载文件 get file.txt # 上传文件 put file.txt # 下载目录 mirror remote-dir # 上传目录 mirror -R local-dir remote-dir # 设置传输模式 set ftp:ssl-force true # 设置并发传输 set xfer:parallel 4 # 书签管理 bookmark add myserver # 使用书签 open myserver # 断点续传 pget file.txt # 队列管理 queue starttelnet - Telnet协议客户端# 连接到服务器 telnet hostname port # 连接到标准端口 telnet hostname # 设置转义字符 telnet -e 'x' hostname # 不读取.telnetrc文件 telnet -a hostname # 8位传输 telnet -8 hostname # 不进行本地字符处理 telnet -E hostname # 调试模式 telnet -d hostname # 使用行模式 telnet -l user hostnameftp - 文件传输协议客户端# 连接到服务器 ftp hostname # 指定用户名 ftp -u username hostname # 列出文件 ls # 更改远程目录 cd remote-dir # 更改本地目录 lcd local-dir # 下载文件 get file.txt # 上传文件 put file.txt # 下载多个文件 mget *.txt # 上传多个文件 mput *.txt # 二进制传输模式 binary # ASCII传输模式 ascii # 启用/禁用交互式提示 prompt # 退出 quit系统监控和性能分析top - 系统监控工具# 运行top top # 批处理模式 top -b# 指定刷新间隔(秒) top -d 5 # 显示特定用户的进程 top -u username # 显示特定进程 top -p 1234,5678 # 不显示闲置进程 top -i # 显示完整命令行 top -c # 安全模式 top -s # 显示累计模式 top -S # 高亮显示排序列 top -x # 交互式命令: # P - 按CPU使用率排序 # M - 按内存使用率排序 # T - 按运行时间排序 # k - 终止进程 # r - 重新调整进程优先级 # q - 退出htop - 交互式进程查看器# 启动htop htop # 显示树状视图 htop -t # 显示特定用户的进程 htop -u username # 不显示线程 htop --no-threads # 不显示树状视图 htop --no-tree # 延迟更新(秒) htop -d 5 # 显示特定进程 htop -p 1234,5678 # 高亮显示变化 htop --highlight-changes=3 # 交互式命令: # F1-F10 - 功能键 # F5 - 树状视图 # F6 - 排序 # F9 - 终止进程 # F10 - 退出vmstat - 虚拟内存统计# 显示当前状态 vmstat # 每隔2秒显示一次，共5次 vmstat 2 5 # 显示内存统计 vmstat -s # 显示磁盘统计 vmstat -d # 显示分区统计 vmstat -p /dev/sda1 # 显示活动/非活动内存 vmstat -a # 显示时间戳 vmstat -t # 显示单位(MB) vmstat -S M # 显示详细信息 vmstat -viostat - I/O统计# 显示CPU和设备统计 iostat # 每隔2秒显示一次，共5次 iostat 2 5 # 显示扩展统计 iostat -x # 显示CPU统计 iostat -c # 显示设备统计 iostat -d # 显示NFS统计 iostat -n # 显示时间戳 iostat -t # 显示单位(KB) iostat -k # 显示特定设备 iostat -p sdampstat - 多处理器统计# 显示所有CPU统计 mpstat # 每隔2秒显示一次，共5次 mpstat 2 5 # 显示特定CPU mpstat -P 0 # 显示所有CPU单独统计 mpstat -P ALL # 显示中断统计 mpstat -I ALL # 显示SMP统计 mpstat -S SCPUsar - 系统活动报告# 显示CPU使用情况 sar # 每隔2秒显示一次，共5次 sar 2 5 # 显示内存使用情况 sar -r # 显示I/O和传输率统计 sar -b # 显示分页统计 sar -B # 显示块设备统计 sar -d # 显示网络统计 sar -n DEV # 显示TCP统计 sar -n TCP # 显示特定时间范围 sar -s 10:00:00 -e 11:00:00 # 从文件读取 sar -f /var/log/sa/sa01free - 显示内存使用情况# 显示内存使用情况 free # 以MB为单位显示 free -m # 以GB为单位显示 free -g # 以KB为单位显示 free -k # 以人类可读格式显示 free -h # 显示总计行 free -t # 每隔3秒刷新一次 free -s 3 # 刷新5次 free -c 5 # 宽输出格式 free -wdf - 显示磁盘空间使用情况# 显示所有文件系统 df # 以人类可读格式显示 df -h # 以KB为单位显示 df -k # 以MB为单位显示 df -m # 显示文件系统类型 df -T # 显示inode信息 df -i # 显示特定文件系统 df /dev/sda1 # 排除特定文件系统类型 df -x tmpfs # 仅显示特定文件系统类型 df -t ext4du - 估计文件空间使用# 显示当前目录大小 du # 以人类可读格式显示 du -h # 显示总计 du -s # 显示每个文件大小 du -a # 显示特定目录 du /var/log # 显示指定深度 du --max-depth=2 # 排除模式 du --exclude="*.log" # 只统计大于指定大小的文件 du --threshold=1M # 显示时间 du --timelsof - 列出打开的文件# 列出所有打开的文件 lsof # 列出特定用户打开的文件 lsof -u username # 列出特定进程打开的文件 lsof -p 1234 # 列出特定程序打开的文件 lsof -c nginx # 列出特定文件的进程 lsof /var/log/syslog # 列出特定目录的文件 lsof +D /var/log # 列出网络连接 lsof -i # 列出TCP端口 lsof -i TCP:80 # 列出UDP端口 lsof -i UDP:53 # 列出IPv4连接 lsof -i 4 # 列出IPv6连接 lsof -i 6 # 不解析主机名 lsof -n # 不解析服务名 lsof -Pstrace - 跟踪系统调用和信号# 跟踪程序 strace program # 跟踪特定进程 strace -p 1234 # 跟踪子进程 strace -f program # 跟踪特定系统调用 strace -e open,read program # 显示时间戳 strace -t program # 显示相对时间戳 strace -r program # 统计系统调用 strace -c program # 输出到文件 strace -o output.txt program # 显示文件描述符 strace -y program # 显示字符串长度 strace -s 256 programltrace - 库调用跟踪器# 跟踪程序 ltrace program # 跟踪特定进程 ltrace -p 1234 # 跟踪子进程 ltrace -f program # 显示参数值 ltrace -a program # 统计调用 ltrace -c program # 输出到文件 ltrace -o output.txt program # 显示时间戳 ltrace -t program # 显示相对时间戳 ltrace -r program # 跟踪特定库 ltrace -l /lib/libc.so.6 program # 显示字符串长度 ltrace -s 256 programdstat - 系统资源统计# 基本统计 dstat # 指定间隔(秒)和次数 dstat 5 10 # 显示CPU统计 dstat -c # 显示磁盘统计 dstat -d # 显示网络统计 dstat -n # 显示内存统计 dstat -m # 显示进程统计 dstat -p # 显示I/O统计 dstat -i # 显示负载统计 dstat -l # 显示全部统计 dstat -a # 显示时间戳 dstat -t # 输出到CSV dstat --output file.csvnmon - 系统监控工具# 启动nmon nmon # 捕获模式 nmon -f -s 30 -c 120 # 指定文件名 nmon -F filename.nmon # 显示特定统计信息 nmon -c # 在线帮助 nmon -h # 交互式命令: # c - CPU统计 # m - 内存统计 # d - 磁盘统计 # n - 网络统计 # t - 最耗CPU的进程 # q - 退出iotop - I/O监控# 启动iotop iotop # 只显示实际执行I/O的进程 iotop -o # 批处理模式 iotop -b # 非交互模式，只打印一次 iotop -n 1 # 指定延迟(秒) iotop -d 5 # 只显示特定用户的进程 iotop -u username # 只显示特定进程 iotop -p 1234,5678 # 累计模式 iotop -a # 只显示进程 iotop -P # 只显示线程 iotop -tsysstat工具集# 收集系统活动信息 sadc 1 10 output.file # 系统活动报告 sar -f output.file # 显示每日系统活动 sa1 # 生成每日系统活动报告 sa2 # 配置文件 /etc/sysconfig/sysstatperf - 性能分析工具# 列出事件 perf list # 记录系统范围的性能数据 perf record -a sleep 10 # 记录特定进程 perf record -p 1234 sleep 10 # 记录特定命令 perf record command # 记录CPU周期 perf record -e cycles command # 记录缓存未命中 perf record -e cache-misses command # 报告记录的数据 perf report # 实时统计 perf stat command # 实时统计特定事件 perf stat -e cycles,instructions command # 显示调用图 perf report --call-graphslabtop - 内核slab缓存信息# 显示slab缓存信息 slabtop # 指定延迟(秒) slabtop -d 5 # 只显示一次 slabtop -o # 排序方式(按大小) slabtop -s b # 排序方式(按数量) slabtop -s a # 排序方式(按名称) slabtop -s ncollectl - 系统性能监控# 显示摘要数据 collectl # 实时监控 collectl -c 5 # 记录到文件 collectl -f /tmp/data # 显示CPU信息 collectl -s C # 显示磁盘信息 collectl -s D # 显示网络信息 collectl -s N # 显示内存信息 collectl -s M # 显示进程信息 collectl -s Z # 详细输出 collectl -v # 显示所有子系统 collectl -all# 启动atop atop # 指定间隔(秒) atop 5 # 写入日志文件 atop -w /tmp/atop.log 60 # 读取日志文件 atop -r /tmp/atop.log # 显示特定日期的日志 atop -r /var/log/atop/atop_20230101 # 显示特定进程 atop -p # 显示磁盘活动 atop -d # 显示内存活动 atop -m # 显示网络活动 atop -n # 显示调度活动 atop -s # 显示各种活动 atop -a # 交互式命令: # g - 通用资源视图 # m - 内存视图 # d - 磁盘视图 # n - 网络视图 # c - 命令行视图 # p - 按CPU排序 # M - 按内存排序 # D - 按磁盘排序 # q - 退出glances - 系统监控工具# 启动glances glances # 客户端/服务器模式 glances -s # 服务器 glances -c SERVER_IP # 客户端 # Web服务器模式 glances -w # 输出到CSV glances --export csv --export-csv-file /tmp/glances.csv # 输出到InfluxDB glances --export influxdb # 显示文件系统 glances --fs-free-space # 禁用网络接口 glances --disable-network # 指定刷新间隔(秒) glances -t 5 # 批处理模式 glances -B # 全屏显示 glances -fnetstat - 网络连接统计# 显示所有连接 netstat -a # 显示监听端口 netstat -l # 显示TCP连接 netstat -t # 显示UDP连接 netstat -u # 显示进程信息 netstat -p # 不解析主机名 netstat -n # 持续显示 netstat -c # 显示路由表 netstat -r # 显示接口统计 netstat -i # 显示网络统计 netstat -s # 显示特定端口 netstat -an | grep :80ss - 套接字统计# 显示所有连接 ss # 显示监听端口 ss -l # 显示TCP连接 ss -t # 显示UDP连接 ss -u # 显示进程信息 ss -p # 不解析服务名 ss -n # 显示详细信息 ss -e # 显示内存使用 ss -m # 显示计时器信息 ss -o # 显示特定端口 ss -an '( dport = :80 or sport = :80 )' # 显示状态为已建立的连接 ss -o state established # 显示所有TCP连接 ss -sps - 进程状态# 显示所有进程 ps -e # 显示完整格式 ps -ef # 显示BSD格式 ps aux # 显示进程树 ps -ejH # 显示线程 ps -eLf # 显示特定用户的进程 ps -u username # 显示特定进程 ps -p 1234 # 按CPU使用率排序 ps -aux --sort=-%cpu # 按内存使用率排序 ps -aux --sort=-%mem # 自定义输出格式 ps -eo pid,user,cmdpstree - 以树状显示进程# 显示进程树 pstree # 显示PID pstree -p # 显示用户 pstree -u # 显示命令行参数 pstree -a # 高亮显示当前进程 pstree -h # 显示特定进程 pstree -p 1234 # 不显示相同进程 pstree -c # 显示线程 pstree -tpmap - 进程内存映射# 显示进程内存映射 pmap 1234 # 显示设备格式 pmap -d 1234 # 显示扩展格式 pmap -x 1234 # 显示详细格式 pmap -XX 1234uptime - 系统运行时间和负载# 显示系统运行时间和负载 uptime # 显示自上次启动以来的秒数 uptime -p # 显示系统启动时间 uptime -sw - 显示登录用户和活动# 显示登录用户和活动 w # 显示简短格式 w -s # 显示登录来源IP w -i # 显示特定用户 w usernamewho - 显示当前登录用户# 显示当前登录用户 who # 显示运行级别 who -r # 显示启动时间 who -b # 显示死进程 who -d # 显示系统登录进程 who -llast - 显示登录历史# 显示登录历史 last # 显示特定用户 last username # 显示特定数量 last -n 10 # 显示IP地址 last -i # 显示系统重启 last reboot # 显示系统关机 last shutdowniftop - 网络带宽监控# 监控特定接口 iftop -i eth0 # 不解析主机名 iftop -n # 不显示端口号 iftop -P # 不显示栏 iftop -B # 显示端口号 iftop -N # 显示源端口 iftop -S # 设置过滤器 iftop -f 'port http' # 设置刷新间隔 iftop -t # 显示方向箭头 iftop -anethogs - 按进程显示网络流量# 启动nethogs nethogs # 监控特定接口 nethogs eth0 # 设置刷新间隔(秒) nethogs -d 5 # 跟踪特定设备 nethogs eth0 wlan0 # 显示特定协议 nethogs -p tcpiptraf - 交互式网络监控# 启动iptraf iptraf-ng # 监控特定接口 iptraf-ng -i eth0 # 显示IP流量监控 iptraf-ng -s eth0 # 显示详细接口统计 iptraf-ng -d eth0 # 显示TCP/UDP统计 iptraf-ng -z eth0bmon - 带宽监控# 启动bmon bmon # 监控特定接口 bmon -p eth0 # 设置刷新间隔 bmon -r 5 # 使用特定输出模块 bmon -o curses # 使用特定输入模块 bmon -i procnload - 网络流量监控# 启动nload nload # 监控特定设备 nload eth0 # 设置刷新间隔(毫秒) nload -t 500 # 设置平均值计算间隔(秒) nload -a 60 # 设置单位(K=1000, k=1024) nload -u Kvnstat - 网络流量监控# 显示所有接口统计 vnstat # 显示特定接口 vnstat -i eth0 # 显示小时统计 vnstat -h # 显示天统计 vnstat -d # 显示月统计 vnstat -m # 显示周统计 vnstat -w # 显示最高流量 vnstat -t # 实时监控 vnstat -l # 更新数据库 vnstat -usysdig - 系统活动捕获# 捕获系统事件 sysdig # 写入文件 sysdig -w file.scap # 读取文件 sysdig -r file.scap # 过滤事件 sysdig proc.name=nginx # 列出字段 sysdig -l # 列出事件 sysdig -L # 查看容器活动 sysdig -pc # 显示进程活动 sysdig -p"%proc.name %proc.pid %evt.type" # 显示网络连接 sysdig -c netstat # 显示最耗CPU的进程 sysdig -c topprocs_cpustress - 系统压力测试# CPU压力测试 stress --cpu 4 # 内存压力测试 stress --vm 2 --vm-bytes 1G # I/O压力测试 stress --io 4 # 硬盘压力测试 stress --hdd 2 --hdd-bytes 1G # 超时设置(秒) stress --timeout 60s # 组合压力测试 stress --cpu 2 --io 1 --vm 1 --vm-bytes 128M --timeout 60sstress-ng - 高级系统压力测试# CPU压力测试 stress-ng --cpu 4 --timeout 60s # 内存压力测试 stress-ng --vm 2 --vm-bytes 1G --timeout 60s # I/O压力测试 stress-ng --io 4 --timeout 60s # 磁盘压力测试 stress-ng --hdd 2 --hdd-bytes 1G --timeout 60s # 缓存压力测试 stress-ng --cache 2 --timeout 60s # 网络压力测试 stress-ng --sock 4 --timeout 60s # 文件系统压力测试 stress-ng --filesystem 2 --timeout 60s # 多种压力测试 stress-ng --cpu 2 --vm 1 --io 1 --timeout 60s # 显示详细统计 stress-ng --metrics-brief # 随机压力测试 stress-ng --random 8 --timeout 60ssysbench - 系统基准测试# CPU基准测试 sysbench cpu run # 内存基准测试 sysbench memory run # 文件I/O基准测试 sysbench fileio --file-test-mode=rndrw prepare sysbench fileio --file-test-mode=rndrw run sysbench fileio --file-test-mode=rndrw cleanup # 线程基准测试 sysbench threads run # 互斥基准测试 sysbench mutex run # MySQL基准测试 sysbench oltp_read_write --mysql-user=root --mysql-password=password prepare sysbench oltp_read_write --mysql-user=root --mysql-password=password run sysbench oltp_read_write --mysql-user=root --mysql-password=password cleanup # 自定义参数 sysbench cpu --cpu-max-prime=20000 run # 多线程测试 sysbench cpu --threads=4 run # 指定测试时间(秒) sysbench cpu --time=60 runfio - I/O基准测试# 随机读测试 fio --name=random-read --ioengine=libaio --direct=1 --bs=4k --size=1G --numjobs=4 --rw=randread # 随机写测试 fio --name=random-write --ioengine=libaio --direct=1 --bs=4k --size=1G --numjobs=4 --rw=randwrite# 顺序读测试 fio --name=sequential-read --ioengine=libaio --direct=1 --bs=1M --size=1G --numjobs=4 --rw=read # 顺序写测试 fio --name=sequential-write --ioengine=libaio --direct=1 --bs=1M --size=1G --numjobs=4 --rw=write # 混合读写测试 fio --name=mixed --ioengine=libaio --direct=1 --bs=4k --size=1G --numjobs=4 --rw=randrw --rwmixread=70 # 使用作业文件 fio fio_job_file.fio # 指定输出格式 fio --output-format=json --name=test --ioengine=libaio --direct=1 --bs=4k --size=1G --rw=randread # 指定运行时间 fio --runtime=60 --time_based --name=test --ioengine=libaio --direct=1 --bs=4k --size=1G --rw=randread # 多种I/O引擎 fio --name=test --ioengine=sync --bs=4k --size=1G --rw=randread # 多种I/O深度 fio --name=test --ioengine=libaio --iodepth=16 --bs=4k --size=1G --rw=randread # 指定CPU亲和性 fio --name=test --cpus_allowed=0-1 --bs=4k --size=1G --rw=randread # 验证数据完整性 fio --name=test --verify=md5 --bs=4k --size=1G --rw=randwritebonnie++ - 文件系统基准测试# 基本测试 bonnie++ # 指定测试目录 bonnie++ -d /tmp/bonnie # 指定测试大小 bonnie++ -s 8G # 指定用户名 bonnie++ -u root # 指定数量 bonnie++ -n 10:100:10:20 # CSV输出 bonnie++ -f # 跳过每字符I/O测试 bonnie++ -b # 不缓冲I/O bonnie++ -Dhdparm - 硬盘参数工具# 显示设备信息 hdparm -i /dev/sda # 显示详细信息 hdparm -I /dev/sda # 测试读取速度 hdparm -t /dev/sda # 测试缓存读取速度 hdparm -T /dev/sda # 获取高级电源管理 hdparm -B /dev/sda # 设置高级电源管理 hdparm -B 254 /dev/sda # 获取安全擦除时间 hdparm -I /dev/sda | grep -i erase # 启用DMA hdparm -d1 /dev/sda # 设置传输模式 hdparm -X66 /dev/sda # 获取设备参数 hdparm -g /dev/sdasmartctl - S.M.A.R.T. 硬盘监控# 显示设备信息 smartctl -i /dev/sda # 显示健康状态 smartctl -H /dev/sda # 显示所有SMART数据 smartctl -a /dev/sda # 显示错误日志 smartctl -l error /dev/sda # 显示自测试日志 smartctl -l selftest /dev/sda # 启动短期自测试 smartctl -t short /dev/sda # 启动长期自测试 smartctl -t long /dev/sda # 启动传输测试 smartctl -t conveyance /dev/sda # 启用SMART smartctl -s on /dev/sda # 显示支持的功能 smartctl -c /dev/sdablktrace - 块I/O层跟踪# 跟踪设备 blktrace -d /dev/sda -o trace # 指定输出目录 blktrace -d /dev/sda -o trace -D /tmp # 设置缓冲区大小 blktrace -d /dev/sda -b 4096 # 设置缓冲区数量 blktrace -d /dev/sda -n 4 # 设置跟踪时间(秒) blktrace -d /dev/sda -w 60 # 分析跟踪文件 blkparse -i trace # 生成I/O统计 blkparse -i trace -d trace.bin # 查看I/O统计 btt -i trace.binoprofile - 系统范围的性能分析器# 启动守护进程 operf # 收集特定命令的数据 operf command # 收集特定PID的数据 operf --pid=1234 # 收集系统范围的数据 operf --system-wide # 设置事件 operf --events=CPU_CLK_UNHALTED:100000 # 生成报告 opreport # 显示详细报告 opreport -l # 按符号排序 opreport --symbols # 显示调用图 opreport --callgraph # 显示特定二进制文件的报告 opreport /path/to/binaryvalgrind - 内存调试和分析工具# 内存泄漏检测 valgrind --leak-check=full ./program # 内存使用分析 valgrind --tool=massif ./program # 缓存分析 valgrind --tool=cachegrind ./program # 堆分析 valgrind --tool=heap-profiler ./program # 线程错误检测 valgrind --tool=helgrind ./program # 详细输出 valgrind -v ./program # 保存输出到文件 valgrind --log-file=valgrind.log ./program # 显示泄漏摘要 valgrind --leak-check=summary ./program # 跟踪子进程 valgrind --trace-children=yes ./program # 显示调用栈 valgrind --num-callers=20 ./programgprof - GNU分析器# 编译支持分析的程序 gcc -pg -o program program.c # 运行程序 ./program # 生成分析报告 gprof ./program gmon.out > report.txt # 显示调用图 gprof -A ./program gmon.out # 显示平面配置文件 gprof -p ./program gmon.out # 显示调用者/被调用者图 gprof -q ./program gmon.out # 按函数名排序 gprof -N ./program gmon.out # 按文件名排序 gprof -i ./program gmon.outtcpdump - 网络数据包分析器# 捕获特定接口的数据包 tcpdump -i eth0 # 捕获特定主机的数据包 tcpdump host 192.168.1.1 # 捕获特定端口的数据包 tcpdump port 80 # 捕获TCP数据包 tcpdump tcp # 捕获UDP数据包 tcpdump udp # 捕获ICMP数据包 tcpdump icmp # 保存捕获到文件 tcpdump -w capture.pcap # 读取捕获文件 tcpdump -r capture.pcap # 显示详细信息 tcpdump -v # 显示数据包内容 tcpdump -X # 不解析主机名 tcpdump -n # 不解析端口名 tcpdump -nn # 限制捕获数量 tcpdump -c 100 # 组合过滤器 tcpdump 'tcp and port 80 and host 192.168.1.1'wireshark/tshark - 网络协议分析器# 捕获特定接口的数据包 tshark -i eth0 # 捕获特定主机的数据包 tshark -f "host 192.168.1.1" # 捕获特定端口的数据包 tshark -f "port 80" # 保存捕获到文件 tshark -w capture.pcap # 读取捕获文件 tshark -r capture.pcap # 显示特定字段 tshark -T fields -e ip.src -e ip.dst # 显示统计信息 tshark -z io,stat,1 # 显示HTTP请求 tshark -Y "http.request" # 显示DNS查询 tshark -Y "dns.flags.response == 0" # 显示TCP SYN数据包 tshark -Y "tcp.flags.syn == 1" # 限制捕获数量 tshark -c 100 # 显示协议层次结构 tshark -Vngrep - 网络数据包内容搜索# 搜索HTTP数据包 ngrep -q -d eth0 "^GET|^POST" tcp port 80 # 忽略大小写 ngrep -i "error" tcp port 80 # 显示十六进制和ASCII输出 ngrep -x "login" tcp port 80 # 显示扩展信息 ngrep -W byline "password" tcp port 80 # 保存匹配到文件 ngrep -O /tmp/output.txt "user" tcp port 80 # 从文件读取 ngrep -I capture.pcap "admin" # 显示BPF过滤器 ngrep -d eth0 -e "GET" tcp port 80mtr - 网络诊断工具# 跟踪到主机 mtr google.com # 报告模式 mtr -r google.com # 指定报告循环次数 mtr -r -c 10 google.com # 指定包大小 mtr -s 1000 google.com # 使用TCP SYN mtr -T google.com # 使用UDP mtr -u google.com # 使用ICMP mtr -4 google.com # 指定间隔(秒) mtr -i 0.5 google.com # 显示IP地址 mtr -n google.com # 显示ASN信息 mtr -z google.comtraceroute - 路由跟踪# 跟踪到主机 traceroute google.com # 指定接口 traceroute -i eth0 google.com # 不解析主机名 traceroute -n google.com # 使用TCP traceroute -T google.com # 使用UDP traceroute -U google.com # 使用ICMP traceroute -I google.com # 指定端口 traceroute -p 80 google.com # 指定最大跳数 traceroute -m 30 google.com # 指定超时(秒) traceroute -w 5 google.com # 指定源地址 traceroute -s 192.168.1.10 google.comping - 网络连通性测试# 测试连通性 ping google.com # 指定次数 ping -c 5 google.com # 指定间隔(秒) ping -i 2 google.com # 指定超时(秒) ping -W 2 google.com # 指定包大小 ping -s 1000 google.com # 洪水ping ping -f google.com # 不解析主机名 ping -n google.com # 指定接口 ping -I eth0 google.com # 指定TTL ping -t 64 google.com # 静默输出 ping -q google.com# TCP SYN扫描 hping3 -S -p 80 target.com # TCP端口扫描 hping3 -S --scan 1-100 target.com # UDP扫描 hping3 -2 -p 53 target.com # ICMP ping hping3 -1 target.com # 发送自定义TCP标志 hping3 -SAFRUP -p 80 target.com # 指定源端口 hping3 -S -p 80 -s 53 target.com # 指定源IP hping3 -S -p 80 -a spoofed.ip.addr target.com # 发送自定义数据 hping3 -S -p 80 -d 100 target.com # 指定间隔时间(毫秒) hping3 -S -p 80 -i u1000 target.com # 监听模式 hping3 -9 HTTP --listen signatureab - Apache HTTP服务器基准测试工具# 发送100个请求，并发10个 ab -n 100 -c 10 http://example.com/ # 测试10秒 ab -t 10 -c 10 http://example.com/ # 显示响应时间分布 ab -n 100 -c 10 -e results.csv http://example.com/ # 显示每个请求的状态码 ab -v 2 -n 100 -c 10 http://example.com/ # 使用HTTP头 ab -H "Accept-Encoding: gzip" -n 100 -c 10 http://example.com/ # 使用HTTP认证 ab -A username:password -n 100 -c 10 http://example.com/ # 使用代理 ab -X proxy:port -n 100 -c 10 http://example.com/ # POST请求 ab -p post.txt -T application/x-www-form-urlencoded -n 100 -c 10 http://example.com/ # 使用Cookie ab -C "name=value" -n 100 -c 10 http://example.com/ # 不显示进度 ab -q -n 100 -c 10 http://example.com/wrk - HTTP基准测试工具# 运行基准测试 wrk -t12 -c400 -d30s http://example.com/ # 指定线程数 wrk -t4 http://example.com/ # 指定连接数 wrk -c100 http://example.com/ # 指定持续时间 wrk -d60s http://example.com/ # 使用脚本 wrk -s script.lua http://example.com/ # 使用HTTP头 wrk -H "User-Agent: wrk" http://example.com/ # 延迟统计 wrk --latency http://example.com/ # 超时设置 wrk -t2 -c100 --timeout 2s http://example.com/ # 使用HTTPS wrk https://example.com/siege - HTTP负载测试和基准测试工具# 并发用户数 siege -c 25 http://example.com/ # 指定时间 siege -t 1m http://example.com/ # 指定重复次数 siege -r 100 http://example.com/ # 使用URL文件 siege -f urls.txt # 随机URL siege -i -f urls.txt # 延迟时间 siege -d 10 http://example.com/ # 详细输出 siege -v http://example.com/ # 记录日志 siege -l -c 25 http://example.com/ # 互联网模式 siege -i -c 25 http://example.com/ # 基准测试模式 siege -b -c 25 http://example.com/h2load - HTTP/2 负载测试工具# 基本测试 h2load https://example.com/ # 指定并发客户端数 h2load -c 10 https://example.com/ # 指定总请求数 h2load -n 100 https://example.com/ # 指定每个客户端的请求数 h2load -m 10 https://example.com/ # 指定线程数 h2load -t 4 https://example.com/ # 指定超时(秒) h2load -T 5 https://example.com/ # 指定预热时间(秒) h2load -W 2 https://example.com/ # 指定连接窗口大小 h2load -w 65535 https://example.com/ # 指定头部 h2load -H "User-Agent: h2load" https://example.com/ # 指定请求方法 h2load -m POST https://example.com/jmeter - Java应用负载测试工具# 启动GUI jmeter # 运行测试计划 jmeter -n -t test.jmx # 生成报告 jmeter -n -t test.jmx -l results.jtl -e -o report # 指定属性 jmeter -n -t test.jmx -Jproperty=value # 指定JMeter属性文件 jmeter -n -t test.jmx -p jmeter.properties # 指定系统属性 jmeter -n -t test.jmx -D system.property=value # 远程测试 jmeter -n -t test.jmx -R host1,host2 # 指定日志文件 jmeter -n -t test.jmx -j jmeter.log # 指定JTL文件 jmeter -n -t test.jmx -l results.jtlperf - Linux性能分析工具# 列出事件 perf list # 分析命令 perf stat command # 记录性能数据 perf record command # 记录特定事件 perf record -e cpu-clock command # 报告性能数据 perf report # 实时分析 perf top # 分析特定PID perf record -p 1234 # 分析特定CPU perf record -C 0 command # 分析调用图 perf record -g command # 分析内核函数 perf record -k 1 commandstrace - 跟踪系统调用和信号# 跟踪命令 strace command # 跟踪特定进程 strace -p 1234 # 跟踪子进程 strace -f command # 跟踪特定系统调用 strace -e open,read,write command # 统计系统调用 strace -c command # 显示时间戳 strace -t command # 显示相对时间戳 strace -r command # 保存输出到文件 strace -o output.txt command # 显示文件描述符 strace -y command # 显示字符串长度 strace -s 256 commandltrace - 库调用跟踪# 跟踪命令 ltrace command # 跟踪特定进程 ltrace -p 1234 # 跟踪子进程 ltrace -f command # 跟踪特定库调用 ltrace -e malloc+free command # 统计库调用 ltrace -c command # 显示时间戳 ltrace -t command # 显示相对时间戳 ltrace -r command # 保存输出到文件 ltrace -o output.txt command # 显示参数详情 ltrace -a 10 command # 显示字符串长度 ltrace -s 256 commandftrace - 函数跟踪器# 启用跟踪器 echo function > /sys/kernel/debug/tracing/current_tracer # 设置跟踪函数 echo schedule > /sys/kernel/debug/tracing/set_ftrace_filter # 启用函数图跟踪器 echo function_graph > /sys/kernel/debug/tracing/current_tracer # 启用跟踪 echo 1 > /sys/kernel/debug/tracing/tracing_on # 禁用跟踪 echo 0 > /sys/kernel/debug/tracing/tracing_on # 清除跟踪缓冲区 echo > /sys/kernel/debug/tracing/trace # 查看跟踪输出 cat /sys/kernel/debug/tracing/trace # 设置跟踪缓冲区大小 echo 4096 > /sys/kernel/debug/tracing/buffer_size_kbbpftrace - Linux eBPF跟踪语言# 单行程序 bpftrace -e 'BEGIN { printf("Hello, World!\n"); }' # 跟踪系统调用 bpftrace -e 'tracepoint:syscalls:sys_enter_open { printf("%s %s\n", comm, str(args->filename)); }' # 跟踪函数调用 bpftrace -e 'kprobe:do_sys_open { printf("%s %s\n", comm, str(arg1)); }' # 跟踪用户空间函数 bpftrace -e 'uprobe:/bin/bash:readline { printf("readline() called\n"); }' # 统计系统调用 bpftrace -e 'tracepoint:syscalls:sys_enter_* { @[probe] = count(); }' # 显示直方图 bpftrace -e 'tracepoint:syscalls:sys_exit_read /args->ret > 0/ { @bytes = hist(args->ret); }' # 使用脚本文件 bpftrace script系统监控和性能分析BCC - BPF编译器集合# 跟踪系统调用 execsnoop # 跟踪文件打开 opensnoop # 跟踪TCP连接 tcpconnect # 跟踪块I/O biosnoop # 跟踪页面缓存 cachestat # 跟踪文件系统缓存 cachetop # 跟踪CPU使用情况 profile # 跟踪内存泄漏 memleak # 跟踪网络数据包 trace 'net:netif_receive_skb "len=%d", len' # 跟踪内核函数 trace 'do_sys_open "%s", arg2'sysdig - 系统活动监控# 捕获系统事件 sysdig # 保存到文件 sysdig -w capture.scap # 读取捕获文件 sysdig -r capture.scap # 过滤进程 sysdig proc.name=nginx # 过滤系统调用 sysdig evt.type=open # 过滤文件 sysdig fd.name contains /etc/passwd # 显示容器信息 sysdig -pc # 显示网络连接 sysdig -c netstat # 显示系统调用统计 sysdig -c topscalls # 显示I/O统计 sysdig -c topfilesDTrace - 动态跟踪框架# 跟踪系统调用 dtrace -n 'syscall:::entry { @[probefunc] = count(); }' # 跟踪进程执行 dtrace -n 'proc:::exec-success { trace(execname); }' # 跟踪文件I/O dtrace -n 'io:::start { printf("%s %s\n", execname, args[2]->fi_pathname); }' # 跟踪函数调用 dtrace -n 'pid$target::function:entry { @[probefunc] = count(); }' -p PID # 跟踪用户堆栈 dtrace -n 'syscall:::entry { @[ustack()] = count(); }' # 跟踪内核堆栈 dtrace -n 'syscall:::entry { @[stack()] = count(); }' # 显示直方图 dtrace -n 'syscall::read:return { @["read size"] = quantize(arg0); }' # 按时间聚合 dtrace -n 'profile:::tick-1sec { @["syscalls per second"] = count(); }'SystemTap - 诊断和监控工具# 跟踪系统调用 stap -e 'probe syscall.* { printf("%s -> %s\n", execname(), probefunc()) }' # 跟踪特定进程 stap -e 'probe syscall.* { if (pid() == 1234) printf("%s\n", probefunc()) }' # 跟踪函数调用 stap -e 'probe kernel.function("*") { printf("%s\n", probefunc()) }' # 跟踪函数返回 stap -e 'probe kernel.function("*").return { printf("%s return\n", probefunc()) }' # 统计系统调用 stap -e 'global calls; probe syscall.* { calls[probefunc()]++ } probe timer.s(5) { foreach (i in calls+) printf("%s: %d\n", i, calls[i]); exit() }' # 跟踪内存分配 stap -e 'probe kernel.function("kmalloc") { printf("%s allocates %d bytes\n", execname(), $size) }' # 跟踪网络数据包 stap -e 'probe netfilter.ip.local_in { printf("incoming packet: %s\n", ip_daddr_string()) }'性能监控最佳实践 基线监控 在系统负载正常时收集性能数据 建立关键指标的基准值 定期更新基准以反映系统变化 分层监控方法 硬件层: CPU、内存、磁盘、网络 操作系统层: 进程、线程、系统调用 应用层: 应用特定指标、响应时间 服务层: 端到端性能、用户体验 警报设置 基于基准值和历史趋势设置阈值 避免警报疲劳，设置合理的阈值 实施分级警报系统 关注异常模式而非单一指标 性能数据可视化 使用仪表板展示关键指标 将相关指标分组显示 显示历史趋势和预测 支持钻取功能以便深入分析 性能调优策略 识别瓶颈: CPU、内存、I/O、网络 逐步调整: 一次只改变一个参数 验证改进: 使用基准测试验证调整效果 文档记录: 记录所有更改及其影响 资源规划 基于历史趋势预测资源需求 考虑业务增长和季节性变化 定期审查资源分配 实施自动扩展策略 持续改进 定期审查监控策略 更新监控工具和技术 根据新出现的问题调整监控范围 与开发团队合作优化应用性能 通过掌握这些系统监控和性能分析工具，Linux系统管理员和开发人员可以全面了解系统行为，快速识别性能瓶颈，并有效优化系统性能。从基本的资源监控到深入的系统调用跟踪，这些工具提供了不同层次的可见性，帮助解决从简单到复杂的性能问题。记住，性能分析是一个迭代过程，需要不断学习和实践。随着系统复杂性的增加，熟练使用这些工具并理解它们提供的数据变得越来越重要。通过系统的方法和适当的工具选择，可以确保系统以最佳状态运行，满足业务需求。
从故障中学习：2023年十大云服务中断事件复盘与防范策略
在数字化转型的浪潮中，云服务已经成为众多企业IT基础设施的核心。然而，即使是AWS、Azure、GCP这样的科技巨头，也难免遭遇服务中断的尴尬时刻。2023年，我们见证了多起影响深远的云服务故障，这些事件不仅造成了巨大的经济损失，更给我们敲响了警钟。作为运维人员，与其惧怕故障，不如从中学习。本文将深入剖析2023年发生的十大云服务中断事件，探究其技术根因，梳理故障处理流程，并提炼出切实可行的防范策略，帮助你构建更具韧性的系统架构。1. AWS美东区域大规模网络中断（2023年3月）故障概述3月8日，AWS美东-1区域（弗吉尼亚北部）经历了长达4小时的网络连接问题，影响了包括Netflix、Slack和众多金融服务在内的上千家企业。技术原因分析故障源于AWS骨干网络的路由配置更新过程中的一个错误。本应分批次推送的配置变更被一次性应用，导致网络设备超出处理能力，引发级联故障。故障处理时间线 09:12 EST：监控系统首次检测到网络异常 09:28 EST：AWS确认服务中断并开始调查 10:15 EST：初步确定故障范围和影响 11:40 EST：确认根因并开始回滚配置 13:05 EST：大部分服务恢复 13:45 EST：服务完全恢复 关键决策点AWS团队面临的关键决策是是否立即回滚所有配置变更。最初他们尝试隔离问题区域，但这一策略效果有限。最终决定全面回滚是转折点。防范措施 渐进式部署：网络配置变更必须采用更小批次、更慢节奏的部署方式 自动回滚机制：设置明确的健康度量标准，当达到阈值时自动回滚 区域隔离设计：应用架构需跨区域部署，确保单区域故障不会导致全局服务中断 2. Microsoft Azure全球身份验证服务故障（2023年6月）故障概述6月5日，Microsoft Azure的身份验证服务出现全球性中断，持续约6小时，影响了依赖Microsoft Entra ID（前身为Azure Active Directory）的几乎所有Microsoft云服务，包括Microsoft 365、Teams和Dynamics。技术原因分析故障源于一次数据库架构更新，该更新包含了一个未被测试环境捕获的SQL查询性能问题。当部署到生产环境后，这个问题导致身份验证请求的处理时间急剧增加，最终使系统不堪重负。故障处理时间线 08:15 UTC：系统监控报告身份验证延迟增加 08:45 UTC：Microsoft确认全球性服务中断 10:30 UTC：确定根本原因 12:00 UTC：开始部署修复方案 14:20 UTC：服务开始分区域恢复 16:30 UTC：全球服务完全恢复 关键决策点微软面临的关键决策是是否回滚数据库架构更新。考虑到回滚可能带来的数据一致性风险，他们选择了前向修复策略，优化问题查询并增加资源。防范措施 渐进式发布：关键服务更新应采用金丝雀发布模式，先在小范围内验证 性能测试增强：将极端负载条件下的性能测试纳入发布流程 多区域降级策略：设计服务降级机制，确保即使身份验证服务出问题，核心业务功能仍能有限运行 3. Google Cloud Platform存储服务中断（2023年8月）故障概述8月17日，GCP的Cloud Storage服务在多个区域经历了近5小时的性能下降和间歇性不可用，影响了依赖该服务的众多应用，包括多家大型媒体和电商平台。技术原因分析故障源于一次存储元数据服务的扩容操作。工程团队低估了新旧节点间数据同步的网络带宽需求，导致元数据服务过载，进而影响了数据访问路径。故障处理时间线 13:45 UTC：监控系统检测到存储延迟异常 14:10 UTC：确认多区域受影响，启动事故响应 15:30 UTC：确定根因为元数据同步问题 16:45 UTC：实施临时缓解措施，限制非关键流量 18:20 UTC：开始恢复正常服务能力 19:30 UTC：服务完全恢复 关键决策点Google团队面临的关键决策是是否中止正在进行的扩容。他们选择了一个折中方案：暂停扩容但不回滚已完成的部分，同时增加网络资源以支持同步需求。防范措施 容量规划改进：更全面地评估扩容操作对相关服务的影响 限流机制优化：实现更精细的请求优先级机制，确保关键操作在高负载下仍能执行 元数据服务分片：将元数据服务进一步分片，减少单点故障影响范围 4. Cloudflare DNS解析服务中断（2023年7月）故障概述7月4日，Cloudflare的DNS解析服务经历了约2小时的全球性中断，影响了数百万依赖其DNS服务的网站和应用。技术原因分析故障源于一次防DDoS规则更新，其中包含了一个正则表达式匹配条件，在特定DNS查询模式下会触发灾难性回溯（catastrophic backtracking），导致CPU使用率飙升，使DNS解析服务不堪重负。故障处理时间线 14:34 UTC：监控系统报告DNS解析成功率下降 14:47 UTC：确认全球性影响，启动事故响应 15:15 UTC：确定问题与最新部署的DDoS规则有关 15:38 UTC：开始回滚问题规则 16:09 UTC：回滚完成，服务开始恢复 16:45 UTC：服务完全恢复正常 关键决策点Cloudflare团队迅速决定全面回滚新部署的规则集，而不是尝试修复有问题的规则。这一决定大大缩短了恢复时间。防范措施 正则表达式审核：实施专门的正则表达式性能审核流程，防止灾难性回溯 规则隔离部署：DDoS规则更新应分批次、分区域部署，并设置自动回滚触发条件 负载测试增强：将极端查询模式纳入DNS服务的负载测试场景 5. Fastly CDN全球中断（2023年5月）故障概述5月23日，Fastly CDN服务经历了约1小时的全球性中断，导致依赖其服务的众多高流量网站，包括Reddit、纽约时报和亚马逊等暂时无法访问。技术原因分析故障源于一次配置变更，该变更意外触发了一个之前未发现的软件缺陷，导致全球配置分发系统崩溃。当配置分发系统失败时，边缘节点无法获取最新配置，进入了降级模式，拒绝处理大部分请求。故障处理时间线 09:47 UTC：监控系统检测到全球性流量下降 09:58 UTC：确认服务中断，启动事故响应 10:27 UTC：确定根因为配置分发系统故障 10:42 UTC：开始实施修复方案 11:00 UTC：服务开始分区域恢复 11:35 UTC：服务完全恢复 关键决策点Fastly团队面临的关键决策是如何在配置分发系统不可用的情况下更新边缘节点配置。他们启用了一个很少使用的紧急配置推送机制，绕过了常规分发系统。防范措施 配置变更沙箱：建立隔离的配置测试环境，模拟全球分发过程 灰度发布增强：配置变更应先应用于非关键区域，确认稳定后再全球推广 应急配置通道：确保备用配置分发机制定期测试和演练 6. MongoDB Atlas数据库服务中断（2023年10月）故障概述10月5日，MongoDB Atlas云数据库服务在AWS美东-1和美东-2区域经历了约3小时的服务降级，影响了数千个数据库集群，导致读写延迟显著增加。技术原因分析故障源于一次底层存储系统的自动扩容操作。扩容过程触发了存储层的一个竞态条件，导致元数据更新冲突，进而引发IO操作排队堆积。故障处理时间线 15:20 UTC：监控系统报告数据库延迟异常 15:35 UTC：确认大规模服务影响，启动事故响应 16:10 UTC：确定问题与存储扩容相关 16:45 UTC：实施临时缓解措施，暂停所有自动扩容 17:30 UTC：开始手动干预受影响集群 18:40 UTC：服务完全恢复 关键决策点MongoDB团队面临的关键决策是是否强制重启受影响的数据库集群。考虑到数据一致性风险，他们选择了更保守的方法：暂停扩容并等待系统自愈，只对严重受影响的集群进行定向干预。防范措施 扩容节流机制：实施更严格的扩容速率限制，避免同时触发过多扩容操作 存储隔离：改进存储架构，减少元数据操作的互相影响 预警指标优化：增加更多早期预警指标，提前发现潜在的存储压力问题 7. Salesforce服务中断（2023年9月）故障概述9月12日，Salesforce经历了一次影响多个实例的服务中断，持续约5小时，导致客户无法访问CRM数据和应用。技术原因分析故障源于一次数据中心网络设备固件更新。更新过程中，一个关键的负载均衡器集群出现了配置不一致，导致部分流量被错误路由，引发服务不可用。故障处理时间线 13:05 UTC：监控系统检测到多个实例的可用性下降 13:20 UTC：确认大范围服务中断，启动事故响应 14:00 UTC：确定问题与网络设备更新相关 15:30 UTC：开始回滚有问题的固件更新 17:15 UTC：服务开始逐步恢复 18:40 UTC：服务完全恢复 关键决策点Salesforce团队面临的关键决策是是否回滚固件更新或尝试修复配置不一致。他们选择了两手准备：一方面开始回滚，同时尝试修复配置问题。最终回滚证明是更快的解决方案。防范措施 网络变更窗口优化：将网络设备更新安排在低流量时段，并延长观察期 配置一致性验证：实施自动化工具，确保负载均衡器集群配置一致 流量切换测试：定期测试流量快速切换能力，确保备用路径可用 8. GitHub服务中断（2023年7月）故障概述7月18日，GitHub经历了约4小时的服务中断，影响了代码托管、CI/CD流水线和GitHub Pages等多项服务。技术原因分析故障源于一次数据库架构变更，该变更导致了一个关键索引的性能下降。当高峰期流量到来时，数据库查询延迟急剧增加，最终导致连接池耗尽，引发级联故障。故障处理时间线 14:25 UTC：监控系统报告API响应时间异常 14:40 UTC：确认服务广泛受影响，启动事故响应 15:15 UTC：确定数据库性能为根本原因 16:30 UTC：实施临时缓解措施，增加连接池容量并优化查询 17:45 UTC：开始部署索引修复 18:50 UTC：服务完全恢复 关键决策点GitHub团队面临的关键决策是是否回滚架构变更。考虑到变更已经应用了几天，回滚风险较高，他们选择了前向修复策略，优化问题索引并增加资源。防范措施 数据库变更验证：增强数据库架构变更的性能测试流程，特别是高负载场景 渐进式索引更新：实施更安全的索引更新策略，允许新旧索引并存过渡 自适应连接池：实现更智能的连接池管理，能根据数据库性能自动调整 9. Stripe支付处理系统故障（2023年11月）故障概述11月8日，Stripe支付处理系统经历了约2.5小时的服务降级，导致部分支付交易处理延迟或失败，影响了全球数千商家。技术原因分析故障源于一次数据库分片迁移操作。迁移过程中，一个关键监控阈值设置不当，导致系统错误地将正常的负载波动判断为异常，触发了自动故障转移，引发了不必要的服务中断。故障处理时间线 16:05 UTC：监控系统触发自动故障转移 16:10 UTC：支付成功率开始下降 16:25 UTC：确认服务异常，启动事故响应 17:00 UTC：确定根因为错误触发的故障转移 17:45 UTC：开始手动恢复原分片配置 18:40 UTC：服务完全恢复 关键决策点Stripe团队面临的关键决策是是否继续完成故障转移或回滚到原配置。在确认原始分片实际健康后，他们决定回滚故障转移，同时临时禁用自动故障转移机制。防范措施 监控阈值调优：重新评估和调整关键监控指标的阈值，减少误报 故障转移前置验证：增加故障转移前的额外验证步骤，确认问题确实存在 分片迁移优化：改进分片迁移流程，减少对生产流量的影响 10. Slack服务中断（2023年12月）故障概述12月4日，Slack通讯平台经历了约3小时的服务中断，用户无法发送消息或加载频道，影响了全球数百万企业用户的日常沟通。技术原因分析故障源于一次消息队列系统的配置更新。更新中包含了一个参数错误，导致消息处理节点之间的协调机制失效，引发消息堆积和处理延迟。故障处理时间线 09:15 UTC：监控系统检测到消息延迟增加 09:30 UTC：确认服务广泛受影响，启动事故响应 10:00 UTC：确定问题与最近的配置更新有关 10:45 UTC：开始回滚配置更新 11:20 UTC：配置回滚完成，开始清理积压消息 12:30 UTC：服务完全恢复 关键决策点Slack团队面临的关键决策是如何处理积压的消息。他们决定优先处理实时消息，同时逐步清理积压队列，避免系统再次过载。防范措施 配置验证增强：实施更严格的配置验证流程，特别是对关键协调参数 消息优先级机制：实现更细粒度的消息优先级处理机制，确保关键消息不受影响 负载测试场景扩展：增加更多消息处理异常场景的测试覆盖 总结与防范之道回顾这些重大云服务中断事件，我们可以发现一些共同模式： 配置变更是最大风险源：近半数故障源于配置变更，特别是那些影响全局系统的变更。 自动化系统的双刃剑：自动扩缩容、自动故障转移等机制在异常情况下可能做出错误决策。 级联故障普遍存在：初始问题往往很小，但通过依赖链迅速放大。 回滚vs修复的两难选择：事故处理中最困难的决策往往是选择回滚还是前向修复。 关键防范措施 变更管理增强 实施更严格的变更审核流程 采用渐进式部署和灰度发布 建立配置变更的自动验证机制 制定明确的变更窗口和回滚标准 系统弹性设计 实现更细粒度的故障隔离 设计优雅降级机制 增强跨区域容灾能力 避免单点依赖，特别是控制平面组件 监控与响应优化 建立更全面的早期预警指标 优化自动化响应逻辑，减少误判 定期进行故障演练，验证恢复流程 实施混沌工程实践，主动发现弱点 架构改进 减少关键路径上的单点依赖 实现更松耦合的服务设计 建立更可靠的状态管理机制 优化数据一致性模型，允许短暂不一致 企业应对云服务中断的最佳实践作为依赖云服务的企业，我们也需要做好准备，以应对可能的服务中断：1. 多云战略 关键服务跨云部署：核心业务功能应考虑跨多个云服务提供商部署 避免云锁定：尽量使用标准化接口，减少对特定云厂商专有服务的依赖 统一管理平面：建立跨云的统一监控和管理能力 2. 本地应急能力 关键数据本地缓存：确保核心数据有本地副本 降级运行模式：设计离线或有限功能模式，在云服务不可用时仍能提供基本服务 定期演练切换：定期测试从云环境切换到本地应急环境的能力 3. 业务连续性规划 明确RTO和RPO：为不同业务功能定义明确的恢复时间目标和恢复点目标 制定详细的应急预案：针对不同类型的云服务中断，准备相应的应急响应流程 建立沟通机制：确保在服务中断期间能够及时向内部团队和外部客户传达状态更新 4. 合同和SLA管理 理解云服务SLA：充分了解云服务提供商的服务级别协议，包括补偿条款 协商关键条款：对业务关键应用，考虑与云服务提供商协商更严格的SLA 建立责任矩阵：明确云服务提供商和自身团队在不同场景下的责任边界 未来趋势与展望随着云计算的持续发展，我们可以预见几个关键趋势将影响服务可靠性：1. AI驱动的故障预测与自愈人工智能和机器学习正被越来越多地应用于预测潜在故障并自动采取缓解措施。这些系统能够识别微妙的异常模式，并在问题扩大前采取行动。2. 零信任架构的普及随着系统变得更加分布式，零信任安全模型将成为标准，这不仅提高安全性，也有助于限制故障传播范围。3. 边缘计算与混合架构边缘计算的兴起将创造更分散的架构，减少对中央云服务的完全依赖，从而提高整体系统韧性。4. 自适应系统设计未来的系统将更加智能地适应变化的条件，动态调整资源分配、请求路由和故障响应策略，无需人工干预。结语云服务中断是不可避免的现实，但通过深入理解这些事件的根本原因和应对策略，我们可以构建更具韧性的系统。真正的目标不是追求零故障（这是不切实际的），而是确保故障发生时能够快速恢复，并将业务影响降到最低。记住，每一次服务中断都是一次宝贵的学习机会。通过系统性地分析这些事件，不断改进我们的设计、流程和响应机制，我们能够逐步构建出更可靠、更有弹性的云基础设施。在数字化转型的时代，服务可靠性不再仅仅是技术问题，而是直接影响业务连续性和客户信任的关键因素。希望本文的分析和建议能够帮助您的组织更好地应对云计算时代的挑战。
在运维的时候经常会遇到网络问题，排查常常如同在迷雾中寻找真相，而 tcpdump 就是那盏照亮前行道路的明灯。一、TCPDump（一）工具简介TCPDump 是一款运行在 Linux 平台上的经典抓包工具，其全称为"dump the traffic on a network"。它能够根据使用者的需求，精准捕获网络中传输的数据包，并对其进行深入分析。无论是运维人员排查网络故障，还是安全专家检测潜在威胁，TCPDump 都是他们手中不可或缺的利器。（二）功能特性TCPDump 的功能十分强大，主要体现在以下几个方面：• 全面捕获：它可以捕获网络层、传输层等各层协议的数据包，无论是常见的 TCP、UDP，还是 ICMP 等协议，都逃不过它的"法眼"。• 灵活过滤：支持基于主机、网卡、端口等多种条件的过滤规则，还能通过逻辑运算符（如 and、or、not）组合条件，精准筛选出目标数据包。• 深度分析：捕获到的数据包可以与 Wireshark 等工具结合，进行更深入的分析，帮助用户快速定位问题根源。（三）必备知识基础想要熟练运用 TCPDump，你需要掌握以下两方面的知识：• Linux 操作系统：由于 TCPDump 是基于 Linux 系统的命令行工具，因此对 Linux 的基本操作和常用命令需有一定了解。• 网络知识：熟悉 OSI 七层网络模型以及常用网络协议，这样才能准确解读捕获到的报文信息。二、TCPDump 的安装与基本用法（一）安装方法在大多数 Linux 发行版中，tcpdump 已经预装在系统中。若未安装，可依据你的系统类型选择相应的安装命令。• 基于 Debian 的系统（如 Ubuntu）： apt-get update apt-get install tcpdump• 基于 RPM 的系统（如 CentOS）： yum update yum install tcpdump（二）基本用法在终端中输入tcpdump命令即可启动抓包，但不加参数会捕获所有接口上的所有数据包，输出量巨大。因此，通常会结合一些参数来精准捕获目标数据。1.指定网络接口使用-i参数指定网络接口，例如：tcpdump -i eth1该命令会捕获eth1接口上的所有数据包。2.捕获特定数量的数据包通过-c参数设定捕获的数据包数量，如：tcpdump -c 10 -i eth0此命令会捕获eth0接口上的前 10 个数据包。3.使用过滤器TCPDump 的过滤功能是其一大亮点，可依据不同条件筛选数据包。• 按端口过滤：port 9999，仅捕获端口号为 9999 的数据包。• 按协议过滤：ip捕获 IP 数据包；arp捕获 ARP 请求和响应；icmp捕获 ICMP 数据包。• 按源/目的地址过滤：src捕获来自指定源的数据包；dst捕获发送到指定目的地的数据包；src or dst捕获来自指定源或发送到指定目的地的数据包；src and dst捕获同时满足指定源和目的地的数据包。此外，还可搭配-nn参数，避免解析主机名和端口名，直接显示 IP 地址和端口号，减少查找和显示时间；-v参数增加输出的详细程度，展示更多包头信息；-e参数包含数据链路层的头部信息，便于查看源 MAC 地址和目的 MAC 地址。三、实战应用：TCPDump 的高级用法（一）深入解析捕获的数据包以一个 TCP 连接请求的数据包为例，其输出信息如下：20:16:13.153123 fe:fc:fe:5e:fd:0c > 9c:3a:9a:af:53:d9, ethertype IPv4 (0x0800), length 74: (tos 0x0, ttl 64, id 34804, offset 0, flags [DF], proto TCP (6), length 60) 10.115.20.110.35838 > 93.205.23.98.9999: Flags [S], cksum 0x943e (incorrect -> 0x861d), seq 3473184019, win 29200, options [mss 1460,sackOK,TS val 2444563175 ecr 0,nop,wscale 7], length 0• 时间戳：20:16:13.153123，表示数据包捕获的具体时间。• 链路层信息：fe:fc:fe:5e:fd:0c > 9c:3a:9a:af:53:d9，源 MAC 地址和目的 MAC 地址；ethertype IPv4 (0x0800)，表明这是一个 IPv4 数据包。• 网络层信息：tos 0x0，服务类型；ttl 64，生存时间；id 34804，标识；offset 0，偏移量；flags [DF]，不分片标志；proto TCP (6)，协议为 TCP。• 传输层信息：10.115.20.110.35838 > 93.205.23.98.9999，源 IP 地址和端口，以及目的 IP 地址和端口；Flags [S]，SYN 标志，表示这是一个 TCP 三次握手过程中的连接请求；cksum 0x943e (incorrect -> 0x861d)，校验和；seq 3473184019，序列号；win 29200，窗口大小；options部分列出了多种 TCP 选项，如最大报文段长度（mss）、允许选择确认（sackOK）等。通过对这些信息的解读，我们可以清晰地了解数据包的来源、去向、所属协议以及所处的通信阶段，进而为网络问题的排查提供有力依据。（二）结合 Wireshark 进行深度分析虽然 TCPDump 能够捕获并初步解析数据包，但在面对复杂的网络问题时，仅靠其输出的信息可能还不够。此时，我们可以将捕获的数据包保存为文件，再借助 Wireshark 进行更深入的分析。首先，使用-w参数将捕获的数据包保存为文件，例如：tcpdump -i eth0 -w capture.pcap该命令会将eth0接口上的数据包捕获并保存到capture.pcap文件中。然后，打开 Wireshark，选择"打开"菜单，加载刚才保存的capture.pcap文件。在 Wireshark 中，你可以更直观地查看数据包的详细信息，包括各层协议的详细字段、数据包的重组情况等。此外，Wireshark 还提供了丰富的分析工具和功能，如协议分析、流量统计、追踪流等，能够帮助你从宏观到微观全方位剖析网络通信情况，快速定位问题所在。四、TCPDump 的高级过滤技巧1.时间范围过滤（通过脚本实现）虽然 TCPDump 本身不直接支持时间范围过滤，但可以通过结合外部脚本（如awk或grep）来实现。以下是一个基于awk的示例，用于筛选特定时间段内的数据包：• 捕获数据包并保存到文件： tcpdump -i eth0 -w capture.pcap• 读取并筛选特定时间段的数据包： 假设你想筛选从10:00到11:00之间的数据包，可以使用以下命令： tcpdump -r capture.pcap | awk '$1 >= "10:00:00" && $1 <= "11:00:00"'这里$1表示tcpdump输出中的时间戳字段。awk会根据时间范围筛选出符合条件的数据包。2.复杂协议过滤TCPDump 支持对多种协议进行过滤，你可以在过滤表达式中组合多种协议条件。例如，如果你想捕获所有 TCP 和 UDP 数据包，但排除 ICMP 数据包，可以使用以下命令：tcpdump 'tcp or udp and not icmp'3.基于特定协议字段过滤TCPDump 允许你根据协议字段进行过滤。例如，如果你想捕获所有 TCP 数据包的 SYN 数据包，可以使用以下命令：tcpdump 'tcp[tcpflags] & (tcp-syn) != 0'这里tcp[tcpflags]表示 TCP 标志字段，tcp-syn是 SYN 标志的位掩码。五、实战案例：常见网络问题排查1.检测网络延迟如果你怀疑网络中存在延迟问题，可以通过捕获 ICMP 数据包来检测。例如，捕获所有 ICMP 数据包：tcpdump icmp通过分析这些数据包的往返时间（RTT），可以判断是否存在网络延迟问题。2.检测端口扫描如果你怀疑有恶意用户在扫描你的服务器端口，可以通过捕获特定端口的数据包来检测。例如，捕获所有尝试连接到端口 22（SSH）的数据包：tcpdump tcp and dst port 22通过分析这些数据包的源 IP 地址和连接频率，可以判断是否存在端口扫描行为。3.分析 TCP 三次握手TCP 三次握手是建立 TCP 连接的关键过程。你可以通过捕获特定的 TCP 标志来分析三次握手过程。例如，捕获所有 SYN 和 ACK 数据包：tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-ack) != 0'通过分析这些数据包，可以检查三次握手是否正常完成，是否存在连接失败的情况。4.根据ip过滤# 根据源ip进行过滤 $ tcpdump -i eth2 src 192.168.10.100 # 根据目标ip进行过滤 $ tcpdump -i eth2 dst 192.168.10.200六、优化与注意事项1.性能优化• 限制捕获数据包的数量：使用-c参数限制捕获的数据包数量，避免过多数据包导致性能下降。 tcpdump -c 100 -i eth0• 限制捕获数据包的大小：使用-s参数限制捕获的数据包大小，减少内存占用。 tcpdump -s 100 -i eth02.安全注意事项• 权限问题：TCPDump 需要 root 权限才能运行，确保在安全的环境中使用。• 数据保护：捕获的数据包可能包含敏感信息，确保数据的安全存储和传输。七、总结TCPDump 是一个功能强大的网络抓包工具，通过灵活的过滤表达式和丰富的功能特性，可以帮助你快速定位和解决网络问题。无论是简单的数据包捕获，还是复杂的网络问题分析，TCPDump 都能为你提供有力支持。希望本文的详细介绍和实战案例能帮助你更好地掌握 TCPDump 的使用方法，提升你的网络运维能力。如果你在使用 TCPDump 过程中遇到任何问题，欢迎在评论区留言，我会为你解答。同时，如果你觉得这篇文章对你有帮助，别忘了点赞和分享哦！
背景收到用户反馈一台aws ec2实例在一周前突然无法通过公网访问对应的端口，但是22端口可以访问，本片也适用于其他场景排查排查思路系统层面排查检查系统防火墙#检查系统防火墙是否禁用,并关闭 #centos系统 systemctl status firewalld systemctl stop firewalld #ubantu 系统 systemctl status ufw systemctl stop ufw检查selinux是否开启可以通过以下几种方法检查SELinux是否开启：1. 使用sestatus命令运行以下命令：/usr/sbin/sestatus -v如果输出显示SELinux status: enabled，则表示SELinux已开启。2. 使用getenforce命令运行以下命令：getenforce如果输出为Enforcing，表示SELinux处于强制执行模式；如果输出为Permissive，表示SELinux处于宽容模式；如果输出为Disabled，则表示SELinux未开启。3. 查看配置文件查看/etc/selinux/config文件：cat /etc/selinux/config文件中SELINUX的值可以是以下三种之一： enforcing：表示SELinux处于强制执行模式。 permissive：表示SELinux处于宽容模式，仅记录违规行为但不强制执行。 disabled：表示SELinux未开启。 通过以上方法，可以准确判断SELinux是否开启及其运行模式。通过tcpdump抓包要通过 tcpdump 抓取指定端口的流量并判断流量情况，可以按照以下步骤操作：1. 确定网络接口首先，需要确定要抓包的网络接口。可以使用以下命令列出所有可用的网络接口：sudo tcpdump -D或者：sudo tcpdump --list-interfaces选择一个合适的网络接口，例如 eth0 或 ens33。2. 抓取指定端口的流量使用 tcpdump 的 port 关键字可以抓取指定端口的流量。例如，要抓取通过端口 80（HTTP）的流量，可以使用以下命令：sudo tcpdump -i eth0 port 80如果你只想抓取一定数量的数据包，可以加上 -c 选项。例如，抓取 10 个数据包：sudo tcpdump -i eth0 -c 10 port 80如果需要将抓取的数据包保存到文件中，可以使用 -w 选项：sudo tcpdump -i eth0 port 80 -w output.pcap这样，抓取的数据包会被保存到 output.pcap 文件中，后续可以用 tcpdump 或其他工具（如 Wireshark）进行分析。3. 分析流量情况抓取到的数据包可以通过 tcpdump 的输出直接查看，也可以用 -r 选项读取保存的文件进行分析。例如：sudo tcpdump -r output.pcap还可以使用更详细的输出选项，如 -v 或 -vv，来获取更多信息。4. 使用高级过滤条件如果需要更复杂的过滤条件，可以组合多个参数。例如，抓取特定主机和端口之间的流量：sudo tcpdump -i eth0 host 192.168.1.100 and port 80或者，抓取特定协议（如 TCP）且带有特定标志位（如 SYN）的数据包：sudo tcpdump -i eth0 tcp[tcpflags] & tcp-syn != 0注意：tcpdump是工作在系统防火墙之前的，要是连tcpdump都没有抓到流量，只能说明流量没有进入到网卡中。本案例就是这个情况，所以接下来对aws 云平台层面进行排查。运营商层面排查为了排除是否是运营商封禁了ip和端口。我们将弹性ip解绑到其他实例，发现可以正常访问。所以排除此项。AWS 云平台层面排查安全组安全组是AWS中非常重要的安全控制机制，用于控制进出EC2实例的流量。 安全组规则：确认安全组是否允许所需的入站和出站流量。例如，如果需要访问Web服务，应确保安全组允许端口80（HTTP）或443（HTTPS）的入站流量。 依赖关系：检查是否有其他资源（如RDS实例、负载均衡器、Lambda函数）依赖该安全组。如果有依赖关系，可能需要先调整相关资源的配置。 默认安全组：默认安全组通常不允许删除，但可以清空其规则。如果默认安全组的规则过于宽松或限制过多，可能导致流量问题。 网络ACL网络ACL（访问控制列表）是另一个控制VPC中流量的工具，与安全组不同，它工作在网络层面，可以控制子网级别的流量。 规则检查：查看网络ACL的规则，确认是否允许所需的流量通过。例如，如果网络ACL拒绝了特定端口的流量，即使安全组允许，流量也会被阻止。 状态检查：确保网络ACL处于激活状态，并且规则的优先级设置正确。 路由表路由表决定了VPC中流量的去向，排查路由表时，重点关注以下内容： 路由条目：检查路由表中的条目是否正确配置。例如，确保子网的默认路由指向正确的网关，否则可能导致流量无法正确转发。 关联检查：确认路由表是否正确关联到所需的子网。如果子网未正确关联到路由表，流量将无法按照预期进行路由。 防火墙除了AWS的安全组和网络ACL外，实例上可能还运行着本地防火墙（如iptables或firewalld）。 防火墙状态：检查本地防火墙是否启用，以及其规则是否允许所需的流量。例如，使用systemctl status firewalld命令检查firewalld的状态。 规则配置：查看防火墙规则，确认是否允许特定端口的流量。如果防火墙规则过于严格，可能会阻止合法流量。 官方邮件查看AWS官方邮件是获取问题相关信息的重要途径，尤其是当遇到无法通过常规排查解决的问题时： 支持邮件：检查AWS官方邮件，查看是否有支持团队发送的通知或警告。这些邮件可能包含关于实例问题的详细信息或建议的解决方案。 工单反馈：如果已经提交了工单，及时查看工单的回复。AWS支持团队可能会提供更具体的排查步骤或解决方案。 GuardDuty安全扫描开启GuardDuty安全扫描，看下机器是否被入侵结果我们检查了安全组、网络ACL、路由表、防火墙都没发现问题，初步判断可能是被平台封禁了。开始翻查邮件，终于在邮件中找到被封禁告知。到此可以确认是实例成为肉鸡对别人进行ddos后被官方封禁了。最后通过GuardDuty安全扫描发现多个高危告警。还是提醒大家，要做好安全措施呀！！！
前言客户宝塔面板故障，一直无法启动，计划异机迁移，本次实验两台机器，一台模拟bt损坏的web，一台为新的web实验环境weba：充当宝塔故障的机器webb：充当异机恢复的机器背景说明：项目是php项目，所以要进行异机数据恢复的话，只需要拷贝数据库数据和站点目录就好了，本实验以wordpress作为运行项目#这个是宝塔数据库保存目录 /www/server/data #站点目录，保存对应需要备份的站点 /www/wwwroot登录webb，webb采用相同配置的机器，并安装宝塔，同时安装好mysql和nginx，php等基础环境#将weba中的/www/server/data拷贝到webb的/www/server/data，执行 chown -R mysql:mysql /www/server/data修改所属组 #chown -R mysql:mysql /www/server/data拷贝完成后在数据库，同步数据库，选择从服务器同步数据库。同步完成后会发现有之前的项目数据库存在之后再添加站点这里跟目录选择我们需要恢复的项目站点，域名按正常配置，不创建数据库。php版本可以之后安装本项目为wordpress，所以还是需要修改，数据库中的站点url和home地址，将这两个改为当前服务器的地址。修改完成后，输入地址访问，页面正常，异机恢复成功