#!/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:
系统运维