自动化安装net-snmp-5.4.4(含依赖zlib、openssl的自动安装)

#!/bin/bash
##############################################################################
# 脚本名称: install_net_snmp.sh
# 脚本功能: 自动化安装net-snmp-5.4.4(含依赖zlib、openssl的自动安装)
# 安装路径: /usr/local/net-snmp-572
# 认证配置: 创建SNMPv3用户 sa_jiankong,认证密码 8Ptc5pVI4S4IQOyn(MD5加密)
# 依赖说明: 
#   1. 优先检查系统已安装的zlib-devel、openssl-devel RPM包
#   2. 若无则编译安装zlib-1.2.3和openssl-1.0.0e到/usr/local/
# 使用说明: 直接执行脚本即可,无需参数
# 注意事项: 
#   1. 执行脚本需要root权限
#   2. 依赖外网地址jiankongbao.bizark-inc.com的软件包下载服务
#   3. 脚本执行完成后会自动删除自身和临时安装包
##############################################################################

# ======================== 基础配置 ========================
# 获取脚本所在目录的绝对路径(实际本脚本未使用该变量,保留便于扩展)
basedir=$(
    cd $(dirname $0)
    echo $PWD
)

# 切换到临时目录,统一存放下载的安装包
cd /tmp

# ======================== 下载并校验net-snmp安装包 ========================
# 下载net-snmp安装包(-N:只下载更新的 -T:超时15秒 -w:等待15秒 -q:静默模式)
wget -N -T 15 -w 15 -q "http://jiankongbao.bizark-inc.com/net-snmp-5.4.4.tar.gz"

# 计算安装包的MD5值(CRC校验)
filecrc=$(md5sum net-snmp-5.4.4.tar.gz | awk '{print $1}')

# 校验安装包是否存在且MD5值正确
if [[ -f "net-snmp-5.4.4.tar.gz" ]] && [[ "$filecrc" == "95aa054f3c99a1ce242807d7eaf98619" ]]; then
    echo -e "\e[1;32m net-snmp安装包的CRC校验正确:下载成功且包体完好! \e[0;m"
    # 解压安装包(静默执行)
    tar zxf net-snmp-5.4.4.tar.gz
else
    echo -e "\e[1;31m net-snmp安装包的CRC校验错误:下载失败或包体损坏! \e[0;m"
    exit 1  # 校验失败,退出脚本
fi

# ======================== 检查系统依赖(zlib-devel/openssl-devel) ========================
# 检查系统是否已安装zlib-devel RPM包
rpmexp1=$(rpm -qa | egrep "^zlib(\-devel)+" | wc -l)
# 检查系统是否已安装openssl-devel RPM包
rpmexp2=$(rpm -qa | egrep "^openssl(\-devel)+" | wc -l)

