首页
提效神器
常用运维脚本汇总
电子书阅读
推荐
电子书阅读
事物管理
Search
1
安装docker时报错container-selinux >= 2:2.74
207 阅读
2
rsync命令介绍(可替代rm删除巨量文件)
168 阅读
3
kubernetes集群各组件安装过程汇总
163 阅读
4
docker 镜像加速器配置,daemon.json文件详解
148 阅读
5
docker search命令提示i/o timeout的解决方案
106 阅读
运维
自动化运维
数据库
容器与k8s
环境
云计算
脚本
ai
登录
/
注册
Search
标签搜索
命令
nginx
zabbix
Mingrui
累计撰写
113
篇文章
累计收到
8
条评论
首页
栏目
运维
自动化运维
数据库
容器与k8s
环境
云计算
脚本
ai
页面
提效神器
常用运维脚本汇总
电子书阅读
推荐
电子书阅读
事物管理
搜索到
88
篇与
的结果
2025-12-08
rsync常用脚本案例分享
案例1:网站文件同步我们需要将本地开发的网站文件同步到生产服务器。(这招也可以用在云计算磁盘需要缩容的过程中,毕竟云硬盘,多开1G都是要花钱的,利用率最大化才是省钱王道)# 基本同步命令 rsync -avz --delete /var/www/html/ root@192.168.1.100:/var/www/html/ # 排除不需要同步的文件 rsync -avz --delete \ --exclude='*.log' \ --exclude='cache/' \ --exclude='.git/' \ /var/www/html/ root@192.168.1.100:/var/www/html/这个命令会:递归同步整个网站目录保持文件属性和时间戳压缩传输数据删除目标目录中多余的文件排除日志文件、缓存目录和Git仓库案例2:数据库备份同步对于数据库备份文件的异地同步,我们通常需要更谨慎的处理。#!/bin/bash # 数据库备份同步脚本 BACKUP_DIR="/backup/mysql" REMOTE_HOST="backup-server.company.com" REMOTE_DIR="/data/mysql-backup" LOG_FILE="/var/log/backup-sync.log" # 执行同步 rsync -avz --progress \ --log-file=$LOG_FILE \ --timeout=300 \ --bwlimit=10000 \ $BACKUP_DIR/ root@$REMOTE_HOST:$REMOTE_DIR/ # 检查同步结果 if [ $? -eq 0 ]; then echo "$(date): 备份同步成功" >> $LOG_FILE else echo "$(date): 备份同步失败" >> $LOG_FILE # 发送告警邮件 echo "备份同步失败,请检查" | mail -s "备份告警" admin@company.com fi案例3:配置文件分发在集群环境中,经常需要将配置文件分发到多台服务器。#!/bin/bash # 配置文件分发脚本 CONFIG_DIR="/etc/app-config" SERVERS=("web01" "web02" "web03" "web04") for server in "${SERVERS[@]}"; do echo "正在同步配置到 $server..." rsync -avz --dry-run \ --exclude='*.bak' \ $CONFIG_DIR/ root@$server:$CONFIG_DIR/ # 确认无误后执行实际同步 read -p "确认同步到 $server 吗?(y/n): " confirm if [ "$confirm" = "y" ]; then rsync -avz \ --exclude='*.bak' \ $CONFIG_DIR/ root@$server:$CONFIG_DIR/ echo "$server 同步完成" fi done案例4:监控同步状态#!/bin/bash # rsync监控脚本 SYNC_LOG="/var/log/rsync-monitor.log" LOCK_FILE="/var/run/rsync-sync.lock" # 检查是否已有rsync进程在运行 if [ -f "$LOCK_FILE" ]; then echo "$(date): rsync进程已在运行" >> $SYNC_LOG exit 1 fi # 创建锁文件 echo $$ > $LOCK_FILE # 执行同步并记录时间 START_TIME=$(date +%s) echo "$(date): 开始同步" >> $SYNC_LOG rsync -avz --stats /source/ user@remote:/destination/ 2>&1 | tee -a $SYNC_LOG END_TIME=$(date +%s) DURATION=$((END_TIME - START_TIME)) echo "$(date): 同步完成,耗时 ${DURATION} 秒" >> $SYNC_LOG # 清理锁文件 rm -f $LOCK_FILE 案例5:配合inotify实现实时同步inotify是Linux内核提供的文件系统事件监控机制,可以监控文件的创建、修改、删除等操作。配合rsync使用,就能实现准实时的文件同步。#inotify-tools这个工具包 # CentOS/RHEL yum install inotify-tools # Ubuntu/Debian apt-get install inotify-tools#监控脚本 #!/bin/bash SRC_DIR="/var/www/html" DEST="user@remote_host:/var/www/html/" DELAY=5 SYNC_LOCK="/tmp/rsync.lock" inotifywait -mr --format '%w %f %e' -e modify,create,delete,move $SRC_DIR | while read DIR FILE EVENT do echo "检测到文件变化: $DIR$FILE ($EVENT)" # 如果已经有同步任务在等待,就跳过 if [ -f $SYNC_LOCK ]; then continue fi # 创建锁文件 touch $SYNC_LOCK # 延迟执行同步 ( sleep $DELAY echo "开始同步..." rsync -av --delete $SRC_DIR/ $DEST rm -f $SYNC_LOCK echo "同步完成" ) & done注意:inotify监控的文件数量是有限制的,可以通过调整内核参数来增加:{callout color="#17507D"}echo 8192 > /proc/sys/fs/inotify/max_user_watches{/callout}案例6:定时备份脚本#!/bin/bash # 完整的定时备份脚本 /usr/local/bin/auto-backup.sh # 配置参数 SOURCE_DIRS=("/var/www" "/etc" "/home") BACKUP_SERVER="backup.company.com" BACKUP_BASE="/backup/$(hostname)" LOG_DIR="/var/log/backup" RETENTION_DAYS=7 # 创建日志目录 mkdir -p $LOG_DIR # 获取当前时间 DATE=$(date +%Y%m%d_%H%M%S) LOG_FILE="$LOG_DIR/backup_$DATE.log" # 记录开始时间 echo "=== 备份开始: $(date) ===" > $LOG_FILE # 检查网络连通性 if ! ping -c 3 $BACKUP_SERVER > /dev/null 2>&1; then echo "错误: 无法连接到备份服务器 $BACKUP_SERVER" >> $LOG_FILE exit 1 fi # 备份每个目录 for dir in "${SOURCE_DIRS[@]}"; do if [ -d "$dir" ]; then echo "正在备份 $dir..." >> $LOG_FILE # 创建远程目录 ssh root@$BACKUP_SERVER "mkdir -p $BACKUP_BASE$(dirname $dir)" # 执行同步 rsync -avz --delete \ --exclude='*.tmp' \ --exclude='*.log' \ --exclude='cache/' \ --timeout=3600 \ --log-file=$LOG_FILE \ $dir/ root@$BACKUP_SERVER:$BACKUP_BASE$dir/ if [ $? -eq 0 ]; then echo "$dir 备份成功" >> $LOG_FILE else echo "$dir 备份失败" >> $LOG_FILE # 发送告警 echo "目录 $dir 备份失败" | mail -s "备份失败告警" admin@company.com fi else echo "警告: 目录 $dir 不存在" >> $LOG_FILE fi done # 清理旧日志 find $LOG_DIR -name "backup_*.log" -mtime +$RETENTION_DAYS -delete echo "=== 备份结束: $(date) ===" >> $LOG_FILE # 设置定时任务 # crontab -e # 0 2 * * * /usr/local/bin/auto-backup.sh案例7:代码部署脚本#!/bin/bash # 代码部署脚本 PROJECT_NAME="myapp" LOCAL_PATH="/var/jenkins/workspace/$PROJECT_NAME" SERVERS=("web01.company.com" "web02.company.com") REMOTE_PATH="/var/www/$PROJECT_NAME" BACKUP_PATH="/var/www/backup/$PROJECT_NAME" echo "开始部署 $PROJECT_NAME..." # 检查本地代码是否存在 if [ ! -d "$LOCAL_PATH" ]; then echo "错误: 本地代码路径不存在" exit 1 fi # 部署到每台服务器 for server in "${SERVERS[@]}"; do echo "正在部署到 $server..." # 创建备份 ssh root@$server " mkdir -p $BACKUP_PATH if [ -d $REMOTE_PATH ]; then cp -r $REMOTE_PATH $BACKUP_PATH/$(date +%Y%m%d_%H%M%S) fi " # 同步代码 rsync -avz --delete \ --exclude='.git/' \ --exclude='node_modules/' \ --exclude='*.log' \ $LOCAL_PATH/ root@$server:$REMOTE_PATH/ if [ $? -eq 0 ]; then echo "$server 部署成功" # 重启服务 ssh root@$server "systemctl restart $PROJECT_NAME" # 健康检查 sleep 5 if curl -f http://$server/health > /dev/null 2>&1; then echo "$server 服务启动正常" else echo "$server 服务启动异常,正在回滚..." # 回滚操作 LATEST_BACKUP=$(ssh root@$server "ls -t $BACKUP_PATH | head -1") ssh root@$server " rm -rf $REMOTE_PATH cp -r $BACKUP_PATH/$LATEST_BACKUP $REMOTE_PATH systemctl restart $PROJECT_NAME " fi else echo "$server 部署失败" fi done echo "部署完成"案例8:#同步状态监控 #!/bin/bash # rsync状态监控脚本 MONITOR_LOG="/var/log/rsync-monitor.log" ALERT_EMAIL="admin@company.com" check_rsync_status() { local log_file=$1 local max_age_hours=2 if [ ! -f "$log_file" ]; then echo "告警: 同步日志文件不存在" return 1 fi # 检查日志文件是否太旧 if [ $(find "$log_file" -mmin +$((max_age_hours * 60)) | wc -l) -gt 0 ]; then echo "告警: 同步日志超过 $max_age_hours 小时未更新" return 1 fi # 检查是否有错误 if grep -q "rsync error\|failed\|No such file" "$log_file"; then echo "告警: 同步过程中发现错误" return 1 fi return 0 } # 检查各个同步任务 SYNC_LOGS=("/var/log/web-sync.log" "/var/log/db-sync.log" "/var/log/config-sync.log") for log in "${SYNC_LOGS[@]}"; do if ! check_rsync_status "$log"; then echo "$(date): $log 检查失败" >> $MONITOR_LOG # 发送告警邮件 tail -50 "$log" | mail -s "Rsync同步告警: $(basename $log)" $ALERT_EMAIL fi done
2025年12月08日
2 阅读
0 评论
0 点赞
2025-12-08
针对部分特定场景非常好用的命令推荐
下面这些工具,在特定场景下,能极大改善工作效率。对付海量文件和日志ripgrep(rg) 查找速度快,来自底层优势:Rust 实现 + SIMD 加速自动跳过 .gitignore 标记的垃圾文件多线程狂扫正则前缀表优化示例:rg "OutOfMemoryError" /var/log/ #按语言过滤 rg "timeout" --type java系统优化类fd —— find 语法的救赎 简化find命令冗长的参数配置fd '*.log' fd log | xargs grep "error"bat —— cat 的高颜值进化 特点:自动语法高亮自动分页Git diff 配色可以换主题less +F —— 实时日志查看的隐藏 Boss less +F application.log实时追踪随时退出想翻历史就翻/ 搜索超丝滑iotop —— 谁在往磁盘暴力输出? 线上系统突然卡住时,第一反应往往是:“是不是写磁盘了?”iotop 一跑:iotop哪个进程在疯狂刷 I/O,一秒立现。再配合:strace -p PID通常十分钟能锁定罪魁祸首。dstat —— 把系统四大件一次性摊开 vmstat、iostat、netstat 虽然都好,但分开看信息太散。dstat -cdnmCPU、磁盘、网络、内存一屏展示。 排查性能问题时能省一堆来回跳命令的时间。pv —— 管道操作的“进度条神器” 压一个 40GB 的日志,你肯定体验过那种:“它到底是卡住了,还是在努力?我怎么一点底都没有?”pv 会给你一个心理安慰:pv huge.log | gzip > huge.log.gz实时速度、耗时、剩余时间,全部告诉你。ncdu —— 帮你抓出磁盘空间的黑洞 du 沉得住气,但速度慢。 ncdu 直接图形化展示文件大小,效果非常爽。ncdu /你能瞬间看到哪些日志像吹气球一样膨胀。很多线上磁盘爆掉的问题就是靠它找出的。网络问题侦探工具nmap —— 检查端口开放情况的利器 扫服务器端口:nmap -sV 10.0.0.12部署错误、端口冲突都能很快看出来。tshark —— 无界面的 Wireshark 线上服务器没图形界面时,它就是唯一的抓包依靠。tshark -i eth0 -f "port 8080" 想抽 HTTP 请求头:tshark -Y "http.request" -T fields -e http.host -e http.user_agent适合查微妙的网络抖动或协议异常。iperf3 —— 网络玄学问题的终结者 很多时候服务连接超时并不是代码问题,而是——链路抖了。# 服务器: iperf3 -s #客户端: iperf3 -c 10.0.0.12看到带宽从 1Gbps 掉到 50Mbps 的那一瞬间,我就知道不是程序锅,是交换机要加班了。
2025年12月08日
4 阅读
0 评论
0 点赞
2025-12-08
容器间通信延迟高的排查流程
故障现象单个服务很快,但组合起来速度就慢。具体表现:{callout color="#EACDD1"}页面加载从2秒延迟到5秒接口响应延迟明显偶尔出现超时错误数据库查询正常应用资源正常(CPU、内存等)带宽充足{/callout}问题定位1.抓包分析进入api网关容器(本例中使用nginx容器作为入口网关),对相应端口的数据进行抓包分析。 # 抓包命令 docker exec nginx tcpdump -i eth0 -nn -tttt 'tcp port 8080' -w /tmp/capture.pcap #tcpdump: 使用网络抓包工具 tcpdump #-i eth0: 指定监听的网络接口为 eth0 #-nn: 不解析主机名和端口号(直接显示IP和数字端口) #-tttt: 使用完整格式的时间戳(年月日时分秒) #'tcp port 8080': 过滤条件,只捕获 TCP 协议且目标或源端口为 8080 的流量 #-w /tmp/capture.pcap: 将捕获的数据包写入到容器内的 /tmp/capture.pcap 文件,而不是显示在终端 # Wireshark分析结果 时间线: 00:00.000 请求到达nginx 00:12.000 nginx → service-a (12ms延迟) 00:18.000 service-a收到 (6ms) 00:25.000 service-a → service-b (7ms) 00:45.000 service-b收到 (20ms !!!) 00:78.000 service-b处理完成 (33ms) 00:98.000 service-a收到响应 (20ms !!!) 00:105.000 nginx收到 (7ms) 00:130.000 返回给用户 (25ms) 总计:130ms 2.发现问题容器间通信延迟异常高,尤其是 service-a 和 service-b 之间。3.分析问题为什么容器间通信会有20ms延迟?{callout color="#EACDD1"}正常情况:同一主机的容器通信应该<1ms我们的却有20-30ms原因:Docker默认使用Bridge网络模式数据要经过:容器 → veth → bridge → NAT → veth → 容器每一层都有损耗网络路径:容器A → veth0 → docker0网桥 → iptables规则(300+条) → NAT转换 → veth1 → 容器B 损耗来源:veth虚拟网卡:3-5ms网桥转发:2-3msiptables遍历:5-8msNAT转换:1-2msconntrack查表:1-2ms总损耗:12-20ms{/callout}docker网络模式对比1.bridge模式(默认)# 测试 docker run -d --name app1 alpine sleep 3600 docker run -d --name app2 alpine sleep 3600 docker exec app1 apk add iputils docker exec app1 ping -c 100 app2 # 结果 rtt min/avg/max/mdev = 0.082/0.125/0.245/0.031 ms 特点:延迟:0.08-0.25ms(容器间)吞吐量:950Mbps优点:隔离性好缺点:性能一般2.Host模式docker run -d --name app-host --network host alpine sleep 3600 docker exec app-host ping -c 100 127.0.0.1 # 结果 rtt min/avg/max/mdev = 0.015/0.022/0.045/0.008 ms特点:延迟:0.015-0.045ms吞吐量:10Gbps优点:性能最好缺点:端口冲突、安全性差3.Overlay模式(跨主机)docker network create -d overlay testnet docker run -d --name app1 --network testnet alpine sleep 3600 # 在另一台主机 docker run -d --name app2 --network testnet alpine sleep 3600 # 测试 docker exec app1 ping -c 100 app2 # 结果 rtt min/avg/max/mdev = 0.245/0.512/1.245/0.156 ms特点:延迟:0.5-30ms(取决于网络)吞吐量:700Mbps(VXLAN损耗)优点:跨主机、K8s支持缺点:性能较差、CPU占用高4.Macvlan模式docker network create -d macvlan \ --subnet=192.168.1.0/24 \ -o parent=eth0 macnet docker run -d --name app1 --network macnet --ip 192.168.1.100 alpine docker exec app1 ping -c 100 192.168.1.101 # 结果 rtt min/avg/max/mdev = 0.052/0.085/0.156/0.022 ms 特点:延迟:0.05-0.15ms吞吐量:950Mbps优点:性能好、独立IP缺点:配置复杂性能对比模式延迟(ms)吞吐量隔离性易用性适用场景Bridge0.08-0.25950Mbps好高开发测试Host0.02-0.0510Gbps差高单体应用Overlay0.5-30700Mbps好中k8s集群Macvlan0.05-0.15950Mbps好低独立IP结论:性能:Host > Macvlan > Bridge > Overlay易用:Bridge = Host > Overlay > Macvlan生产推荐:看场景选择优化方案方案1,内核参数调优cat >> /etc/sysctl.conf <<EOF # TCP优化 net.ipv4.tcp_congestion_control = bbr net.ipv4.tcp_fastopen = 3 net.ipv4.tcp_slow_start_after_idle = 0 # 缓冲区 net.core.rmem_max = 134217728 net.core.wmem_max = 134217728 net.ipv4.tcp_rmem = 4096 87380 134217728 net.ipv4.tcp_wmem = 4096 65536 134217728 # 连接跟踪 net.netfilter.nf_conntrack_max = 262144 # 队列 net.core.netdev_max_backlog = 5000 net.core.somaxconn = 4096 EOF sysctl -p测试结果:{callout color="#EACDD1"}优化前:延迟:30ms吞吐量:942MbpsCPU:45%优化后:延迟:26.5ms (-12%)吞吐量:1.05Gbps (+11%)CPU:42% (-7%){/callout}评价: 效果一般,但零成本,推荐做。方案2,简化iptables规则# 发现问题 iptables -L -n | wc -l # 输出:347行规则! # 每个数据包都要遍历这347条规则 # 优化:禁用Docker的iptables管理 cat > /etc/docker/daemon.json <<EOF { "iptables": false, "ip-forward": true } EOF systemctl restart docker # 手动添加最小规则集 iptables -A FORWARD -i docker0 -o docker0 -j ACCEPT iptables -A FORWARD -i docker0 ! -o docker0 -j ACCEPT # 现在只有50条规则测试结果:{callout color="#EACDD1"}优化前:iptables规则:347条延迟:26.5ms优化后:iptables规则:50条延迟:22.2ms (-16%){/callout}评价: 效果明显,但要小心配置错误导致网络不通。方案3:使用自定义网络# Docker默认bridge性能差 # 自定义网络更好 docker network create \ --driver bridge \ --opt com.docker.network.bridge.name=br-prod \ --opt com.docker.network.driver.mtu=1500 \ prod-network # 使用自定义网络 docker run -d --name app --network prod-network myapp # 可以直接用服务名通信 docker exec app1 ping app2 # 无需IP测试结果:{callout color="#EACDD1"}默认bridge:DNS解析:5-10ms延迟:0.125ms自定义network:DNS解析:1-2ms延迟:0.098ms (-22%){/callout}评价: 简单有效,强烈推荐。方案4:增加conntrack表(效果:解决抖动) 高并发时连接跟踪表会满 # 导致丢包和延迟抖动 echo 262144 > /proc/sys/net/netfilter/nf_conntrack_max # 永久生效 cat >> /etc/sysctl.conf <<EOF net.netfilter.nf_conntrack_max = 262144 net.netfilter.nf_conntrack_buckets = 65536 EOF sysctl -p测试结果(10000并发):{callout color="#EACDD1"}优化前:丢包率:15%延迟:30-80ms(抖动大)优化后:丢包率:0%延迟:22-24ms(稳定){/callout}评价: 高并发场景必做。方案5:使用ipvlan# ipvlan绕过网桥,直接三层路由 docker network create -d ipvlan \ --subnet=192.168.100.0/24 \ -o parent=eth0 \ -o ipvlan_mode=l2 \ ipvlan-net docker run -d --name app --network ipvlan-net --ip 192.168.100.10 myapp测试结果:{callout color="#EACDD1"}Bridge模式:rtt min/avg/max/mdev = 0.082/0.125/0.245/0.031 msipvlan模式:rtt min/avg/max/mdev = 0.045/0.068/0.115/0.018 ms改善:-46%{/callout}评价: 效果很好,但需要管理IP地址。
2025年12月08日
3 阅读
0 评论
0 点赞
2025-12-06
OpenResty
OpenResty系统信息OpenResty在表ngx.conf里提供了六个功能接口,可以获取自身的一些信息:debug:是否算Debug版本prefix:工作目录,即启动时“-p”参数指定的目录nginx_version:大版本号,即内部NGINX的版本号nginx_configure:编译的使用的配置参数subsystem:当前所在的子系统,取值为“http”或“stream”ngx_lua_version:当前所在子系统的版本号注意: prefix和nginx_configure这两个接口是函数的形式。接口的示例代码如下:ngx.say(nginx.config.debug) ngx.say(nginx.config.prefix()) ngx.say(nginx.config.nginx_version) ngx.say(nginx.config.nginx_configure()) ngx.say(nginx.config.subsystem()) ngx.say(nginx.config.ngx_lua_version())OpenResty运行日志函数ngx.log(log_level)记录罗OpenResty的运行日志,用法类似Lua的标准库函数print,可以接受任意多个参数,记录任意信息。print()=ngx.NOTICEngx.log的第一个参数是日志级别。ngx.STDERR:日志直接打印到标准输出,最高级别的日志ngx.EMERG:发生了紧急情况(emergency),需要立即处理ngx.ALERT:发生了严重错误,可能需要报警给运维系统ngx.CRIT:发生了严重错误(critical)ngx.ERR:普通的错误,业务中发生了意外ngx.WARN:警告信息,业务正常,但可能需要检查警告的来源ngx.NOTICE:提醒信息,仅仅算告知,通常可以忽略ngx.INFO:一般的信息ngx.DEBUG:调试可用的信息,只有debug版本才会启用业务逻辑关键点INFO或者WARN,捕获error级别的错误信息OpenResty时间日期对于Web服务来说,能够随时获取正确的时间与日期是非常重要的。OpenResty为此提供罗很多时间日期相关的函数,可以满足绝大多数场景的应用。这些时间日期函数不会引发昂贵的系统调用(ngx.updatetime除外),几乎没有成本。所以在应用程序中应对尽量使用它们操作时间而不是使用Lua标准库里的os。当前时间ngx.say(ngx.today()) #本地时间,格式是“yyyy-mm-dd” ngx.say(ngx.localtime()) #本地时间,格式是“yyyy-mm-dd hh:mm:ss” ngx.say(ngx.utctime()) #utc时间,格式是“yyyy-mm-dd hh:mm:ss”时间戳ngx.time ngx.now时间戳
2025年12月06日
8 阅读
0 评论
0 点赞
2025-12-04
一套脚本标准化所有新服务器
当拿到一台新服务器时,第一件事永远是根据实际业务来对服务器进行标准化设置。脚本特点智能系统识别 自动识别RHEL系(CentOS, RHEL, openEuler等)和Debian系(Ubuntu, Debian等)系统根据不同系统使用对应的包管理器(yum/dnf/apt)全面标准化配置高速软件源配置(阿里云镜像)基础运维工具安装Vim高级配置(语法高亮、Tab设置等)Shell别名与环境变量优化精确时间同步(chrony)内核参数优化(文件描述符、网络参数等)企业级审计系统(history增强+auditd)个性化登录欢迎界面SSH安全加固健壮性与错误处理Root权限检查配置文件备份机制兼容性处理详细的进度提示与状态反馈企业级安全特性操作审计追踪(谁、何时、从哪、做了什么)sudo特权操作监控SSH安全加固系统关键文件监控使用方法将脚本保存为server_init.sh赋予执行权限: chmod +x server_init.sh以root身份运行: sudo ./server_init.sh 警告: 脚本会修改系统关键配置,建议先在测试环境验证。特别是SSH安全加固部分会禁用密码登录,务必先配置好SSH密钥认证。这个脚本已经全面优化,可以适用于企业环境中大部分Linux服务器的标准化初始化需求,让运维工作更加高效、安全、规范。下载地址:{abtn icon="fa-download" color="#ff6800" href="https://www.xiaohetao.xyz/usr/uploads/2025/12/467932042.shh" radius="" content="点击下载"/}1.配置高速软件源使用的https://linuxmirrors.cn/提供的脚本bash <(curl -sSL https://linuxmirrors.cn/main.sh) \ --source mirrors.aliyun.com \ --protocol https \ --use-intranet-source false \ --install-epel true \ --backup true \ --upgrade-software false \ --clean-cache false \ --ignore-backup-tips2.安装运维工具包安装必需工具#centos系统基础工具包 dnf insta1l -y vim-enhanced #增强版Vim(带彩色高亮) dnf instal1 -y wget cur1 #下载工具(必须) dnfinsta11 -y net-tools #网络工具(ifconfig、netstat) dnfinsta11 -y rzsz #文件上传下载(比scp简单) dnf install -y tree # 树状显示目录 dnf install -y bash-completion #命令自动补全(新手神器) dnf install -y git # 代码管理 dnf insta11-y htop iotop iftop #增强版任务/i0/网络管理器Ubuntu系统把dnf换成apt即可。让工具更好用的配置# 1. Vim配置:从“勉强能用”到“得心应手” echo "正在配置Vim:告别默认vi的‘地狱模式’..." cat > /etc/vimrc <<'EOF' " 基础必改项 set number " 显示行号 - 没有行号的编辑器是在猜谜吗? syntax enable " 语法高亮 - 一眼看出字符串、注释、关键字 set tabstop=2 " Tab宽度2空格(根据团队规范调整) set expandtab " Tab转空格 - 保证代码在所有人机器上显示一致 " 搜索增强 set incsearch " 边输入边高亮 set hlsearch " 保持高亮直到下次搜索 " 防止粘贴乱码 if has("mouse") set mouse=a " 启用鼠标(可以拖动、滚轮) endif set paste " 自动识别粘贴模式 EOF # 2. Shell别名:把复杂命令变成“肌肉记忆” echo "正在植入‘命令快捷键’..." cat >> /etc/bashrc <<'EOF' # ==== 安全防护 ==== alias rm='rm -i' # 删除文件时确认 alias cp='cp -i' # 覆盖文件时确认 alias mv='mv -i' # 覆盖文件时确认 # ==== 效率革命 ==== # 经典ls进化史:l → la → ll → llt alias l='ls -CF' alias la='ls -A' alias ll='ls -lhF --color=auto --time-style=long-iso' alias llt='ll -t' # 按时间排序,查日志必备 # ==== 网络诊断快捷键 ==== alias ports='ss -tulanp' # 比netstat更快的现代工具 alias listen='ports | grep LISTEN' # 只看监听端口 alias myip='curl -s icanhazip.com' # 最快获取公网IP # ==== 目录快跳 ==== alias ..='cd ..' alias ...='cd ../..' alias ....='cd ../../..' alias cdlog='cd /var/log' alias cdetc='cd /etc/sysconfig"' EOF 让配置立即生效 source /etc/bashrc 2>/dev/null || true # 定义欢迎脚本路径 WELCOME_SCRIPT="/etc/profile.d/welcome.sh"创建 welcome.sh 内容# 只在交互式 shell 中显示(避免 ssh 执行命令时干扰) if [[ $- != *i* ]]; then return fi # 获取真实用户(支持 sudo/su) get_real_user() { if [[ -n "$SUDO_USER" ]]; then echo "${SUDO_USER}(via sudo)" elif [[ -f /proc/self/loginuid ]] && [[ "$(cat /proc/self/loginuid)" != "4294967295" ]]; then local uid=$(cat /proc/self/loginuid) id -un "$uid" 2>/dev/null || whoami else whoami fi } # 获取源IP get_client_ip() { if [[ -n "$SSH_CLIENT" ]]; then echo "$SSH_CLIENT" | awk '{print $1}' elif [[ -n "$SSH_CONNECTION" ]]; then echo "$SSH_CONNECTION" | awk '{print $3}' else echo "localhost" fi } # 显示欢迎信息(仅首次登录显示一次,避免重复) if [ -z "$WELCOME_SHOWN" ]; then export WELCOME_SHOWN=1 echo "" echo "******************************************************************" echo "* 🌟 欢迎登录企业运维服务器! *" echo "* *" echo "* 🔒 安全审计提示: *" echo "* • 操作用户: $(get_real_user)" echo "* • 登录时间: $(date '+%Y-%m-%d %H:%M:%S')" echo "* • 源 IP 地址: $(get_client_ip)" echo "* *" echo "* ⚠️ 重要声明: *" echo "* 本系统已启用操作审计,所有命令将记录: *" echo "* - 执行者身份(穿透 sudo/su) *" echo "* - 执行时间 *" echo "* - 源 IP 地址 *" echo "* - 工作目录和命令内容 *" echo "* *" echo "* 📊 实时系统状态: *" # 磁盘使用(根分区) # 磁盘使用(根分区) DISK_ROOT=$(df -h / 2>/dev/null | awk 'NR==2 {print $5}') # 内存使用率 MEM_USED=$(free 2>/dev/null | awk 'NR==2 {printf "%.0f%%", $3/$2 * 100}') # CPU 负载 LOAD=$(uptime 2>/dev/null | awk -F'load average:' '{print $2}' | xargs) # 登录用户数 USERS=$(who 2>/dev/null | wc -l) echo "* 💾 根分区使用: ${DISK_ROOT:-N/A}" echo "* 🧠 内存使用率: ${MEM_USED:-N/A}" echo "* ⚡ 系统负载: ${LOAD:-N/A}" echo "* 👥 当前登录: ${USERS} 个会话" echo "* *" echo "* 📞 安全支持: security@gaokun.edu *" echo "******************************************************************" echo "" fi EOF # 设置脚本权限(必须可执行) chmod +x "$WELCOME_SCRIPT" # 验证文件是否存在且可执行 if [[ -f "$WELCOME_SCRIPT" && -x "$WELCOME_SCRIPT" ]]; then echo "✅ 成功部署登录欢迎提示!" echo "📍 文件位置: $WELCOME_SCRIPT" echo "" echo "💡 效果预览(当前用户):" # 手动 source 测试(不退出当前会话) source "$WELCOME_SCRIPT" echo "" echo "📌 说明:" echo "1. 所有新登录用户将自动看到此提示" echo "2. 提示包含实时系统状态(磁盘、内存、负载)" echo "3. 支持 sudo/su 身份穿透识别" echo "4. 不会影响非交互式命令(如 scp、ssh cmd)" else echo "❌ 部署失败!请检查权限和磁盘空间" exit 1 fi echo "🎯 配置已生效!来体验几个‘效率魔法’:" echo "1. 输入 'll' - 看看和普通ls的差别" echo "2. 输入 'cdetc' - 直接跳到配置目录" echo "3. 输入 'listen' - 秒看所有监听端口" 3.配置时间同步chrony -- 传统的NTPd 更适合虚拟化和云环境,启动快,收敛快,抗网络抖动性更强的工具配置时间同步可以解决下面的问题:日志时间错乱证书验证失败分布式系统数据不一致定时任务不执行等等以下配置仅供参考,事实上chrony配置比较简单。# 配置国内时间服务器(替换默认的国外服务器) cat > /etc/chrony.conf <<'EOF' server ntp.aliyun.com iburst server ntp1.aliyun.com iburst server ntp2.aliyun.com iburst # 允许同步的网段(根据实际情况调整) allow 192.168.0.0/16 # 时间误差过大时的处理方式 makestep 1.0 3 # 启用硬件时间同步 rtcsync # 日志配置 logdir /var/log/chrony EOF # 启动并设置开机自启 systemctl enable --now chronyd # 强制立即同步 chronyc -a makestep # 查看同步状态 echo "当前时间:$(date)" echo "时间源状态:" chronyc sources -v 4.内核优化警惕“'To many open files”,部分案例:Elasticsearch官方强制要求调高FD限制Elasticsearch在处理大量索引和分片时,会同时打开成千上万个文件(每个段文件、每个网络连接都占一个FD)。其官方文档明确警告:“The default limit of 1024 open file descriptors is far too low for Elasticsearch.You must increase it to at least 65536.”Elasticsearch官方文档:File Descriptors无数用户在部署ES后遭遇写入失败、节点离群,根因都是未调整此配置。Redis因FD耗尽拒绝新客户端连接Redis为每个客户端连接、主从复制流、AOF文件等分配FD。当 ulimit -n 过低时,即使内存充足,Redis也会报错:1Error accepting client connection: accept: Too many open filesRedis官方FAQ专门列出此问题,并指导用户修改 /etc/security/limits.conf :Redis Optimization Guide – File DescriptorsGitLab 2017年重大事故中,FD限制拖慢恢复在GitLab因误删生产数据库导致全球中断的著名事件中,团队在恢复备份时遇到严重瓶颈。官方复盘报告指出:The restore process was slowed by system limits on open files.”(恢复过程因系统对打开文件数量的限制而变慢)— GitLab Post-Mortem, Feb 2017虽然FD不是主因,但它显著延长了故障恢复时间,凸显了系统级调优的重要性。特别是一些机器没有提前进行调优的时候,到了关键时刻不一定能想得起来。内核优化# 1. 修改进程可打开文件数(解决‘Too many open files’) cat >> /etc/security/limits.conf <<'EOF' # 所有用户的基础限制 * soft nofile 65535 # 软限制(可临时超过) * hard nofile 65535 # 硬限制(最大上限) # 进程数限制(防止fork炸弹) * soft nproc 65535 * hard nproc 65535 # root用户的限制(通常更高) root soft nofile 100000 root hard nofile 100000 EOF # 2. 修改系统级限制(影响所有进程) cat >> /etc/sysctl.conf <<'EOF' # 增加系统最大文件打开数 fs.file-max = 1000000 # 增加TCP连接数(应对高并发) net.core.somaxconn = 65535 net.ipv4.tcp_max_syn_backlog = 65535 # 加快TCP回收(应对短连接) net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 # 注意:在内核4.12+已移除,这里仅作演示 # 增加内存分配(应对大量连接) net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 EOF # 3. 立即生效(无需重启) sysctl -p 修改内核是个 危险操作 ,配错了可能导致系统无法启动。一定要做好测试, 灰度上线发布 。5.审计日志与系统安全加固为什么需要操作审计?1、安全合规要求2、故障排查刚需(运维必须会)3、团队管理利器(主管必须懂)怎么做?History增强+Auditd系统审计echo "🔍 [6/6] 正在部署‘企业级运维天眼系统’:谁?在什么时间?从哪来?做了什么?" # ============================================ # 第一部分:增强的History审计(记录命令) # ============================================ cat >> /etc/profile <<'EOF' # ==================== 智能History审计配置 ==================== # 获取登录用户的真实IP(SSH登录记录IP,本地登录记录localhost) USER_IP=$(who -u am i 2>/dev/null | awk '{print $NF}' | sed -e 's/[()]//g') if [[ -z "$USER_IP" ]]; then # 如果是本地登录,尝试获取主机IP USER_IP=$(hostname -i 2>/dev/null || echo "localhost") fi # 核心:判断是否通过sudo切换身份 # $SUDO_USER:如果通过sudo执行命令,这个变量记录原始用户 if [[ -n "$SUDO_USER" ]]; then REAL_USER="$SUDO_USER(as root)" # 记录真实用户+权限提升标记 else REAL_USER=$(whoami) # 记录当前用户 fi # 设置History格式:时间 | 真实用户 | IP地址 | 工作目录 | 执行的命令 export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S | $REAL_USER | $USER_IP | \$(pwd) | " export HISTSIZE=20000 # 内存中保存20000条命令 export HISTFILESIZE=40000 # 历史文件保存40000条命令 # 重要:防止某些命令被忽略(如空格开头) export HISTCONTROL=ignoredups:ignorespace # 设置不想被记录的命令(这些命令太常见,记录会浪费空间) export HISTIGNORE="ls:ll:la:cd:pwd:exit:history:h" # 关键配置:实时同步history到文件(防止终端异常退出丢失记录) shopt -s histappend PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND" # 创建审计日志目录 mkdir -p /var/log/audit chmod 750 /var/log/audit 用户登录/登出审计(每次登录都会记录) echo "$(date '+%Y-%m-%d %H:%M:%S') | $REAL_USER | $USER_IP | 登录系统 | 工作目录: \$(pwd)" >> /var/log/user_audit.log EOF # ============================================ # 第二部分:Sudo操作审计(特权命令记录) # ============================================ echo "配置Sudo操作审计..." # 创建Sudo审计配置 cat > /etc/sudoers.d/audit <<'EOF' # Sudo命令审计配置 Defaults logfile=/var/log/sudo_audit.log # 所有sudo命令记录到这个文件 Defaults log_input # 记录输入内容(如编辑文件的内容) Defaults log_output # 记录命令输出(谨慎开启,可能很大) Defaults iolog_dir=/var/log/sudo-io/%{user} # 每个用户的输入输出分开存放 # 重要:设置命令执行超时(防止命令卡住) Defaults timestamp_timeout=5 # sudo密码5分钟后需要重新输入 Defaults passwd_timeout=1 # 密码输入超时1分钟 EOF chmod 440 /etc/sudoers.d/audit # 必须440权限,保护配置文件 # 创建审计日志文件 touch /var/log/user_audit.log touch /var/log/sudo_audit.log chmod 600 /var/log/user_audit.log chmod 600 /var/log/sudo_audit.log # ============================================ # 第三部分:Auditd系统级审计(内核级监控) # ============================================ echo "安装和配置Auditd系统审计服务..." # 安装auditd if command -v dnf &> /dev/null; then dnf install -y audit audit-libs > /dev/null 2>&1 elif command -v yum &> /dev/null; then yum install -y audit audit-libs > /dev/null 2>&1 fi # 配置auditd规则 cat > /etc/audit/rules.d/99-ops-audit.rules <<'EOF' # ========== 运维操作审计规则 ========== # 1. 监控用户和权限变更 -w /etc/passwd -p wa -k user_changes # 监控用户账户变更 -w /etc/group -p wa -k group_changes # 监控用户组变更 -w /etc/shadow -p wa -k shadow_changes # 监控密码文件变更 -w /etc/sudoers -p wa -k sudoers_changes # 监控sudo权限变更 -w /etc/ssh/sshd_config -p wa -k ssh_changes # 监控SSH配置变更 # 2. 监控系统关键目录(防篡改) -w /etc/ -p wa -k etc_changes # 监控/etc目录所有写操作 -w /usr/bin/ -p wa -k bin_changes # 监控系统命令目录 -w /usr/sbin/ -p wa -k sbin_changes -w /var/log/ -p wa -k log_changes # 监控日志目录(防删日志) -w /root/.ssh/ -p wa -k root_ssh # 监控root的SSH密钥 # 3. 监控特权命令使用(谁提权了?) -w /bin/su -p x -k privilege_escalation # 监控su命令执行 -w /usr/bin/sudo -p x -k privilege_escalation # 监控sudo命令执行 -w /usr/bin/passwd -p x -k password_changes # 监控密码修改 # 4. 监控文件删除操作(谁删了文件?) -a always,exit -F arch=b64 -S unlink -S unlinkat -S rename -S renameat -k delete_files -a always,exit -F arch=b32 -S unlink -S unlinkat -S rename -S renameat -k delete_files # 5. 监控网络配置变更 -w /etc/hosts -p wa -k hosts_changes # 监控hosts文件 -w /etc/resolv.conf -p wa -k dns_changes # 监控DNS配置 # 6. 监控防火墙配置变更 -w /etc/sysconfig/iptables -p wa -k firewall_changes -w /etc/firewalld/ -p wa -k firewalld_changes # 7. 监控系统服务变更 -w /usr/lib/systemd/system/ -p wa -k service_changes -w /etc/systemd/system/ -p wa -k service_changes # 8. 监控定时任务变更 -w /etc/crontab -p wa -k cron_changes -w /etc/cron.hourly/ -p wa -k cron_changes -w /etc/cron.daily/ -p wa -k cron_changes -w /etc/cron.weekly/ -p wa -k cron_changes -w /var/spool/cron/ -p wa -k user_cron_changes # 9. 监控内核模块加载(防Rootkit) -w /sbin/insmod -p x -k kernel_modules -w /sbin/rmmod -p x -k kernel_modules -w /sbin/modprobe -p x -k kernel_modules EOF # 启用并启动auditd服务 systemctl enable auditd > /dev/null 2>&1 # 检查auditd是否已在运行,避免冲突 if systemctl is-active auditd &> /dev/null; then echo "auditd服务已在运行,重新加载规则..." auditctl -R /etc/audit/rules.d/99-ops-audit.rules > /dev/null 2>&1 else systemctl start auditd > /dev/null 2>&1 fi echo "✅ 企业级审计系统部署完成!" echo "" 企业里面生产还需做哪些?1、定期备份审计日志 -- 合规化需要,有些企业是每周一次内部审查2、告警的机制,关键操作实时告警(修改密码,删除日志)3、集中化的日志管理,比如ELKvsxsl9g,把所有的服务器日志集中存储,防止日志被纂改4、堡垒机(lumpseryer):统一管理服务器的访问权限、所有的操作视频回放。5、SSH安全加固。6.企业级监控与性能基线企业级监控与性能基线部署完上述的所有环境之后,还需要针对企业内部的一些实际环境进行定制化的软件安装1、安装企业内部工具包CI\CD2、配置sar数据收集3、部署监控告警系统:如:zabki、Prometheus+Gra34、设置性能的基线:了解服务器在正常状态下的表现,当出现异常的时候能够快速识别
2025年12月04日
7 阅读
0 评论
0 点赞
1
2
3
4
...
18