ndlli 发表于 2018-8-19 07:02:38

Linux系统巡检shell脚本

  
#!/bin/bash
  
#主机信息每日巡检
  

  
IPADDR=$(ifconfig eth0|grep 'inet addr'|awk -F '[ :]' '{print $13}')
  
#环境变量PATH没设好,在cron里执行时有很多命令会找不到
  
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
  
source /etc/profile
  

  
[ $(id -u) -gt 0 ] && echo "请用root用户执行此脚本!" && exit 1
  
centosVersion=$(awk '{print $(NF-1)}' /etc/redhat-release)
  
VERSION="2017.08.22"
  

  
#日志相关
  
PROGPATH=`echo $0 | sed -e 's,[\\/][^\\/][^\\/]*$,,'`
  
[ -f $PROGPATH ] && PROGPATH="."
  
LOGPATH="$PROGPATH/log"
  
[ -e $LOGPATH ] || mkdir $LOGPATH
  
RESULTFILE="$LOGPATH/HostDailyCheck-$IPADDR-`date +%Y%m%d`.txt"
  

  

  
#定义报表的全局变量
  
report_DateTime=""    #日期 ok
  
report_Hostname=""    #主机名 ok
  
report_OSRelease=""    #发行版本 ok
  
report_Kernel=""    #内核 ok
  
report_Language=""    #语言/编码 ok
  
report_LastReboot=""    #最近启动时间 ok
  
report_Uptime=""    #运行时间(天) ok
  
report_CPUs=""    #CPU数量 ok
  
report_CPUType=""    #CPU类型 ok
  
report_Arch=""    #CPU架构 ok
  
report_MemTotal=""    #内存总容量(MB) ok
  
report_MemFree=""    #内存剩余(MB) ok
  
report_MemUsedPercent=""    #内存使用率% ok
  
report_DiskTotal=""    #硬盘总容量(GB) ok
  
report_DiskFree=""    #硬盘剩余(GB) ok
  
report_DiskUsedPercent=""    #硬盘使用率% ok
  
report_InodeTotal=""    #Inode总量 ok
  
report_InodeFree=""    #Inode剩余 ok
  
report_InodeUsedPercent=""    #Inode使用率 ok
  
report_IP=""    #IP地址 ok
  
report_MAC=""    #MAC地址 ok
  
report_Gateway=""    #默认网关 ok
  
report_DNS=""    #DNS ok
  
report_Listen=""    #监听 ok
  
report_Selinux=""    #Selinux ok
  
report_Firewall=""    #防火墙 ok
  
report_USERs=""    #用户 ok
  
report_USEREmptyPassword=""   #空密码用户 ok
  
report_USERTheSameUID=""      #相同ID的用户 ok
  
report_PasswordExpiry=""    #密码过期(天) ok
  
report_RootUser=""    #root用户 ok
  
report_Sudoers=""    #sudo授权ok
  
report_SSHAuthorized=""    #SSH信任主机 ok
  
report_SSHDProtocolVersion=""    #SSH协议版本 ok
  
report_SSHDPermitRootLogin=""    #允许root远程登录 ok
  
report_DefunctProsess=""    #僵尸进程数量 ok
  
report_SelfInitiatedService=""    #自启动服务数量 ok
  
report_SelfInitiatedProgram=""    #自启动程序数量 ok
  
report_RuningService=""         #运行中服务数ok
  
report_Crontab=""    #计划任务数 ok
  
report_Syslog=""    #日志服务 ok
  
report_SNMP=""    #SNMPOK
  
report_NTP=""    #NTP ok
  
report_JDK=""    #JDK版本 ok
  