# 如果系统已安装所需依赖,直接安装net-snmp
if [[ "$rpmexp1" -ge "1" ]] && [[ "$rpmexp2" -ge "1" ]]; then
    cd net-snmp-5.4.4  # 进入net-snmp源码目录
    
    # 创建snmp持久化数据目录
    mkdir -p /var/net-snmp
    echo "安装snmpd......"
    
    # 配置、编译、安装net-snmp(静默执行)
    # --prefix: 指定安装路径
    # --with-mib-modules=ucd-snmp/diskio: 启用磁盘IO监控模块
    # --with-zlib/--with-openssl: 关联系统zlib/openssl库
    # --disable-debugging: 禁用调试模式
    # --with-persistent-directory: 指定持久化数据目录
    ./configure --prefix=/usr/local/net-snmp-572 --with-mib-modules=ucd-snmp/diskio --with-zlib --disable-debugging --with-openssl --with-defaults --with-persistent-directory=/var/net-snmp &>/dev/null && make &>/dev/null && make install &>/dev/null
    
    # 校验net-snmp安装结果
    if [[ $? -eq 0 ]] && [[ -d "/usr/local/net-snmp-572" ]]; then
        echo -e "\e[1;32m net-snmp 安装完成!\e[0;m"
    else
        echo -e "\e[1;31m net-snmp 安装失败!\e[0;m"
        exit 1
    fi

    # ======================== 配置SNMPv3认证 ========================
    # 创建snmpd.conf配置文件,授权sa_jiankong用户只读权限
    echo "rouser sa_jiankong auth" >/usr/local/net-snmp-572/share/snmp/snmpd.conf
    
    # 强制停止可能存在的snmpd进程
    pkill -9 snmpd
    # 临时启动snmpd以生成配置文件
    /usr/local/net-snmp-572/sbin/snmpd &>/dev/null
    # 再次停止snmpd进程
    pkill -9 snmpd
    
    # 添加SNMPv3用户(MD5认证,密码8Ptc5pVI4S4IQOyn)
    echo "createUser sa_jiankong MD5 8Ptc5pVI4S4IQOyn" >>/var/net-snmp/snmpd.conf
    
    # 启动snmpd服务(静默执行)
    /usr/local/net-snmp-572/sbin/snmpd &>/dev/null
    sleep 1  # 等待服务启动
    
    # ======================== 验证snmpd服务可用性 ========================
    # 执行snmpwalk测试(2秒后超时终止,避免卡住),统计返回行数
    # -l authNoPriv: 仅认证不加密
    # -v 3: 使用SNMPv3协议
    # -u: 指定用户名
    # -a: 指定认证算法(MD5)
    # -A: 指定认证密码
    # if: 查询接口信息
    check1=$( (
        sleep 2
        pkill -15 snmpwalk
    ) | /usr/local/net-snmp-572/bin/snmpwalk -l authNoPriv -v 3 -c public -u sa_jiankong -a MD5 -A 8Ptc5pVI4S4IQOyn 127.0.0.1 if | wc -l)
    
    # 校验测试结果(返回行数≥30表示正常)
    if [[ "$check1" -ge "30" ]]; then
        echo -e "\e[1;32msnmpd安装成功并且能正常使用!\e[0;m"
    else
        echo -e "\e[1;31msnmpd安装成功但不能正常使用!\e[0;m"
    fi

