diff --git a/Linux_System_Health_Check.sh b/Linux_System_Health_Check.sh new file mode 100644 index 0000000..008fd36 --- /dev/null +++ b/Linux_System_Health_Check.sh @@ -0,0 +1,299 @@ +#!/usr/bin/env bash + +############################################################################## +# console color +C_RESET="$(tput sgr0)" +C_BLACK="\033[1;30m" +C_RED="\033[1;31m" +C_GREEN="\033[1;32m" +C_YELLOW="\033[1;33m" +C_BLUE="\033[1;34m" +C_PURPLE="\033[1;35m" +C_CYAN="\033[1;36m" +C_WHITE="\033[1;37m" +############################################################################## + +printf "${C_PURPLE}" +cat << EOF +################################################################################### +# 系统信息检查脚本 +################################################################################### +EOF +printf "${C_RESET}" + +[[ $(id -u) -gt 0 ]] && echo "请用root用户执行此脚本!" && exit 1 +sysversion=$(rpm -q centos-release | cut -d- -f3) +double_line="===============================================================" +line="----------------------------------------------" + +# 打印头部信息 +printHeadInfo() { + cat << EOF ++---------------------------------------------------------------------------------+ +| 欢迎使用 【系统信息检查脚本】 | ++---------------------------------------------------------------------------------+ +EOF +} + +# 打印尾部信息 +printFootInfo() { + cat << EOF ++---------------------------------------------------------------------------------+ +| 脚本执行结束,感谢使用!| ++---------------------------------------------------------------------------------+ +EOF +} + +options=( "获取系统信息" "获取服务信息" "获取CPU信息" "获取系统网络信息" "获取系统内存信息" "获取系统磁盘信息" "获取CPU/内存占用TOP10" "获取系统用户信息" "输出所有信息" "退出" ) +printMenu() { + printf "${C_BLUE}" + printf "主菜单:\n" + for i in "${!options[@]}"; do + index=`expr ${i} + 1` + val=`expr ${index} % 2` + printf "\t(%02d) %-30s" "${index}" "${options[$i]}" + if [[ ${val} -eq 0 ]]; then + printf "\n" + fi + done + printf "${C_BLUE}请输入需要执行的指令:\n" + printf "${C_RESET}" +} + +# 获取系统信息 +get_systatus_info() { + sys_os=$(uname -o) + sys_release=$(cat /etc/redhat-release) + sys_kernel=$(uname -r) + sys_hostname=$(hostname) + sys_selinux=$(getenforce) + sys_lang=$(echo $LANG) + sys_lastreboot=$(who -b | awk '{print $3,$4}') + sys_runtime=$(uptime | awk '{print $3,$4}' | cut -d, -f1) + sys_time=$(date) + sys_load=$(uptime | cut -d: -f5) + + cat << EOF +【系统信息】 +系统: ${sys_os} +发行版本: ${sys_release} +系统内核: ${sys_kernel} +主机名: ${sys_hostname} +selinux状态: ${sys_selinux} +系统语言: ${sys_lang} +系统当前时间: ${sys_time} +系统最后重启时间: ${sys_lastreboot} +系统运行时间: ${sys_runtime} +系统负载: ${sys_load} +EOF +} + +# 获取CPU信息 +get_cpu_info() { + 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) + cat << EOF +【CPU信息】 +物理CPU个数:$Physical_CPUs +逻辑CPU个数:$Virt_CPUs +每CPU核心数:$CPU_Kernels +CPU型号:$CPU_Type +CPU架构:$CPU_Arch +EOF +} + +# 获取服务信息 +get_service_info() { + port_listen=$(netstat -lntup | grep -v "Active Internet") + kernel_config=$(sysctl -p 2> /dev/null) + if [[ ${sysversion} -gt 6 ]]; then + service_config=$(systemctl list-unit-files --type=service --state=enabled | grep "enabled") + run_service=$(systemctl list-units --type=service --state=running | grep ".service") + else + service_config=$(/sbin/chkconfig | grep -E ":on|:启用" | column -t) + run_service=$(/sbin/service --status-all | grep -E "running") + fi + cat << EOF +【服务信息】 +${service_config} + ${line} +运行的服务: +${run_service} + ${line} +监听端口: +${port_listen} + ${line} +内核参考配置: +${kernel_config} +EOF +} + +# 获取系统内存信息 +get_mem_info() { + check_mem=$(free -m) + MemTotal=$(grep MemTotal /proc/meminfo | awk '{print $2}') #KB + MemFree=$(grep MemFree /proc/meminfo | awk '{print $2}') #KB + let MemUsed=MemTotal-MemFree + MemPercent=$(awk "BEGIN {if($MemTotal==0){printf 100}else{printf \"%.2f\",$MemUsed*100/$MemTotal}}") + report_MemTotal="$((MemTotal/1024))"+"MB" #内存总容量(MB) + report_MemFree="$((MemFree/1024))"+"MB" #内存剩余(MB) + report_MemUsedPercent=$(free | sed -n '2p' | gawk 'x = int(( $3 / $2 ) * 100) {print x}' | sed 's/$/%/') + + cat << EOF +【内存信息】 +内存总容量(MB): ${report_MemTotal} +内存剩余量(MB):${report_MemFree} +内存使用率: ${report_MemUsedPercent} +EOF +} + +# 获取系统网络信息 +get_net_info() { + pri_ipadd=$(ip addr | awk '/^[0-9]+: / {}; /inet.*global/ {print gensub(/(.*)\/(.*)/, "\\1", "g", $2)}') + pub_ipadd=$(curl ifconfig.me -s) + gateway=$(ip route | grep default | awk '{print $3}') + mac_info=$(ip link | egrep -v "lo" | grep link | awk '{print $2}') + dns_config=$(egrep -v "^$|^#" /etc/resolv.conf) + route_info=$(route -n) + cat << EOF +【网络信息】 +系统公网地址:${pub_ipadd} +系统私网地址:${pri_ipadd} +网关地址:${gateway} +MAC地址:${mac_info} +路由信息: +${route_info} +DNS 信息: +${dns_config} +EOF +} + +# 获取系统磁盘信息 +get_disk_info() { + disk_info=$(fdisk -l | grep "Disk /dev" | cut -d, -f1) + disk_use=$(df -hTP | awk '$2!="tmpfs"{print}') + disk_percent=$(free | sed -n '2p' | gawk 'x = int(( $3 / $2 ) * 100) {print x}' | sed 's/$/%/') + disk_inode=$(df -hiP | awk '$1!="tmpfs"{print}') + + cat << EOF +【磁盘信息】 +${disk_info} +磁盘使用: ${disk_use} +磁盘使用百分比: ${disk_percent} +inode信息: ${disk_inode} +EOF +} + +# 获取系统用户信息 +get_sys_user() { + login_user=$(awk -F: '{if ($NF=="/bin/bash") print $0}' /etc/passwd) + ssh_config=$(egrep -v "^#|^$" /etc/ssh/sshd_config) + sudo_config=$(egrep -v "^#|^$" /etc/sudoers | grep -v "^Defaults") + host_config=$(egrep -v "^#|^$" /etc/hosts) + crond_config=$(for cronuser in /var/spool/cron/*; do + ls ${cronuser} 2> /dev/null | cut -d/ -f5; egrep -v "^$|^#" ${cronuser} 2> /dev/null; + echo ""; + done) + cat << EOF +【用户信息】 +系统登录用户: +${login_user} + ${line} +ssh 配置信息: +${ssh_config} + ${line} +sudo 配置用户: +${sudo_config} + ${line} +定时任务配置: +${crond_config} + ${line} +hosts 信息: +${host_config} +EOF +} + +# 获取CPU/内存占用TOP10 +get_process_top_info() { + + top_title=$(top -b n1 | head -7 | tail -1) + cpu_top10=$(top -b n1 | head -17 | tail -11) + mem_top10=$(top -b n1 | head -17 | tail -10 | sort -k10 -r) + + cat << EOF +【TOP10】 +CPU占用TOP10: +${cpu_top10} +内存占用TOP10: +${top_title} + ${mem_top10} +EOF +} + +show_dead_process() { + printf "僵尸进程:\n" + ps -al | gawk '{print $2,$4}' | grep Z +} + +get_all_info() { + get_systatus_info + echo ${double_line} + get_service_info + echo ${double_line} + get_cpu_info + echo ${double_line} + get_net_info + echo ${double_line} + get_mem_info + echo ${double_line} + get_disk_info + echo ${double_line} + get_process_top_info + echo ${double_line} + get_sys_user +} + +main() { + while [[ 1 ]] + do + printMenu + read option + local index=$[ ${option} - 1 ] + case ${options[${index}]} in + "获取系统信息") + get_systatus_info ;; + "获取服务信息") + get_service_info ;; + "获取CPU信息") + get_cpu_info ;; + "获取系统网络信息") + get_net_info ;; + "获取系统内存信息") + get_mem_info ;; + "获取系统磁盘信息") + get_disk_info ;; + "获取CPU/内存占用TOP10") + get_process_top_info ;; + "获取系统用户信息") + get_sys_user ;; + "输出所有信息") + get_all_info > $(date '+%Y-%m-%d %H:%M:%S')_sys.log + printf "${C_GREEN}信息已经输出到 $(date '+%Y-%m-%d %H:%M:%S')_sys.log 中。${C_RESET}\n\n" + ;; + "退出") + exit ;; + *) + clear + echo "抱歉,不支持此选项" ;; + esac + done +} + +######################################## MAIN ######################################## +printHeadInfo +main +printFootInfo +printf "${C_RESET}" \ No newline at end of file