function version(){
  
    echo ""
  
    echo ""
  
    echo "系统巡检脚本:Version $VERSION"
  
}
  

  
function getCpuStatus(){
  
    echo ""
  
    echo ""
  
    echo "############################ CPU检查 #############################"
  
    Physical_CPUs=$(grep "physical id" /proc/cpuinfo| sort | uniq | wc -l)
  
    Virt_CPUs=$(grep "processor" /proc/cpuinfo | wc -l)
  
    CPU_Kernels=$(grep "cores" /proc/cpuinfo|uniq| awk -F ': ' '{print $2}')
  
    CPU_Type=$(grep "model name" /proc/cpuinfo | awk -F ': ' '{print $2}' | sort | uniq)
  
    CPU_Arch=$(uname -m)
  
    echo "物理CPU个数:$Physical_CPUs"
  
    echo "逻辑CPU个数:$Virt_CPUs"
  
    echo "每CPU核心数:$CPU_Kernels"
  
    echo "    CPU型号:$CPU_Type"
  
    echo "    CPU架构:$CPU_Arch"
  
    #报表信息
  
    report_CPUs=$Virt_CPUs    #CPU数量
  
    report_CPUType=$CPU_Type#CPU类型
  
    report_Arch=$CPU_Arch   #CPU架构
  
}
  

  
function getMemStatus(){
  
    echo ""
  
    echo ""
  
    echo "############################ 内存检查 ############################"
  
    if [[ $centosVersion < 7 ]];then
  
      free -mo
  
    else
  
      free -h
  
    fi
  
    #报表信息
  
    MemTotal=$(grep MemTotal /proc/meminfo| awk '{print $2}')#KB
  
    MemFree=$(grep MemFree /proc/meminfo| awk '{print $2}')    #KB
  
    let MemUsed=MemTotal-MemFree
  
    MemPercent=$(awk &quot;BEGIN {if($MemTotal==0){printf 100}else{printf \&quot;%.2f\&quot;,$MemUsed*100/$MemTotal}}&quot;)
  
    report_MemTotal=&quot;$((MemTotal/1024))&quot;&quot;MB&quot;      #内存总容量(MB)
  
    report_MemFree=&quot;$((MemFree/1024))&quot;&quot;MB&quot;          #内存剩余(MB)
  
    report_MemUsedPercent=&quot;$(awk &quot;BEGIN {if($MemTotal==0){printf 100}else{printf \&quot;%.2f\&quot;,$MemUsed*100/$MemTotal}}&quot;)&quot;&quot;%&quot;   #内存使用率%
  
}
  

  
function getDiskStatus(){
  
    echo &quot;&quot;
  
    echo &quot;&quot;
  
    echo &quot;############################ 磁盘检查 ############################&quot;
  
    df -hiP | sed 's/Mounted on/Mounted/'> /tmp/inode
  
    df -hTP | sed 's/Mounted on/Mounted/'> /tmp/disk
  
    join /tmp/disk /tmp/inode | awk '{print $1,$2,&quot;|&quot;,$3,$4,$5,$6,&quot;|&quot;,$8,$9,$10,$11,&quot;|&quot;,$12}'| column -t
  
    #报表信息
  
    diskdata=$(df -TP | sed '1d' | awk '$2!=&quot;tmpfs&quot;{print}') #KB
  
    disktotal=$(echo &quot;$diskdata&quot; | awk '{total+=$3}END{print total}') #KB
  
    diskused=$(echo &quot;$diskdata&quot; | awk '{total+=$4}END{print total}')#KB
  
    diskfree=$((disktotal-diskused)) #KB
  
    diskusedpercent=$(echo $disktotal $diskused | awk '{if($1==0){printf 100}else{printf &quot;%.2f&quot;,$2*100/$1}}')
  
    inodedata=$(df -iTP | sed '1d' | awk '$2!=&quot;tmpfs&quot;{print}')
  
    inodetotal=$(echo &quot;$inodedata&quot; | awk '{total+=$3}END{print total}')
  
    inodeused=$(echo &quot;$inodedata&quot; | awk '{total+=$4}END{print total}')
  
    inodefree=$((inodetotal-inodeused))
  
    inodeusedpercent=$(echo $inodetotal $inodeused | awk '{if($1==0){printf 100}else{printf &quot;%.2f&quot;,$2*100/$1}}')
  
    report_DiskTotal=$((disktotal/1024/1024))&quot;GB&quot;   #硬盘总容量(GB)
  
    report_DiskFree=$((diskfree/1024/1024))&quot;GB&quot;   #硬盘剩余(GB)
  
    report_DiskUsedPercent=&quot;$diskusedpercent&quot;&quot;%&quot;    #硬盘使用率%
  
    report_InodeTotal=$((inodetotal/1000))&quot;K&quot;       #Inode总量
  
    report_InodeFree=$((inodefree/1000))&quot;K&quot;         #Inode剩余
  
    report_InodeUsedPercent=&quot;$inodeusedpercent&quot;&quot;%&quot;#Inode使用率%
  

  
}
  

  
function getSystemStatus(){
  
    echo &quot;&quot;
  
    echo &quot;&quot;
  
    echo &quot;############################ 系统检查 ############################&quot;
  
    if [ -e /etc/sysconfig/i18n ];then
  
      default_LANG=&quot;$(grep &quot;LANG=&quot; /etc/sysconfig/i18n | grep -v &quot;^#&quot; | awk -F '&quot;' '{print $2}')&quot;
  
    else
  
      default_LANG=$LANG
  
    fi
  
    export LANG=&quot;en_US.UTF-8&quot;
  
    Release=$(cat /etc/redhat-release 2>/dev/null)
  
    Kernel=$(uname -r)
  
    OS=$(uname -o)
  
    Hostname=$(uname -n)
  
    SELinux=$(/usr/sbin/sestatus | grep &quot;SELinux status: &quot; | awk '{print $3}')
  
    LastReboot=$(who -b | awk '{print $3,$4}')
  
    uptime=$(uptime | sed 's/.*up \([^,]*\), .*/\1/')
  
    echo &quot;   系统:$OS&quot;
  
    echo &quot; 发行版本:$Release&quot;
  
    echo &quot;   内核:$Kernel&quot;
  
    echo &quot;   主机名:$Hostname&quot;
  
    echo &quot;SELinux:$SELinux&quot;
  
    echo &quot;语言/编码:$default_LANG&quot;
  
    echo &quot; 当前时间:$(date +'%F %T')&quot;
  
    echo &quot; 最后启动:$LastReboot&quot;
  
    echo &quot; 运行时间:$uptime&quot;
  
    #报表信息
  
    report_DateTime=$(date +&quot;%F %T&quot;)#日期
  
    report_Hostname=&quot;$Hostname&quot;       #主机名
  
    report_OSRelease=&quot;$Release&quot;       #发行版本
  
    report_Kernel=&quot;$Kernel&quot;         #内核
  
    report_Language=&quot;$default_LANG&quot;   #语言/编码
  
    report_LastReboot=&quot;$LastReboot&quot;   #最近启动时间
  
    report_Uptime=&quot;$uptime&quot;         #运行时间(天)
  
    report_Selinux=&quot;$SELinux&quot;
  
    export LANG=&quot;$default_LANG&quot;
  

  
}
  

  
function getServiceStatus(){
  
    echo &quot;&quot;
  
    echo &quot;&quot;
  
    echo &quot;############################ 服务检查 ############################&quot;
  
    echo &quot;&quot;
  
    if [[ $centosVersion > 7 ]];then
  
      conf=$(systemctl list-unit-files --type=service --state=enabled --no-pager | grep &quot;enabled&quot;)
  
      process=$(systemctl list-units --type=service --state=running --no-pager | grep &quot;.service&quot;)
  
      #报表信息
  
      report_SelfInitiatedService=&quot;$(echo &quot;$conf&quot; | wc -l)&quot;       #自启动服务数量
  
      report_RuningService=&quot;$(echo &quot;$process&quot; | wc -l)&quot;         #运行中服务数量
  
    else
  
      conf=$(/sbin/chkconfig | grep -E &quot;:on|:启用&quot;)
  
      process=$(/sbin/service --status-all 2>/dev/null | grep -E &quot;is running|正在运行&quot;)
  
      #报表信息
  
      report_SelfInitiatedService=&quot;$(echo &quot;$conf&quot; | wc -l)&quot;       #自启动服务数量
  
      report_RuningService=&quot;$(echo &quot;$process&quot; | wc -l)&quot;         #运行中服务数量
  
    fi
  
    echo &quot;服务配置&quot;
  
    echo &quot;--------&quot;
  
    echo &quot;$conf&quot;| column -t
  
    echo &quot;&quot;
  
    echo &quot;正在运行的服务&quot;
  
    echo &quot;--------------&quot;
  
    echo &quot;$process&quot;
  

  
}
  

  

  
function getAutoStartStatus(){
  
    echo &quot;&quot;
  
    echo &quot;&quot;
  
    echo &quot;############################ 自启动检查 ##########################&quot;
  
    conf=$(grep -v &quot;^#&quot; /etc/rc.d/rc.local| sed '/^$/d')
  
    echo &quot;$conf&quot;
  
    #报表信息
  
    report_SelfInitiatedProgram=&quot;$(echo $conf | wc -l)&quot;    #自启动程序数量
  
}
  

  
function getLoginStatus(){
  
    echo &quot;&quot;
  
    echo &quot;&quot;
  
    echo &quot;############################ 登录检查 ############################&quot;
  
    last | head
  
}
  

  
function getNetworkStatus(){
  
    echo &quot;&quot;
  
    echo &quot;&quot;
  
    echo &quot;############################ 网络检查 ############################&quot;
  
    if [[ $centosVersion < 7 ]];then
  
      /sbin/ifconfig -a | grep -v packets | grep -v collisions | grep -v inet6
  
    else
  
      #ip a
  
      for i in $(ip link | grep BROADCAST | awk -F: '{print $2}');do ip add show $i | grep -E &quot;BROADCAST|global&quot;| awk '{print $2}' | tr '\n' ' ' ;echo &quot;&quot; ;done
  
    fi
  
    GATEWAY=$(ip route | grep default | awk '{print $3}')
  
    DNS=$(grep nameserver /etc/resolv.conf| grep -v &quot;#&quot; | awk '{print $2}' | tr '\n' ',' | sed 's/,$//')
  
    echo &quot;&quot;
  
    echo &quot;网关:$GATEWAY &quot;
  
    echo &quot; DNS:$DNS&quot;
  
    #报表信息
  
    IP=$(ip -f inet addr | grep -v 127.0.0.1 |grep inet | awk '{print $NF,$2}' | tr '\n' ',' | sed 's/,$//')
  
    MAC=$(ip link | grep -v &quot;LOOPBACK\|loopback&quot; | awk '{print $2}' | sed 'N;s/\n//' | tr '\n' ',' | sed 's/,$//')
  
    report_IP=&quot;$IP&quot;            #IP地址
  
    report_MAC=$MAC            #MAC地址
  
    report_Gateway=&quot;$GATEWAY&quot;#默认网关
  
    report_DNS=&quot;$DNS&quot;          #DNS
  
}
  

  
function getListenStatus(){
  
    echo &quot;&quot;
  
    echo &quot;&quot;
  
    echo &quot;############################ 监听检查 ############################&quot;
  
    TCPListen=$(ss -ntul | column -t)
  
    echo &quot;$TCPListen&quot;
  
    #报表信息
  
    report_Listen=&quot;$(echo &quot;$TCPListen&quot;| sed '1d' | awk '/tcp/ {print $5}' | awk -F: '{print $NF}' | sort | uniq | wc -l)&quot;
  
}
  

  
function getCronStatus(){
  
    echo &quot;&quot;
  
    echo &quot;&quot;
  
    echo &quot;############################ 计划任务检查 ########################&quot;
  
    Crontab=0
  
    for shell in $(grep -v &quot;/sbin/nologin&quot; /etc/shells);do
  
      for user in $(grep &quot;$shell&quot; /etc/passwd| awk -F: '{print $1}');do
  
            crontab -l -u $user >/dev/null 2>&1
  
            status=$?
  
            if [ $status -eq 0 ];then
  
                echo &quot;$user&quot;
  
                echo &quot;--------&quot;
  
                crontab -l -u $user
  
                let Crontab=Crontab+$(crontab -l -u $user | wc -l)
  
                echo &quot;&quot;
  
            fi
  
      done
  
    done
  
    #计划任务
  
    find /etc/cron* -type f | xargs -i ls -l {} | column-t
  
    let Crontab=Crontab+$(find /etc/cron* -type f | wc -l)
  
    #报表信息
  
    report_Crontab=&quot;$Crontab&quot;    #计划任务数
  
}
  
function getHowLongAgo(){
  
    # 计算一个时间戳离现在有多久了
  
    datetime=&quot;$*&quot;
  
    [ -z &quot;$datetime&quot; ] && echo &quot;错误的参数:getHowLongAgo() $*&quot;
  
    Timestamp=$(date +%s -d &quot;$datetime&quot;)    #转化为时间戳
  
    Now_Timestamp=$(date +%s)
  
    Difference_Timestamp=$(($Now_Timestamp-$Timestamp))
  
    days=0;hours=0;minutes=0;
  
    sec_in_day=$((60*60*24));
  
    sec_in_hour=$((60*60));
  
    sec_in_minute=60
  
    while (( $(($Difference_Timestamp-$sec_in_day)) > 1 ))
  
    do
  
      let Difference_Timestamp=Difference_Timestamp-sec_in_day
  
      let days++
  
    done
  
    while (( $(($Difference_Timestamp-$sec_in_hour)) > 1 ))
  
    do
  
      let Difference_Timestamp=Difference_Timestamp-sec_in_hour
  
      let hours++
  
    done
  
    echo &quot;$days 天 $hours 小时前&quot;
  
}
  

  
function getUserLastLogin(){
  
    # 获取用户最近一次登录的时间,含年份
  
    # 很遗憾last命令不支持显示年份,只有&quot;last -t YYYYMMDDHHMMSS&quot;表示某个时间之间的登录,我
  
    # 们只能用最笨的方法了,对比今天之前和今年元旦之前(或者去年之前和前年之前……)某个用户
  
    # 登录次数,如果登录统计次数有变化,则说明最近一次登录是今年。
  
    username=$1
  
    : ${username:=&quot;`whoami`&quot;}
  
    thisYear=$(date +%Y)
  
    oldesYear=$(last | tail -n1 | awk '{print $NF}')
  
    while(( $thisYear >= $oldesYear));do
  
      loginBeforeToday=$(last $username | grep $username | wc -l)
  
      loginBeforeNewYearsDayOfThisYear=$(last $username -t $thisYear&quot;0101000000&quot; | grep $username | wc -l)
  
      if [ $loginBeforeToday -eq 0 ];then
  
            echo &quot;从未登录过&quot;
  
            break
  
      elif [ $loginBeforeToday -gt $loginBeforeNewYearsDayOfThisYear ];then
  
            lastDateTime=$(last -i $username | head -n1 | awk '{for(i=4;i1{print $2}')
  
    for uid in $UIDs;do
  
      echo -n &quot;$uid&quot;;
  
      USERTheSameUID=&quot;$uid&quot;
  
      r=$(awk -F: 'ORS=&quot;&quot;;$3=='&quot;$uid&quot;'{print &quot;:&quot;,$1}' /etc/passwd)
  
      echo &quot;$r&quot;
  
      echo &quot;&quot;
  
      USERTheSameUID=&quot;$USERTheSameUID $r,&quot;
  
    done
  
    #报表信息
  
    report_USERs=&quot;$USERs&quot;    #用户
  
    report_USEREmptyPassword=$(echo $USEREmptyPassword | sed 's/^,//')
  
    report_USERTheSameUID=$(echo $USERTheSameUID | sed 's/,$//')
  
    report_RootUser=$(echo $RootUser | sed 's/^,//')    #特权用户
  
}
  

  

  
function getPasswordStatus {
  
    echo &quot;&quot;
  
    echo &quot;&quot;
  
    echo &quot;############################ 密码检查 ############################&quot;
  
    pwdfile=&quot;$(cat /etc/passwd)&quot;
  
    echo &quot;&quot;
  
    echo &quot;密码过期检查&quot;
  
    echo &quot;------------&quot;
  
    result=&quot;&quot;
  
    for shell in $(grep -v &quot;/sbin/nologin&quot; /etc/shells);do
  
      for user in $(echo &quot;$pwdfile&quot; | grep &quot;$shell&quot; | cut -d: -f1);do
  
            get_expiry_date=$(/usr/bin/chage -l $user | grep 'Password expires' | cut -d: -f2)
  
            if [[ $get_expiry_date = ' never' || $get_expiry_date = 'never' ]];then
  
                printf &quot;%-15s 永不过期\n&quot; $user
  
                result=&quot;$result,$user:never&quot;
  
            else
  
                password_expiry_date=$(date -d &quot;$get_expiry_date&quot; &quot;+%s&quot;)
  
                current_date=$(date &quot;+%s&quot;)
  
                diff=$(($password_expiry_date-$current_date))
  
                let DAYS=$(($diff/(60*60*24)))
  
                printf &quot;%-15s %s天后过期\n&quot; $user $DAYS
  
                result=&quot;$result,$user:$DAYS days&quot;
  
            fi
  
      done
  
    done
  
    report_PasswordExpiry=$(echo $result | sed 's/^,//')
  

  
    echo &quot;&quot;
  
    echo &quot;密码策略检查&quot;
  
    echo &quot;------------&quot;
  
    grep -v &quot;#&quot; /etc/login.defs | grep -E &quot;PASS_MAX_DAYS|PASS_MIN_DAYS|PASS_MIN_LEN|PASS_WARN_AGE&quot;
  

  

  
}
  

  
function getSudoersStatus(){
  
    echo &quot;&quot;
  
    echo &quot;&quot;
  
    echo &quot;############################ Sudoers检查 #########################&quot;
  
    conf=$(grep -v &quot;^#&quot; /etc/sudoers| grep -v &quot;^Defaults&quot; | sed '/^$/d')
  
    echo &quot;$conf&quot;
  
    echo &quot;&quot;
  
    #报表信息
  
    report_Sudoers=&quot;$(echo $conf | wc -l)&quot;
  
}
  

  
function getInstalledStatus(){
  
    echo &quot;&quot;
  
    echo &quot;&quot;
  
    echo &quot;############################ 软件检查 ############################&quot;
  
    rpm -qa --last | head | column -t
  
}
  

  
function getProcessStatus(){
  
    echo &quot;&quot;
  
    echo &quot;&quot;
  
    echo &quot;############################ 进程检查 ############################&quot;
  
    if [ $(ps -ef | grep defunct | grep -v grep | wc -l) -ge 1 ];then
  
      echo &quot;&quot;
  
      echo &quot;僵尸进程&quot;;
  
      echo &quot;--------&quot;
  
      ps -ef | head -n1
  
      ps -ef | grep defunct | grep -v grep
  
    fi
  
    echo &quot;&quot;
  
    echo &quot;内存占用TOP10&quot;
  
    echo &quot;-------------&quot;
  
    echo -e &quot;PID %MEM RSS COMMAND
  
    $(ps aux | awk '{print $2, $4, $6, $11}' | sort -k3rn | head -n 10 )&quot;| column -t
  
    echo &quot;&quot;
  
    echo &quot;CPU占用TOP10&quot;
  
    echo &quot;------------&quot;
  
    top b -n1 | head -17 | tail -11
  
    #报表信息
  
    report_DefunctProsess=&quot;$(ps -ef | grep defunct | grep -v grep|wc -l)&quot;
  
}
  

  
function getJDKStatus(){
  
    echo &quot;&quot;
  
    echo &quot;&quot;
  
    echo &quot;############################ JDK检查 #############################&quot;
  
    java -version 2>/dev/null
  
    if [ $? -eq 0 ];then
  
      java -version 2>&1
  
    fi
  
    echo &quot;JAVA_HOME=\&quot;$JAVA_HOME\&quot;&quot;
  
    #报表信息
  
    report_JDK=&quot;$(java -version 2>&1 | grep version | awk '{print $1,$3}' | tr -d '&quot;')&quot;
  
}
  
function getSyslogStatus(){
  
    echo &quot;&quot;
  
    echo &quot;&quot;
  
    echo &quot;############################ syslog检查 ##########################&quot;
  
    echo &quot;服务状态:$(getState rsyslog)&quot;
  
    echo &quot;&quot;
  
    echo &quot;/etc/rsyslog.conf&quot;
  
    echo &quot;-----------------&quot;
  
    cat /etc/rsyslog.conf 2>/dev/null | grep -v &quot;^#&quot; | grep -v &quot;^\\$&quot; | sed '/^$/d'| column -t
  
    #报表信息
  
    report_Syslog=&quot;$(getState rsyslog)&quot;
  
}
  
function getFirewallStatus(){
  
    echo &quot;&quot;
  
    echo &quot;&quot;
  
    echo &quot;############################ 防火墙检查 ##########################&quot;
  
    #防火墙状态,策略等
  
    if [[ $centosVersion < 7 ]];then
  
      /etc/init.d/iptables status >/dev/null2>&1
  
      status=$?
  
      if [ $status -eq 0 ];then
  
                s=&quot;active&quot;
  
      elif [ $status -eq 3 ];then
  
                s=&quot;inactive&quot;
  
      elif [ $status -eq 4 ];then
  
                s=&quot;permission denied&quot;
  
      else
  
                s=&quot;unknown&quot;
  
      fi
  
    else
  
      s=&quot;$(getState iptables)&quot;
  
    fi
  
    echo &quot;iptables: $s&quot;
  
    echo &quot;&quot;
  
    echo &quot;/etc/sysconfig/iptables&quot;
  
    echo &quot;-----------------------&quot;
  
    cat /etc/sysconfig/iptables 2>/dev/null
  
    #报表信息
  
    report_Firewall=&quot;$s&quot;
  
}
  

  
function getSNMPStatus(){
  
    #SNMP服务状态,配置等
  
    echo &quot;&quot;
  
    echo &quot;&quot;
  
    echo &quot;############################ SNMP检查 ############################&quot;
  
    status=&quot;$(getState snmpd)&quot;
  
    echo &quot;服务状态:$status&quot;
  
    echo &quot;&quot;
  
    if [ -e /etc/snmp/snmpd.conf ];then
  
      echo &quot;/etc/snmp/snmpd.conf&quot;
  
      echo &quot;--------------------&quot;
  
      cat /etc/snmp/snmpd.conf 2>/dev/null | grep -v &quot;^#&quot; | sed '/^$/d'
  
    fi
  
    #报表信息
  
    report_SNMP=&quot;$(getState snmpd)&quot;
  
}
  

  

  

  
function getState(){
  
    if [[ $centosVersion < 7 ]];then
  
      if [ -e &quot;/etc/init.d/$1&quot; ];then
  
            if [ `/etc/init.d/$1 status 2>/dev/null | grep -E &quot;is running|正在运行&quot; | wc -l` -ge 1 ];then
  
                r=&quot;active&quot;
  
            else
  
                r=&quot;inactive&quot;
  
            fi
  
      else
  
            r=&quot;unknown&quot;
  
      fi
  
    else
  
      #CentOS 7+
  
      r=&quot;$(systemctl is-active $1 2>&1)&quot;
  
    fi
  
    echo &quot;$r&quot;
  
}
  

  
function getSSHStatus(){
  
    #SSHD服务状态,配置,受信任主机等
  
    echo &quot;&quot;
  
    echo &quot;&quot;
  
    echo &quot;############################ SSH检查 #############################&quot;
  
    #检查受信任主机
  
    pwdfile=&quot;$(cat /etc/passwd)&quot;
  
    echo &quot;服务状态:$(getState sshd)&quot;
  
    Protocol_Version=$(cat /etc/ssh/sshd_config | grep Protocol | awk '{print $2}')
  
    echo &quot;SSH协议版本:$Protocol_Version&quot;
  
    echo &quot;&quot;
  
    echo &quot;信任主机&quot;
  
    echo &quot;--------&quot;
  
    authorized=0
  
    for user in $(echo &quot;$pwdfile&quot; | grep /bin/bash | awk -F: '{print $1}');do
  
      authorize_file=$(echo &quot;$pwdfile&quot; | grep -w $user | awk -F: '{printf $6&quot;/.ssh/authorized_keys&quot;}')
  
      authorized_host=$(cat $authorize_file 2>/dev/null | awk '{print $3}' | tr '\n' ',' | sed 's/,$//')
  
      if [ ! -z $authorized_host ];then
  
            echo &quot;$user 授权 \&quot;$authorized_host\&quot; 无密码访问&quot;
  
      fi
  
      let authorized=authorized+$(cat $authorize_file 2>/dev/null | awk '{print $3}'|wc -l)
  
    done
  

  
    echo &quot;&quot;
  
    echo &quot;是否允许ROOT远程登录&quot;
  
    echo &quot;--------------------&quot;
  
    config=$(cat /etc/ssh/sshd_config | grep PermitRootLogin)
  
    firstChar=${config:0:1}
  
    if [ $firstChar == &quot;#&quot; ];then
  
      PermitRootLogin=&quot;yes&quot;#默认是允许ROOT远程登录的
  
    else
  
      PermitRootLogin=$(echo $config | awk '{print $2}')
  
    fi
  
    echo &quot;PermitRootLogin $PermitRootLogin&quot;
  

  
    echo &quot;&quot;
  
    echo &quot;/etc/ssh/sshd_config&quot;
  
    echo &quot;--------------------&quot;
  
    cat /etc/ssh/sshd_config | grep -v &quot;^#&quot; | sed '/^$/d'
  

  
    #报表信息
  
    report_SSHAuthorized=&quot;$authorized&quot;    #SSH信任主机
  
    report_SSHDProtocolVersion=&quot;$Protocol_Version&quot;    #SSH协议版本
  
    report_SSHDPermitRootLogin=&quot;$PermitRootLogin&quot;    #允许root远程登录
  
}
  
function getNTPStatus(){
  
    #NTP服务状态,当前时间,配置等
  
    echo &quot;&quot;
  
    echo &quot;&quot;
  
    echo &quot;############################ NTP检查 #############################&quot;
  
    if [ -e /etc/ntp.conf ];then
  
      echo &quot;服务状态:$(getState ntpd)&quot;
  
      echo &quot;&quot;
  
      echo &quot;/etc/ntp.conf&quot;
  
      echo &quot;-------------&quot;
  
      cat /etc/ntp.conf 2>/dev/null | grep -v &quot;^#&quot; | sed '/^$/d'
  
    fi
  
    #报表信息
  
    report_NTP=&quot;$(getState ntpd)&quot;
  
}
  

  

  
function uploadHostDailyCheckReport(){
  
    json=&quot;{
  
      \&quot;DateTime\&quot;:\&quot;$report_DateTime\&quot;,
  
      \&quot;Hostname\&quot;:\&quot;$report_Hostname\&quot;,
  
      \&quot;OSRelease\&quot;:\&quot;$report_OSRelease\&quot;,
  
      \&quot;Kernel\&quot;:\&quot;$report_Kernel\&quot;,
  
      \&quot;Language\&quot;:\&quot;$report_Language\&quot;,
  
      \&quot;LastReboot\&quot;:\&quot;$report_LastReboot\&quot;,
  
      \&quot;Uptime\&quot;:\&quot;$report_Uptime\&quot;,
  
      \&quot;CPUs\&quot;:\&quot;$report_CPUs\&quot;,
  
      \&quot;CPUType\&quot;:\&quot;$report_CPUType\&quot;,
  
      \&quot;Arch\&quot;:\&quot;$report_Arch\&quot;,
  
      \&quot;MemTotal\&quot;:\&quot;$report_MemTotal\&quot;,
  
      \&quot;MemFree\&quot;:\&quot;$report_MemFree\&quot;,
  
      \&quot;MemUsedPercent\&quot;:\&quot;$report_MemUsedPercent\&quot;,
  
      \&quot;DiskTotal\&quot;:\&quot;$report_DiskTotal\&quot;,
  
      \&quot;DiskFree\&quot;:\&quot;$report_DiskFree\&quot;,
  
      \&quot;DiskUsedPercent\&quot;:\&quot;$report_DiskUsedPercent\&quot;,
  
      \&quot;InodeTotal\&quot;:\&quot;$report_InodeTotal\&quot;,
  
      \&quot;InodeFree\&quot;:\&quot;$report_InodeFree\&quot;,
  
      \&quot;InodeUsedPercent\&quot;:\&quot;$report_InodeUsedPercent\&quot;,
  
      \&quot;IP\&quot;:\&quot;$report_IP\&quot;,
  
      \&quot;MAC\&quot;:\&quot;$report_MAC\&quot;,
  
      \&quot;Gateway\&quot;:\&quot;$report_Gateway\&quot;,
  
      \&quot;DNS\&quot;:\&quot;$report_DNS\&quot;,
  
      \&quot;Listen\&quot;:\&quot;$report_Listen\&quot;,
  
      \&quot;Selinux\&quot;:\&quot;$report_Selinux\&quot;,
  
      \&quot;Firewall\&quot;:\&quot;$report_Firewall\&quot;,
  
      \&quot;USERs\&quot;:\&quot;$report_USERs\&quot;,
  
      \&quot;USEREmptyPassword\&quot;:\&quot;$report_USEREmptyPassword\&quot;,
  
      \&quot;USERTheSameUID\&quot;:\&quot;$report_USERTheSameUID\&quot;,
  
      \&quot;PasswordExpiry\&quot;:\&quot;$report_PasswordExpiry\&quot;,
  
      \&quot;RootUser\&quot;:\&quot;$report_RootUser\&quot;,
  
      \&quot;Sudoers\&quot;:\&quot;$report_Sudoers\&quot;,
  
      \&quot;SSHAuthorized\&quot;:\&quot;$report_SSHAuthorized\&quot;,
  
      \&quot;SSHDProtocolVersion\&quot;:\&quot;$report_SSHDProtocolVersion\&quot;,
  
      \&quot;SSHDPermitRootLogin\&quot;:\&quot;$report_SSHDPermitRootLogin\&quot;,
  
      \&quot;DefunctProsess\&quot;:\&quot;$report_DefunctProsess\&quot;,
  
      \&quot;SelfInitiatedService\&quot;:\&quot;$report_SelfInitiatedService\&quot;,
  
      \&quot;SelfInitiatedProgram\&quot;:\&quot;$report_SelfInitiatedProgram\&quot;,
  
      \&quot;RuningService\&quot;:\&quot;$report_RuningService\&quot;,
  
      \&quot;Crontab\&quot;:\&quot;$report_Crontab\&quot;,
  
      \&quot;Syslog\&quot;:\&quot;$report_Syslog\&quot;,
  
      \&quot;SNMP\&quot;:\&quot;$report_SNMP\&quot;,
  
      \&quot;NTP\&quot;:\&quot;$report_NTP\&quot;,
  
      \&quot;JDK\&quot;:\&quot;$report_JDK\&quot;
  
    }&quot;
  
    #echo &quot;$json&quot;
  
    curl -l -H &quot;Content-type: application/json&quot; -X POST -d &quot;$json&quot; &quot;$uploadHostDailyCheckReportApi&quot; 2>/dev/null
  
}
  

  
function check(){
  
    version
  
    getSystemStatus
  
    getCpuStatus
  
    getMemStatus
  
    getDiskStatus
  
    getNetworkStatus
  
    getListenStatus
  
    getProcessStatus
  
    getServiceStatus
  
    getAutoStartStatus
  
    getLoginStatus
  
    getCronStatus
  
    getUserStatus
  
    getPasswordStatus
  
    getSudoersStatus
  
    getJDKStatus
  
    getFirewallStatus
  
    getSSHStatus
  
    getSyslogStatus
  
    getSNMPStatus
  
    getNTPStatus
  
    getInstalledStatus
  
}
  

  

  
#执行检查并保存检查结果
  
check > $RESULTFILE
  

  
echo &quot;检查结果:$RESULTFILE&quot;


页: [1]
查看完整版本: Linux系统巡检shell脚本