# 如果系统未安装依赖,则先安装zlib和openssl,再安装net-snmp
else
    # ======================== 安装zlib依赖 ========================
    if [[ ! -d "/usr/local/zlib" ]]; then
        cd /tmp  # 切换到临时目录
        # 下载zlib安装包
        wget -N -T 15 -w 15 -q "http://jiankongbao.bizark-inc.com/zlib-1.2.3.tar.gz"
        # 校验zlib安装包MD5
        filecrc=$(md5sum zlib-1.2.3.tar.gz | awk '{print $1}')
        
        if [[ -f "zlib-1.2.3.tar.gz" ]] && [[ "$filecrc" == "debc62758716a169df9f62e6ab2bc634" ]]; then
            echo -e "\e[1;32m zlib安装包的CRC校验正确:下载成功且包体完好! \e[0;m"
            tar zxf zlib-1.2.3.tar.gz  # 解压zlib安装包
        else
            echo -e "\e[1;31m zlib安装包的CRC校验错误:下载失败或包体损坏! \e[0;m"
            exit 1
        fi
        
        cd zlib-1.2.3  # 进入zlib源码目录
        # 配置、编译、安装zlib(--shared: 编译共享库)
        ./configure --prefix=/usr/local/zlib --shared &>/dev/null && make &>/dev/null && make install &>/dev/null
        
        # 校验zlib安装结果
        if [[ $? -eq 0 ]] && [[ -d "/usr/local/zlib" ]]; then
            echo -e "\e[1;32m zlib 安装完成!\e[0;m"
        else
            echo -e "\e[1;31m zlib 安装失败!\e[0;m"
            exit 1
        fi
    fi

    # ======================== 安装openssl依赖 ========================
    if [[ ! -d "/usr/local/openssl" ]]; then
        cd /tmp  # 切换到临时目录
        # 下载openssl安装包
        wget -N -T 15 -w 15 -q "http://jiankongbao.bizark-inc.com/openssl-1.0.0e.tar.gz"
        # 校验openssl安装包MD5
        filecrc=$(md5sum openssl-1.0.0e.tar.gz | awk '{print $1}')
        
        if [[ -f "openssl-1.0.0e.tar.gz" ]] && [[ "$filecrc" == "7040b89c4c58c7a1016c0dfa6e821c86" ]]; then
            echo -e "\e[1;32m openssl安装包的CRC校验正确:下载成功且包体完好! \e[0;m"
            # 修复原脚本错误:解压openssl包(原脚本错误地解压了zlib包)
            tar zxf openssl-1.0.0e.tar.gz
        else
            echo -e "\e[1;31m openssl安装包的CRC校验错误:下载失败或包体损坏! \e[0;m"
            exit 1
        fi
        
        cd openssl-1.0.0e  # 进入openssl源码目录
        # 配置、编译、安装openssl(关联zlib)
        ./config --prefix=/usr/local/openssl shared zlib &>/dev/null && make &>/dev/null && make install &>/dev/null
        
        # 校验openssl安装结果
        if [[ $? -eq 0 ]] && [[ -d "/usr/local/openssl" ]]; then
            echo -e "\e[1;32m openssl 安装完成!\e[0;m"
        else
            echo -e "\e[1;31m openssl 安装失败!\e[0;m"
            exit 1
        fi
    fi

    # ======================== 安装net-snmp(使用手动安装的依赖) ========================
    if [[ -d "/usr/local/openssl" ]] && [[ -d "/usr/local/zlib" ]]; then
        cd net-snmp-5.4.4  # 进入net-snmp源码目录
        mkdir -p /var/net-snmp  # 创建持久化数据目录
        echo "安装snmpd......"
        
        # 配置、编译、安装net-snmp(关联手动安装的zlib/openssl)
        ./configure --prefix=/usr/local/net-snmp-572 --with-mib-modules=ucd-snmp/diskio --with-zlib=/usr/local/zlib/ --disable-debugging --with-openssl=/usr/local/openssl/ --with-defaults --with-persistent-directory=/var/net-snmp &>/dev/null && make &>/dev/null && make install &>/dev/null
        
        # 校验net-snmp安装结果
        if [[ $? -eq 0 ]] && [[ -d "/usr/local/net-snmp-572" ]]; then
            echo -e "\e[1;32m net-snmp 安装完成!\e[0;m"
        else
            echo -e "\e[1;31m net-snmp 安装失败!\e[0;m"
            exit 1
        fi
    fi

    # ======================== 配置SNMPv3认证(同前) ========================
    echo "rouser sa_jiankong auth" >/usr/local/net-snmp-572/share/snmp/snmpd.conf
    pkill -9 snmpd
    /usr/local/net-snmp-572/sbin/snmpd &>/dev/null
    pkill -9 snmpd
    echo "createUser sa_jiankong MD5 8Ptc5pVI4S4IQOyn" >>/var/net-snmp/snmpd.conf
    /usr/local/net-snmp-572/sbin/snmpd &>/dev/null
    sleep 1

    # 验证snmpd服务可用性
    check1=$( (
        sleep 2
        pkill -15 snmpwalk
    ) | /usr/local/net-snmp-572/bin/snmpwalk -l authNoPriv -v 3 -c public -u sa_jiankong -a MD5 -A 8Ptc5pVI4S4IQOyn 127.0.0.1 if | wc -l)
    
    if [[ "$check1" -ge "30" ]]; then
        echo -e "\e[1;32msnmpd安装成功并且能正常使用!\e[0;m"
        # 将snmpd加入开机自启
        echo "/usr/local/net-snmp-572/sbin/snmpd &>/dev/null" >>/etc/rc.local
    else
        echo -e "\e[1;31msnmpd安装成功但不能正常使用!\e[0;m"
    fi
fi

# ======================== 清理临时文件 ========================
cd /tmp
# 删除下载的安装包
\rm -f openssl-1.0.0e.tar.gz zlib-1.2.3.tar.gz net-snmp-5.4.4.tar.gz
# 删除脚本自身
\rm -f $basedir/$0
Categories: 系统运维