2023-10-10更新:
用tput sgr0进行属性还原时,在web页面输出会显示出一个(B符号,如下:
参考https://github.com/rburns/ansi-to-html/issues/25
解决方法是,增加一个变量:TERM=ansi
整体脚本如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 |
#!/usr/bin/env bash # author: sean # date: 2023-10-10 # function: show dynamic information after login server # Change TERM value that is 'xterm' because it leads to extra '(B' chars after sgr0 TERM=ansi # ---- Set Colors bold=$(tput bold) # 加粗字体 # half_bright=$(tput dim) # turn on half-bright mode blink=$(tput blink) # Set blink mode # underline=$(tput smul) # Set underline mode # exit_underline=$(tput rmul) # Exit underline mode # reverse=$(tput rev) # Turn on reverse mode,突出模式,所有输出字符都突出显示。 # exit_reverse=$(tput rmso) # Exit standout mode,退出突出显示。 reset_attr=$(tput sgr0) # Turn off all attributes,取消所有属性。 # tput setab [0-7] – 设置背景色。 # tput setaf [0-7] – 设置前景色。 # black=$(tput setaf 0) red=$(tput setaf 1) green=$(tput setaf 2) yellow=$(tput setaf 3) blue=$(tput setaf 4) magenta=$(tput setaf 5) #洋红 cyan=$(tput setaf 6) #青色 white=$(tput setaf 7) reset_color=$(tput setaf 9) # Reset to default color = 9 # ---- get infos OS=$(uname -o) USER=`whoami` FROM=`who am i | grep -Po "(?<=\().*(?=\))"` HOSTNAME_FQDN=`hostname` HOSTNAME=`hostname -s` SELinux=$(/usr/sbin/sestatus 2>/dev/null | grep "SELinux status: " | awk '{print $3}') LastReboot=$(who -b | awk '{print $3,$4}') # IP=`ip addr | awk '/inet/ && ! /\/32/ {ip[$NF] = $2; sub(/\/.*$/,"",ip[$NF])} END {for(i in ip){if(i ~ "en|eth0") print ip[i]}}'` IP=$(hostname -I|awk '{print $1}') if [ -f /etc/redhat-release ]; then RELEASE=`cat /etc/redhat-release` elif [ -f /etc/os-release ]; then RELEASE=$(cat /etc/os-release | sed -n 's/^NAME=\(.*\)/\1/p;s/^VERSION=\(.*\)/" "\1/p' | awk '{gsub(/"|,|^\s+|/, "");print}' | sed ":a;N;s/\n//g;ta") fi KERNEL_VERSION=`uname -r` CPU_Type=$(grep "model name" /proc/cpuinfo | awk -F ': ' '{print $2}' | sort | uniq) CPU_Arch=$(uname -m) PSA=`ps -Afl | wc -l` FORMATEDTIME=`date +"%Y-%m-%d %T"` # Time of day HOUR=$(date +"%H") if [ $HOUR -lt 12 -a $HOUR -ge 0 ]; then TIME="上午好" elif [ $HOUR -lt 17 -a $HOUR -ge 12 ]; then TIME="下午好" else TIME="晚上好" fi #### System uptime #### uptime=`cat /proc/uptime | cut -f1 -d.` upDays=$((uptime/60/60/24)) upHours=$((uptime/60/60%24)) upMins=$((uptime/60%60)) upSecs=$((uptime%60)) SYS_UPTIME="$upDays days $upHours hours $upMins minutes $upSecs seconds $RESET_COLORS" #### 网络检查 #### DNS=$(grep nameserver /etc/resolv.conf| grep -v "#" | awk '{print $2}' | tr '\n' '|' | sed 's/|$//') #### 进程检查 #### # 僵尸进程 defunct=$(ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]' | wc -l) ########## 资源统计 ######## # 列表显示系统资源使用情况 #memory MEMORY=`free -m|awk 'NR==2 {printf("内存 %.2f%% %sM %sM\n",100-($7*100/$2),$2,$3,$7)}'` #disk DISK_DATA=`df -Ph | egrep '/$|/data$' |awk '{printf "区[%s] %s %s %s\n", $6,$5,$3,$4}'` #load负载情况 up_time=`uptime` cpu_nums=`grep -c 'processor' /proc/cpuinfo` load_1min=`echo $up_time | awk '{print $(NF-2)}'|sed 's/,//g'` load_5min=`echo $up_time | awk '{print $(NF-1)}'|sed 's/,//g'` load_15min=`echo $up_time | awk '{print $NF}'|sed 's/,//g'` use_percent1=$(echo "$load_1min $cpu_nums" | awk '{printf ("%.1f\n",$1*100/$2)}') use_percent5=$(echo "$load_5min $cpu_nums" | awk '{printf ("%.1f\n",$1*100/$2)}') use_percent15=$(echo "$load_15min $cpu_nums" | awk '{printf ("%.1f\n",$1*100/$2)}') use_percent1=$([ `echo $use_percent1|awk '{print int($0)}'` -lt 100 ] && echo -n "$use_percent1" || echo -n 100) use_percent5=$([ `echo $use_percent5|awk '{print int($0)}'` -lt 100 ] && echo -n "$use_percent5" || echo -n 100) use_percent15=$([ `echo $use_percent15|awk '{print int($0)}'` -lt 100 ] && echo -n "$use_percent15" || echo -n 100) LOAD="负载1/5/15分钟 $use_percent1/$use_percent5/$use_percent15 - -" disk_use_warning=`df -Ph | egrep -v '/$|/data$' | sed '1d;/ /!N;s/\n//;s/ \+/ /;' | awk 'sub (/%/, "", $5){if ($5*1 > 89) printf "区[%s] %s %s %s\n", substr($6,1,10),$5,$3,$4}'` cpu_use_warning=$(top b -n1 |awk '/^ \s+PID/,/NF/'|head -n20 | awk 'NR>1{if ($9*1 > 30) printf "CPU高@'${cyan}'CPU:'${blink}${red}'%s'${reset_attr}${cyan}'% '${cyan}'MEM:'${green}'%s% '${cyan}'PID:'${green}'%s '${cyan}'命令:'${green}'%s\n", $9,$10,$1,substr($NF,1,20)}') mem_use_warning=$(ps aux | awk '{print $2, $3, $4, $6, $11}' | sort -k4rn | head -n 20| awk '{if ($3*1 > 20) printf "内存高@'${cyan}'CPU:'${green}'%s'${cyan}'% '${cyan}'MEM:'${blink}${red}'%s'${reset_attr}${cyan}'% '${cyan}'PID:'${green}'%s '${cyan}'命令:'${green}'%s\n", $2,$3,$1,substr($5,1,20)}') ######## 汇总显示项 ######## #system base info SYS_INFO="主机名@${HOSTNAME_FQDN}\nIP地址@${IP}\n系统@${OS}\n发行版本@${RELEASE}\n内核@${KERNEL_VERSION}\n核心@${cpu_nums}\nCPU型号@${CPU_Type}\nCPU架构@${CPU_Arch}\n当前时间@${FORMATEDTIME}\n最后启动@${LastReboot}\n运行时间@${SYS_UPTIME}\nDNS@${DNS}\n进程数@${PSA}" ## extra system base info if [ "$SELinux" != "" -a "$SELinux" != "disabled" ]; then SYS_INFO="${SYS_INFO}\nSELinux@${SELinux}" fi if [ $defunct -gt 0 ]; then SYS_INFO="${SYS_INFO}\n僵尸进程@${defunct}" fi if [ "X$cpu_use_warning" != "X" ]; then SYS_INFO="${SYS_INFO}\n${cpu_use_warning}" fi if [ "X$mem_use_warning" != "X" ]; then SYS_INFO="${SYS_INFO}\n${mem_use_warning}" fi #usage info USAGE_INFO="${LOAD}\n${MEMORY}\n${DISK_DATA}" ## extra usage info if [ "X$disk_use_warning" != "X" ]; then USAGE_INFO="${USAGE_INFO}\n${disk_use_warning}" fi #################### 显示 ######################## printf "${bold}${cyan}*************************************************\n" printf "${bold}${cyan}* $TIME ${yellow}$USER${cyan}!${blink}${red} ❤ ${reset_attr}[ ${blue}${bold}技 术 中 台 诊 断 信 息 ${white} ]${bold}${cyan} *\n" printf "${bold}${cyan}*************************************************\n" # 显示hostname WIDTH=$(tput cols) printf "${bold}${magenta}" if hash figlet 2>/dev/null; then if [ ! -z "$WIDTH" ];then figlet $HOSTNAME -k -w $WIDTH 2>/dev/null else figlet $HOSTNAME 2>/dev/null fi fi printf "${reset_attr}" #----------显示监控信息------------------ echo -e "$SYS_INFO" | awk -F'@' -f /usr/local/bin/color.awk -e ' BEGIN{ title = BG_CYAN("项目 系统信息 "); print title; } { if($1=="主机名"){ $2 = BRIGHT_MAGENTA($2) } else if($1=="IP地址"){ $2 = BRIGHT_YELLOW($2) } else if($1=="僵尸进程" || $1=="SELinux"){ $2 = BRIGHT_YELLOW($2) } else{ $2 = GREEN($2); } $1 = BRIGHT_CYAN($1); printf "%-20s\t%-40s\t\n", $1,$2; }' echo -e "$USAGE_INFO" | awk -f /usr/local/bin/color.awk -e ' BEGIN{ line = CYAN("-----------------------------------------------------------------"); title = BG_CYAN("项目 使用率 已用 空闲 图示 "); print; print title; print line; } { sub (/%/, "", $2); $5 = percent_bar($2) if($2*1 > 80 && $2*1 <= 89){ $1 = BRIGHT_YELLOW($1) $2 = BL_BRIGHT_YELLOW($2)BRIGHT_CYAN("%") $3 = BRIGHT_YELLOW($3); $4 = BRIGHT_YELLOW($4); } else if($2*1 > 89){ $1 = BRIGHT_RED($1) $2 = BL_BRIGHT_RED($2)BRIGHT_CYAN("%") $3 = BRIGHT_RED($3); $4 = BRIGHT_RED($4); } else{ $1 = BRIGHT_CYAN($1) $2 = BRIGHT_GREEN($2)BRIGHT_CYAN("%") $3 = BRIGHT_CYAN($3); $4 = GREEN($4); } printf "%-20s\t%-30s\t%-5s\t%-5s\t%-17s\t\n", $1,$2,$3,$4,$5; print line }' |
2023-8-1更新:
dymotd:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 |
#!/usr/bin/env bash # author: sean # date: 2023-08-01 # function: show dynamic information after login server # ---- Set Colors bold=$(tput bold) # 加粗字体 # half_bright=$(tput dim) # turn on half-bright mode blink=$(tput blink) # Set blink mode # underline=$(tput smul) # Set underline mode # exit_underline=$(tput rmul) # Exit underline mode # reverse=$(tput rev) # Turn on reverse mode,突出模式,所有输出字符都突出显示。 # exit_reverse=$(tput rmso) # Exit standout mode,退出突出显示。 reset_attr=$(tput sgr0) # Turn off all attributes,取消所有属性。 # tput setab [0-7] – 设置背景色。 # tput setaf [0-7] – 设置前景色。 # black=$(tput setaf 0) red=$(tput setaf 1) green=$(tput setaf 2) yellow=$(tput setaf 3) blue=$(tput setaf 4) magenta=$(tput setaf 5) #洋红 cyan=$(tput setaf 6) #青色 white=$(tput setaf 7) reset_color=$(tput setaf 9) # Reset to default color = 9 # ---- get infos OS=$(uname -o) USER=`whoami` FROM=`who am i | grep -Po "(?<=\().*(?=\))"` HOSTNAME_FQDN=`hostname` HOSTNAME=`hostname -s` SELinux=$(/usr/sbin/sestatus | grep "SELinux status: " | awk '{print $3}') LastReboot=$(who -b | awk '{print $3,$4}') IP=`ip addr | awk '/inet/ && ! /\/32/ {ip[$NF] = $2; sub(/\/.*$/,"",ip[$NF])} END {for(i in ip){if(i ~ "en|eth0") print ip[i]}}'` if [ -f /etc/redhat-release ]; then RELEASE=`cat /etc/redhat-release` elif [ -f /etc/os-release ]; then RELEASE=$(cat /etc/os-release | sed -n 's/^NAME=\(.*\)/\1/p;s/^VERSION=\(.*\)/" "\1/p' | awk '{gsub(/"|,|^\s+|/, "");print}' | sed ":a;N;s/\n//g;ta") fi KERNEL_VERSION=`uname -r` CPU_Type=$(grep "model name" /proc/cpuinfo | awk -F ': ' '{print $2}' | sort | uniq) CPU_Arch=$(uname -m) PSA=`ps -Afl | wc -l` FORMATEDTIME=`date +"%Y-%m-%d %T"` # Time of day HOUR=$(date +"%H") if [ $HOUR -lt 12 -a $HOUR -ge 0 ]; then TIME="上午好" elif [ $HOUR -lt 17 -a $HOUR -ge 12 ]; then TIME="下午好" else TIME="晚上好" fi #### System uptime #### uptime=`cat /proc/uptime | cut -f1 -d.` upDays=$((uptime/60/60/24)) upHours=$((uptime/60/60%24)) upMins=$((uptime/60%60)) upSecs=$((uptime%60)) SYS_UPTIME="$upDays days $upHours hours $upMins minutes $upSecs seconds $RESET_COLORS" #### 网络检查 #### DNS=$(grep nameserver /etc/resolv.conf| grep -v "#" | awk '{print $2}' | tr '\n' '|' | sed 's/|$//') #### 进程检查 #### # 僵尸进程 defunct=$(ps -ef | grep defunct | grep -v grep | wc -l) ########## 资源统计 ######## # 列表显示系统资源使用情况 #memory MEMORY=`free -m|awk 'NR==2 {printf("内存 %.2f%% %sM %sM\n",100-($7*100/$2),$2,$3,$7)}'` #disk DISK_DATA=`df -Ph | egrep '/$|/data$' |awk '{printf "区[%s] %s %s %s\n", $6,$5,$3,$4}'` #load负载情况 up_time=`uptime` cpu_nums=`grep -c 'processor' /proc/cpuinfo` load_1min=`echo $up_time | awk '{print $(NF-2)}'|sed 's/,//g'` load_5min=`echo $up_time | awk '{print $(NF-1)}'|sed 's/,//g'` load_15min=`echo $up_time | awk '{print $NF}'|sed 's/,//g'` use_percent1=$(echo "$load_1min $cpu_nums" | awk '{printf ("%.1f\n",$1*100/$2)}') use_percent5=$(echo "$load_5min $cpu_nums" | awk '{printf ("%.1f\n",$1*100/$2)}') use_percent15=$(echo "$load_15min $cpu_nums" | awk '{printf ("%.1f\n",$1*100/$2)}') use_percent1=$([ `echo $use_percent1|awk '{print int($0)}'` -lt 100 ] && echo -n "$use_percent1" || echo -n 100) use_percent5=$([ `echo $use_percent5|awk '{print int($0)}'` -lt 100 ] && echo -n "$use_percent5" || echo -n 100) use_percent15=$([ `echo $use_percent15|awk '{print int($0)}'` -lt 100 ] && echo -n "$use_percent15" || echo -n 100) LOAD="负载1/5/15分钟 $use_percent1/$use_percent5/$use_percent15 - -" disk_use_warning=`df -Ph | egrep -v '/$|/data$' | sed '1d;/ /!N;s/\n//;s/ \+/ /;' | awk 'sub (/%/, "", $5){if ($5*1 > 89) printf "区[%s] %s %s %s\n", substr($6,1,10),$5,$3,$4}'` cpu_use_warning=$(top b -n1 |awk '/^ \s+PID/,/NF/'|head -n20 | awk 'NR>2{if ($9*1 > 30) printf "CPU占用@'${cyan}'CPU:'${blink}${red}'%s'${reset_attr}'% '${cyan}'MEM:'${green}'%s% '${cyan}'PID:'${green}'%s '${cyan}'命令:'${green}'%s\n", $9,$10,$1,substr($NF,1,20)}') mem_use_warning=$(ps aux | awk '{print $2, $3, $4, $6, $11}' | sort -k4rn | head -n 20| awk 'NR>2{if ($3*1 > 30) printf "内存占用@'${cyan}'CPU:'${green}'%s% '${cyan}'MEM:'${blink}${red}'%s'${reset_attr}'% '${cyan}'RSS:'${green}'%s '${cyan}'PID:'${green}'%s '${cyan}'命令:'${green}'%s\n", $2,$3,$4,$1,substr($5,1,20)}') ######## 汇总显示项 ######## #system base info SYS_INFO="主机名@${HOSTNAME_FQDN}\nIP地址@${IP}\n系统@${OS}\n发行版本@${RELEASE}\n内核@${KERNEL_VERSION}\n核心@${cpu_nums}\nCPU型号@${CPU_Type}\nCPU架构@${CPU_Arch}\n当前时间@${FORMATEDTIME}\n最后启动@${LastReboot}\n运行时间@${SYS_UPTIME}\nDNS@${DNS}\n进程数@${PSA}" ## extra system base info if [ "$SELinux" != "disabled" ]; then SYS_INFO="${SYS_INFO}\nSELinux@${SELinux}" fi if [ $defunct -gt 0 ]; then SYS_INFO="${SYS_INFO}\n僵尸进程@${defunct}" fi if [ "X$cpu_use_warning" != "X" ]; then SYS_INFO="${SYS_INFO}\n${cpu_use_warning}" fi if [ "X$mem_use_warning" != "X" ]; then SYS_INFO="${SYS_INFO}\n${mem_use_warning}" fi #usage info USAGE_INFO="${LOAD}\n${MEMORY}\n${DISK_DATA}" ## extra usage info if [ "X$disk_use_warning" != "X" ]; then USAGE_INFO="${USAGE_INFO}\n${disk_use_warning}" fi #################### 显示 ######################## # 显示hostname WIDTH=$(tput cols) printf "${bold}${magenta}" if hash figlet 2>/dev/null; then if [ ! -z "$WIDTH" ];then figlet $HOSTNAME -k -w $WIDTH 2>/dev/null else figlet $HOSTNAME 2>/dev/null fi fi printf "${bold}${cyan}$TIME ${yellow}$USER${cyan}! ${white}【 ${blue}${bold}技 术 中 台 诊 断 信 息 ${white}】\n" #----------显示监控信息------------------ echo -e "$SYS_INFO" | awk -F'@' -f /usr/local/bin/color.awk -e ' BEGIN{ separater = BRIGHT_CYAN("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); line = CYAN("-----------------------------------------------------------------"); title = BG_CYAN("项目 系统信息 "); print separater; print title; print line; } { if($1=="主机名"){ $2 = BRIGHT_MAGENTA($2) } else if($1=="IP地址"){ $2 = BRIGHT_YELLOW($2) } else if($1=="僵尸进程" || $1=="SELinux"){ $2 = BL_BRIGHT_YELLOW($2) } else{ $2 = GREEN($2); } $1 = BRIGHT_CYAN($1); printf "%-20s\t%-40s\t\n", $1,$2; }' echo -e "$USAGE_INFO" | awk -f /usr/local/bin/color.awk -e ' BEGIN{ separater = BRIGHT_CYAN("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); line = CYAN("-----------------------------------------------------------------"); title = BG_CYAN("项目 使用率 已用 空闲 图示 "); print separater; print title; print line; } { sub (/%/, "", $2); $5 = percent_bar($2) if($2*1 > 80 && $2*1 <= 89){ $1 = BRIGHT_YELLOW($1) $2 = BL_BRIGHT_YELLOW($2)"%" $3 = BRIGHT_YELLOW($3); $4 = BRIGHT_YELLOW($4); } else if($2*1 > 89){ $1 = BRIGHT_RED($1) $2 = BL_BRIGHT_RED($2)"%" $3 = BRIGHT_RED($3); $4 = BRIGHT_RED($4); } else{ $1 = BRIGHT_CYAN($1) $2 = BRIGHT_WHITE($2)"%" $3 = BRIGHT_CYAN($3); $4 = GREEN($4); } printf "%-20s\t%-20s\t%-5s\t%-5s\t%-17s\t\n", $1,$2,$3,$4,$5; print line }' |
color.awk:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
function BLACK(X) { return "\033[30m" X "\033[0m" } function RED(X) { return "\033[31m" X "\033[0m" } function GREEN(X) { return "\033[32m" X "\033[0m" } function YELLOW(X) { return "\033[33m" X "\033[0m" } function BLUE(X) { return "\033[34m" X "\033[0m" } function MAGENTA(X) { return "\033[35m" X "\033[0m" } function CYAN(X) { return "\033[36m" X "\033[0m" } function WHITE(X) { return "\033[37m" X "\033[0m" } function BRIGHT_BLACK(X) { return "\033[90m" X "\033[0m" } function BRIGHT_RED(X) { return "\033[91m" X "\033[0m" } function BRIGHT_GREEN(X) { return "\033[92m" X "\033[0m" } function BRIGHT_YELLOW(X) { return "\033[93m" X "\033[0m" } function BRIGHT_BLUE(X) { return "\033[94m" X "\033[0m" } function BRIGHT_MAGENTA(X) { return "\033[95m" X "\033[0m" } function BRIGHT_CYAN(X) { return "\033[96m" X "\033[0m" } function BRIGHT_WHITE(X) { return "\033[97m" X "\033[0m" } function BG_BLACK(X) { return "\033[40m" X "\033[0m" } function BG_RED(X) { return "\033[41m" X "\033[0m" } function BG_GREEN(X) { return "\033[42m" X "\033[0m" } function BG_YELLOW(X) { return "\033[43m" X "\033[0m" } function BG_BLUE(X) { return "\033[44m" X "\033[0m" } function BG_MAGENTA(X) { return "\033[45m" X "\033[0m" } function BG_CYAN(X) { return "\033[46m" X "\033[0m" } function BG_WHITE(X) { return "\033[47m" X "\033[0m" } function BG_BRIGHT_BLACK(X) { return "\033[100m" X "\033[0m" } function BG_BRIGHT_RED(X) { return "\033[101m" X "\033[0m" } function BG_BRIGHT_GREEN(X) { return "\033[102m" X "\033[0m" } function BG_BRIGHT_YELLOW(X) { return "\033[103m" X "\033[0m" } function BG_BRIGHT_BLUE(X) { return "\033[104m" X "\033[0m" } function BG_BRIGHT_MAGENTA(X) { return "\033[105m" X "\033[0m" } function BG_BRIGHT_CYAN(X) { return "\033[106m" X "\033[0m" } function BG_BRIGHT_WHITE(X) { return "\033[107m" X "\033[0m" } #function SKYBLUE(X) { return "\033[38;2;40;177;249m" X "\033[0m" } function BL_BRIGHT_RED(X) { return "\033[91;5m" X "\033[0m" } function BL_BRIGHT_YELLOW(X) { return "\033[93;5m" X "\033[0m" } function BL_BRIGHT_BLUE(X) { return "\033[94;5m" X "\033[0m" } function BL_BRIGHT_MAGENTA(X) { return "\033[35;5m" X "\033[0m" } function BL_BRIGHT_CYAN(X) { return "\033[96;5m" X "\033[0m" } function percent_bar(percent){ sub(/%/, "", percent) space="" for(i=1;i<=17;i++){ space=space" " } total_space_len=length(space) if(percent ~ /\//){ each_space="" split(percent,pct,"/") total_num=length(pct) each_space_len=int((total_space_len - total_num - 1)/total_num + 0.9) for(i=1;i<=each_space_len;i++){ each_space=each_space" " } for(i in pct){ leadingspace="" trailingspace="" pc=pct[i] p=int(each_space_len*(pc/100)+0.5) leadingspace=substr(each_space,0,p) trailingspace=substr(each_space,p+1,each_space_len) if(pc*1 > 80 && pc*1 <= 89){ bar=bar"\033[43;37m" leadingspace "\033[47;30m" trailingspace "\033[0m""/" } else if(pc*1 > 89){ bar=bar"\033[41;37m" leadingspace "\033[47;30m" trailingspace "\033[0m""/" } else{ bar=bar"\033[104;37m" leadingspace "\033[47;30m" trailingspace "\033[0m""/" } } # remove "/" at the end sub(/\/$/, "", bar) return bar } p=int(total_space_len*(percent/100)+0.5) leadingspace=substr(space,0,p) trailingspace=substr(space,p+1,total_space_len) if(percent*1 > 80 && percent*1 <= 89){ return "\033[43;37m" leadingspace "\033[47;30m" trailingspace "\033[0m" } else if(percent*1 > 89){ return "\033[41;37m" leadingspace "\033[47;30m" trailingspace "\033[0m" } else{ return "\033[104;37m" leadingspace "\033[47;30m" trailingspace "\033[0m" } } |
2023-7-29更新:
去除了日历和时间显示,感觉很鸡肋,增加了进程使用CPU和Mem时的报警,合并了load为一条:
dynmotd:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 |
#!/usr/bin/env bash # author: sean # date: 2023-07-29 # function: show dynamic information after login server # function check_command(){ # local r=0 # `command -v $1 >/dev/null 2>&1` || r=1 # return ${r} # } # ---- Set Colors save_cursor=$(tput sc) # Saves current cursor position.保存当前光标位置 restore_cursor=$(tput rc) # Restore the cursor position.恢复光标到上一次保存的位置 bold=$(tput bold) # 加粗字体 # half_bright=$(tput dim) # turn on half-bright mode # blink=$(tput blink) # Set blink mode # underline=$(tput smul) # Set underline mode # exit_underline=$(tput rmul) # Exit underline mode # reverse=$(tput rev) # Turn on reverse mode,突出模式,所有输出字符都突出显示。 # exit_reverse=$(tput rmso) # Exit standout mode,退出突出显示。 # reset_attr=$(tput sgr0) # Turn off all attributes,取消所有属性。 # tput setab [0-7] – 设置背景色。 # tput setaf [0-7] – 设置前景色。 # black=$(tput setaf 0) red=$(tput setaf 1) green=$(tput setaf 2) yellow=$(tput setaf 3) blue=$(tput setaf 4) magenta=$(tput setaf 5) #洋红 cyan=$(tput setaf 6) #青色 white=$(tput setaf 7) reset_color=$(tput setaf 9) # Reset to default color = 9 # ---- get infos OS=$(uname -o) USER=`whoami` FROM=`who am i | grep -Po "(?<=\().*(?=\))"` HOSTNAME_FQDN=`hostname` HOSTNAME=`hostname -s` SELinux=$(/usr/sbin/sestatus | grep "SELinux status: " | awk '{print $3}') LastReboot=$(who -b | awk '{print $3,$4}') IP=`ip addr | awk '/inet/ && ! /\/32/ {ip[$NF] = $2; sub(/\/.*$/,"",ip[$NF])} END {for(i in ip){if(i ~ "en|eth0") print ip[i]}}'` if [ -f /etc/redhat-release ]; then RELEASE=`cat /etc/redhat-release` elif [ -f /etc/os-release ]; then RELEASE=$(cat /etc/os-release | sed -n 's/^NAME=\(.*\)/\1/p;s/^VERSION=\(.*\)/" "\1/p' | awk '{gsub(/"|,|^\s+|/, "");print}' | sed ":a;N;s/\n//g;ta") fi KERNEL_VERSION=`uname -r` CPU_Type=$(grep "model name" /proc/cpuinfo | awk -F ': ' '{print $2}' | sort | uniq) CPU_Arch=$(uname -m) # check_command docker && DOCKER_VERSION=`docker -v|awk '{print $3}'|cut -d',' -f1` PSA=`ps -Afl | wc -l` FORMATEDTIME=`date +"%Y-%m-%d %T"` # Time of day HOUR=$(date +"%H") if [ $HOUR -lt 12 -a $HOUR -ge 0 ]; then TIME="上午好" elif [ $HOUR -lt 17 -a $HOUR -ge 12 ]; then TIME="下午好" else TIME="晚上好" fi #### System uptime #### uptime=`cat /proc/uptime | cut -f1 -d.` upDays=$((uptime/60/60/24)) upHours=$((uptime/60/60%24)) upMins=$((uptime/60%60)) upSecs=$((uptime%60)) SYS_UPTIME="$upDays days $upHours hours $upMins minutes $upSecs seconds $RESET_COLORS" #### 网络检查 #### DNS=$(grep nameserver /etc/resolv.conf| grep -v "#" | awk '{print $2}' | tr '\n' ',' | sed 's/,$//') #### 进程检查 #### # 僵尸进程 defunct=$(ps -ef | grep defunct | grep -v grep | wc -l) ########## 资源统计 ######## # 列表显示系统资源使用情况 #memory MEMORY=`free -m|awk 'NR==2 {printf("内存 %.2f%% %sM %sM\n",100-($7*100/$2),$2,$3,$7)}'` #disk DISK_DATA=`df -Ph | egrep '/$|/data$' |awk '{printf "区(%s) %s %s %s\n", $6,$5,$3,$4}'` disk_warning=`df -Ph | egrep -v '/$|/data$' | sed '1d;/ /!N;s/\n//;s/ \+/ /;' | awk 'sub (/%/, "", $5){if ($5*1 > 89) printf "区(%s) %s %s %s\n", substr($6,1,10),$5,$3,$4}'` #load负载情况 up_time=`uptime` cpu_nums=`grep -c 'processor' /proc/cpuinfo` load_1min=`echo $up_time | awk '{print $(NF-2)}'|sed 's/,//g'` load_5min=`echo $up_time | awk '{print $(NF-1)}'|sed 's/,//g'` load_15min=`echo $up_time | awk '{print $NF}'|sed 's/,//g'` use_percent1=$(echo "$load_1min $cpu_nums" | awk '{printf ("%.1f\n",$1*100/$2)}') use_percent5=$(echo "$load_5min $cpu_nums" | awk '{printf ("%.1f\n",$1*100/$2)}') use_percent15=$(echo "$load_15min $cpu_nums" | awk '{printf ("%.1f\n",$1*100/$2)}') use_percent1=$([ `echo $use_percent1|awk '{print int($0)}'` -lt 100 ] && echo -n "$use_percent1" || echo -n 100) use_percent5=$([ `echo $use_percent5|awk '{print int($0)}'` -lt 100 ] && echo -n "$use_percent5" || echo -n 100) use_percent15=$([ `echo $use_percent15|awk '{print int($0)}'` -lt 100 ] && echo -n "$use_percent15" || echo -n 100) LOAD="负载1/5/15分钟 $use_percent1/$use_percent5/$use_percent15 - -" cpu_use_warning=$(top b -n1 |awk '/^ \s+PID/,/NF/'|head -n10 | awk 'NR>2{if ($9*1 > 50) printf "CPU占用@'${blue}'CPU:'${red}'%s% '${blue}'MEM:'${green}'%s% '${blue}'PID:'${green}'%s '${blue}'命令:'${green}'(%s)\n", $9,$10,$1,substr($NF,1,20)}') mem_use_warning=$(ps aux | awk '{print $2, $3, $4, $6, $11}' | sort -k4rn | head -n 10| awk 'NR>2{if ($3*1 > 50) printf "内存占用@'${blue}'CPU:'${green}'%s% '${blue}'MEM:'${red}'%s% '${blue}'RSS:'${green}'%s '${blue}'PID:'${green}'%s '${blue}'命令:'${green}'(%s)\n", $2,$3,$4,$1,substr($5,1,10)}') ######## 汇总显示项 ######## #system base info SYS_INFO="主机名@${HOSTNAME_FQDN}\nIP地址@${IP}\n系统@${OS}\n发行版本@${RELEASE}\n内核@${KERNEL_VERSION}\n核心@${cpu_nums}\nCPU型号@${CPU_Type}\nCPU架构@${CPU_Arch}\n当前时间@${FORMATEDTIME}\n运行时间@${SYS_UPTIME}\n最后启动@${LastReboot}\nSELinux@${SELinux}\nDNS@${DNS}\n进程数@${PSA}" if [ $defunct -gt 0 ]; then SYS_INFO="${SYS_INFO}\n僵尸进程@${defunct}" fi if [ "X$cpu_use_warning" != "X" ]; then SYS_INFO="${SYS_INFO}\n${cpu_use_warning}" fi if [ "X$mem_use_warning" != "X" ]; then SYS_INFO="${SYS_INFO}\n${mem_use_warning}" fi #usage info USAGE_INFO="${LOAD}\n${MEMORY}\n${DISK_DATA}" ## extra info if [ "X$disk_warning" != "X" ]; then USAGE_INFO="${USAGE_INFO}\n${disk_warning}" fi # if [[ "X$DOCKER_VERSION" != "X" ]]; then # SYS_INFO="${SYS_INFO}\nDocker版本@${DOCKER_VERSION}" # fi #################### 显示 ######################## # 显示hostname WIDTH=$(tput cols) # printf "${save_cursor}" # # Move up 8 lines # i=0 printf "${bold}${magenta}" if [ ! -z "$WIDTH" ];then figlet $HOSTNAME -k -w $WIDTH 2>/dev/null else figlet $HOSTNAME 2>/dev/null fi printf "${bold}${cyan}$TIME ${yellow}$USER${cyan}! ${white}【 ${blue}${bold}技 术 中 台 诊 断 信 息 ${white}】\n" # printf "${reset_attr}" # printf "${restore_cursor}" # #--------- calinda ------------------------------------------------------------- # printf "${cyan}" # cal # printf "${reset_attr}" #--------------- 显示logo-------------- # LogoColumn=23 # printf "${save_cursor}" # # Move up 8 lines # i=0 # while [ $((++i)) -lt 9 ]; do tput cuu1; done # tput cuf $LogoColumn # Move 49 columns right # printf "${red}${bold}技 术 中 台 ${reset_attr}${red}诊 断 信 息" # tput cud1 # Down one line # tput cuf $LogoColumn # tput cud1 # tput cuf $LogoColumn # printf "%s" "${bold}${cyan}$TIME ${yellow}$USER${cyan}!" # printf "${reset_attr}" # printf "${restore_cursor}" # #-------- TIME -------------------------------------------------------------- # TimeColumn=23 # printf "${save_cursor}" # # Move up 8 lines # i=0 # while [ $((++i)) -lt 6 ]; do tput cuu1; done # tput cuf $TimeColumn # Move 49 columns right # # Do we have the figlet package? # if hash figlet 2>/dev/null; then # if [ -f '/usr/share/figlet/miniwi.flf' ]; then # date +"%I:%M %P" | figlet -f /usr/share/figlet/miniwi.flf -k 2>/dev/null > /tmp/terminal # else # date +"%I:%M %P" | figlet -f /usr/share/figlet/mini.flf -k 2>/dev/null > /tmp/terminal # fi # # else use standard font # else # date +"%I:%M %P" > /tmp/terminal # fi # tput cud1 # Down one line # tput cuf $TimeColumn # while IFS= read -r Time; do # printf "${bold}${blue}" # printf "%s" "$Time" # tput cud1 # Up one line # tput cuf $TimeColumn # Move 49 columns right # done < /tmp/terminal # printf "${reset_attr}" # printf "${restore_cursor}" #----------显示监控信息------------------ echo -e "$SYS_INFO" | awk -F'@' -f /usr/local/bin/color.awk -e ' BEGIN{ separater = BRIGHT_CYAN("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); line = CYAN("-----------------------------------------------------------------"); title = BG_CYAN("项目 系统信息 "); print separater; print title; print line; } { if($1=="主机名"){ $2 = BRIGHT_MAGENTA($2) } else if($1=="IP地址"){ $2 = BRIGHT_YELLOW($2) } else if($1=="僵尸进程"){ $2 = BL_BRIGHT_YELLOW($2) } else if($1=="SELinux" && $2!="disabled"){ $2 = BL_BRIGHT_RED($2) } else{ $2 = GREEN($2); } $1 = BRIGHT_CYAN($1); printf "%-20s\t%-40s\t\n", $1,$2; }' echo -e "$USAGE_INFO" | awk -f /usr/local/bin/color.awk -e ' BEGIN{ separater = BRIGHT_CYAN("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); line = CYAN("-----------------------------------------------------------------"); title = BG_CYAN("项目 使用率 已用 空闲 图示 "); print separater; print title; print line; } { sub (/%/, "", $2); $5 = percent_bar($2) if($2*1 > 80 && $2*1 <= 89){ $1 = BRIGHT_YELLOW($1) $2 = BL_BRIGHT_YELLOW($2"%") $3 = BRIGHT_YELLOW($3); $4 = BL_BRIGHT_YELLOW($4); } else if($2*1 > 89){ $1 = BRIGHT_RED($1) $2 = BL_BRIGHT_RED($2"%") $3 = BRIGHT_RED($3); $4 = BL_BRIGHT_RED($4); } else{ $1 = BRIGHT_CYAN($1) $2 = BRIGHT_WHITE($2"%") $3 = BRIGHT_CYAN($3); $4 = GREEN($4); } printf "%-20s\t%-17s\t%-5s\t%-5s\t%-17s\t\n", $1,$2,$3,$4,$5; print line }' |
color.awk:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
function BLACK(X) { return "\033[30m" X "\033[0m" } function RED(X) { return "\033[31m" X "\033[0m" } function GREEN(X) { return "\033[32m" X "\033[0m" } function YELLOW(X) { return "\033[33m" X "\033[0m" } function BLUE(X) { return "\033[34m" X "\033[0m" } function MAGENTA(X) { return "\033[35m" X "\033[0m" } function CYAN(X) { return "\033[36m" X "\033[0m" } function WHITE(X) { return "\033[37m" X "\033[0m" } function BRIGHT_BLACK(X) { return "\033[90m" X "\033[0m" } function BRIGHT_RED(X) { return "\033[91m" X "\033[0m" } function BRIGHT_GREEN(X) { return "\033[92m" X "\033[0m" } function BRIGHT_YELLOW(X) { return "\033[93m" X "\033[0m" } function BRIGHT_BLUE(X) { return "\033[94m" X "\033[0m" } function BRIGHT_MAGENTA(X) { return "\033[95m" X "\033[0m" } function BRIGHT_CYAN(X) { return "\033[96m" X "\033[0m" } function BRIGHT_WHITE(X) { return "\033[97m" X "\033[0m" } function BG_BLACK(X) { return "\033[40m" X "\033[0m" } function BG_RED(X) { return "\033[41m" X "\033[0m" } function BG_GREEN(X) { return "\033[42m" X "\033[0m" } function BG_YELLOW(X) { return "\033[43m" X "\033[0m" } function BG_BLUE(X) { return "\033[44m" X "\033[0m" } function BG_MAGENTA(X) { return "\033[45m" X "\033[0m" } function BG_CYAN(X) { return "\033[46m" X "\033[0m" } function BG_WHITE(X) { return "\033[47m" X "\033[0m" } function BG_BRIGHT_BLACK(X) { return "\033[100m" X "\033[0m" } function BG_BRIGHT_RED(X) { return "\033[101m" X "\033[0m" } function BG_BRIGHT_GREEN(X) { return "\033[102m" X "\033[0m" } function BG_BRIGHT_YELLOW(X) { return "\033[103m" X "\033[0m" } function BG_BRIGHT_BLUE(X) { return "\033[104m" X "\033[0m" } function BG_BRIGHT_MAGENTA(X) { return "\033[105m" X "\033[0m" } function BG_BRIGHT_CYAN(X) { return "\033[106m" X "\033[0m" } function BG_BRIGHT_WHITE(X) { return "\033[107m" X "\033[0m" } #function SKYBLUE(X) { return "\033[38;2;40;177;249m" X "\033[0m" } function BL_BRIGHT_RED(X) { return "\033[91;5m" X "\033[0m" } function BL_BRIGHT_YELLOW(X) { return "\033[93;5m" X "\033[0m" } function BL_BRIGHT_BLUE(X) { return "\033[94;5m" X "\033[0m" } function BL_BRIGHT_MAGENTA(X) { return "\033[35;5m" X "\033[0m" } function BL_BRIGHT_CYAN(X) { return "\033[96;5m" X "\033[0m" } function percent_bar(percent){ sub(/%/, "", percent) space="" for(i=1;i<=17;i++){ space=space" " } total_space_len=length(space) if(percent ~ /\//){ each_space="" split(percent,pct,"/") total_num=length(pct) each_space_len=int((total_space_len - total_num - 1)/total_num + 0.9) for(i=1;i<=each_space_len;i++){ each_space=each_space" " } for(i in pct){ leadingspace="" trailingspace="" pc=pct[i] p=int(each_space_len*(pc/100)) leadingspace=substr(each_space,1,p) #printf leadingspace"~" trailingspace=substr(each_space,p+1,each_space_len) #printf "+"trailingspace if(pc*1 > 80 && pc*1 <= 89){ bar=bar"\033[43;37m" leadingspace "\033[47;30m" trailingspace "\033[0m""/" } else if(pc*1 > 89){ bar=bar"\033[41;37m" leadingspace "\033[47;30m" trailingspace "\033[0m""/" } else{ bar=bar"\033[104;37m" leadingspace "\033[47;30m" trailingspace "\033[0m""/" } } # remove "/" at the end sub(/\/$/, "", bar) return bar } p=(total_space_len*(percent/100)) leadingspace=substr(space,1,p+1) trailingspace=substr(space,p+2,total_space_len) if(percent*1 > 80 && percent*1 <= 89){ return "\033[43;37m" leadingspace "\033[47;30m" trailingspace "\033[0m" } else if(percent*1 > 89){ return "\033[41;37m" leadingspace "\033[47;30m" trailingspace "\033[0m" } else{ return "\033[104;37m" leadingspace "\033[47;30m" trailingspace "\033[0m" } } |
2023-7-14更新:
颜色显示统一用tput:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 |
#!/usr/bin/env bash # author: sean # date: 2023-05-11 # function: show dynamic information after login server # function check_command(){ # local r=0 # `command -v $1 >/dev/null 2>&1` || r=1 # return ${r} # } # ---- Set Colors save_cursor=$(tput sc) # Saves current cursor position.保存当前光标位置 restore_cursor=$(tput rc) # Restore the cursor position.恢复光标到上一次保存的位置 bold=$(tput bold) # 加粗字体 # half_bright=$(tput dim) # turn on half-bright mode # blink=$(tput blink) # Set blink mode # underline=$(tput smul) # Set underline mode # exit_underline=$(tput rmul) # Exit underline mode # reverse=$(tput rev) # Turn on reverse mode,突出模式,所有输出字符都突出显示。 # exit_reverse=$(tput rmso) # Exit standout mode,退出突出显示。 # reset_attr=$(tput sgr0) # Turn off all attributes,取消所有属性。 # tput setab [0-7] – 设置背景色。 # tput setaf [0-7] – 设置前景色。 # black=$(tput setaf 0) red=$(tput setaf 1) green=$(tput setaf 2) yellow=$(tput setaf 3) blue=$(tput setaf 4) magenta=$(tput setaf 5) #洋红 cyan=$(tput setaf 6) #青色 white=$(tput setaf 7) reset_color=$(tput setaf 9) # Reset to default color = 9 # ---- get infos USER=`whoami` FROM=`who am i | grep -Po "(?<=\().*(?=\))"` HOSTNAME_FQDN=`hostname` HOSTNAME=`hostname -s` IP=`ip addr | awk '/inet/ && ! /\/32/ {ip[$NF] = $2; sub(/\/.*$/,"",ip[$NF])} END {for(i in ip){if(i ~ "en|eth0") print ip[i]}}'` if [ -f /etc/redhat-release ]; then RELEASE=`cat /etc/redhat-release` elif [ -f /etc/os-release ]; then RELEASE=$(cat /etc/os-release | sed -n 's/^NAME=\(.*\)/\1/p;s/^VERSION=\(.*\)/" 版本:"\1/p' | awk '{gsub(/"|,|^\s+|/, "");print}' | sed ":a;N;s/\n//g;s/=/:/g;ta") fi KERNEL_VERSION=`uname -r` # check_command docker && DOCKER_VERSION=`docker -v|awk '{print $3}'|cut -d',' -f1` PSA=`ps -Afl | wc -l` FORMATEDTIME=`date +"%Y-%m-%d %T"` # Time of day HOUR=$(date +"%H") if [ $HOUR -lt 12 -a $HOUR -ge 0 ]; then TIME="上午好" elif [ $HOUR -lt 17 -a $HOUR -ge 12 ]; then TIME="下午好" else TIME="晚上好" fi # System uptime uptime=`cat /proc/uptime | cut -f1 -d.` upDays=$((uptime/60/60/24)) upHours=$((uptime/60/60%24)) upMins=$((uptime/60%60)) upSecs=$((uptime%60)) SYS_UPTIME="$upDays days $upHours hours $upMins minutes $upSecs seconds $RESET_COLORS" ########## 资源统计 ######## # 列表显示系统资源使用情况 #memory MEMORY=`free -m|awk 'NR==2 {printf("内存 %.2f%% %sM %sM\n",100-($7*100/$2),$2,$3,$7)}'` #disk DISK_DATA=`df -Ph | egrep '/$|/data$' |awk '{printf "区(%s) %s %s %s\n", $6,$5,$3,$4}'` disk_warning=`df -Ph | egrep -v '/$|/data$' | sed '1d;/ /!N;s/\n//;s/ \+/ /;' | awk 'sub (/%/, "", $5){if ($5*1 > 89) printf "区(%s) %s %s %s\n", substr($6,1,10),$5,$3,$4}'` #load负载情况 up_time=`uptime` cpu_nums=`grep -c 'processor' /proc/cpuinfo` cpu_load_1min=`echo $up_time | awk '{print $(NF-2)}'|sed 's/,//g'` cpu_load_5min=`echo $up_time | awk '{print $(NF-1)}'|sed 's/,//g'` cpu_load_15min=`echo $up_time | awk '{print $NF}'|sed 's/,//g'` cpu_use_percent_1m=$(echo "$cpu_load_1min $cpu_nums" | awk '{printf ("%.2f\n",$1*100/$2)}') cpu_use_percent_5m=$(echo "$cpu_load_5min $cpu_nums" | awk '{printf ("%.2f\n",$1*100/$2)}') cpu_use_percent_15m=$(echo "$cpu_load_15min $cpu_nums" | awk '{printf ("%.2f\n",$1*100/$2)}') LOAD1="负载1min $cpu_use_percent_1m $cpu_use_percent_1m $(awk "BEGIN{print 100-$cpu_use_percent_1m }")" LOAD5="负载5min $cpu_use_percent_5m $cpu_use_percent_5m $(awk "BEGIN{print 100-$cpu_use_percent_5m }")" LOAD15="负载15min $cpu_use_percent_15m $cpu_use_percent_15m $(awk "BEGIN{print 100-$cpu_use_percent_15m }")" LOAD="${LOAD1}\n${LOAD5}\n${LOAD15}" ######## 汇总显示项 ######## #system base info SYS_INFO="主机@${HOSTNAME_FQDN}\nIP@${IP}\n系统@${RELEASE}\n内核@${KERNEL_VERSION}\n核心@${cpu_nums}\n时间@${FORMATEDTIME}\n运行@${SYS_UPTIME}\n用户@${USER}\n进程@${PSA}" #usage info USAGE_INFO="${LOAD}\n${MEMORY}\n${DISK_DATA}" ## extra info if [[ "X$disk_warning" != "X" ]]; then USAGE_INFO="${USAGE_INFO}\n${disk_warning}" fi # if [[ "X$DOCKER_VERSION" != "X" ]]; then # SYS_INFO="${SYS_INFO}\nDocker版本@${DOCKER_VERSION}" # fi #################### 显示 ######################## # 显示hostname WIDTH=$(tput cols) printf "${save_cursor}" # Move up 8 lines i=0 printf "${bold}${magenta}" if [ ! -z "$WIDTH" ];then figlet $HOSTNAME -k -w $WIDTH 2>/dev/null else figlet $HOSTNAME 2>/dev/null fi printf "${reset_attr}" printf "${restore_cursor}" #--------- calinda ------------------------------------------------------------- printf "${cyan}" cal printf "${reset_attr}" #--------------- 显示logo-------------- LogoColumn=23 printf "${save_cursor}" # Move up 8 lines i=0 while [ $((++i)) -lt 9 ]; do tput cuu1; done tput cuf $LogoColumn # Move 49 columns right printf "${red}${bold}系 统 ${reset_attr}${red}诊 断 信 息" tput cud1 # Down one line tput cuf $LogoColumn tput cud1 tput cuf $LogoColumn printf "%s" "${bold}${cyan}$TIME ${yellow}$USER${cyan}!" printf "${reset_attr}" printf "${restore_cursor}" #-------- TIME -------------------------------------------------------------- TimeColumn=23 printf "${save_cursor}" # Move up 8 lines i=0 while [ $((++i)) -lt 6 ]; do tput cuu1; done tput cuf $TimeColumn # Move 49 columns right # Do we have the figlet package? if hash figlet 2>/dev/null; then if [ -f '/usr/share/figlet/miniwi.flf' ]; then date +"%I:%M %P" | figlet -f /usr/share/figlet/miniwi.flf -k 2>/dev/null > /tmp/terminal else date +"%I:%M %P" | figlet -f /usr/share/figlet/mini.flf -k 2>/dev/null > /tmp/terminal fi # else use standard font else date +"%I:%M %P" > /tmp/terminal fi tput cud1 # Down one line tput cuf $TimeColumn while IFS= read -r Time; do printf "${bold}${blue}" printf "%s" "$Time" tput cud1 # Up one line tput cuf $TimeColumn # Move 49 columns right done < /tmp/terminal printf "${reset_attr}" printf "${restore_cursor}" #----------显示监控信息------------------ echo -e "$SYS_INFO" | awk -F'@' -f /usr/local/bin/color.awk -e ' BEGIN{ separater = BRIGHT_CYAN("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); line = CYAN("---------------------------------------------------------"); title = BG_CYAN("项目 系统信息 "); print separater; print title; print line; } { if($1=="主机"){ $2 = BRIGHT_MAGENTA($2) } else if($1=="IP"){ $2 = BRIGHT_YELLOW($2) } else{ $2 = BRIGHT_GREEN($2); } $1 = BRIGHT_CYAN($1); printf "%-20s\t%-40s\t\n", $1,$2; }' echo -e "$USAGE_INFO" | awk -f /usr/local/bin/color.awk -e ' BEGIN{ separater = BRIGHT_CYAN("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); line = CYAN("---------------------------------------------------------"); title = BG_CYAN("项目 使用率 已用 空闲 图示 "); print separater; print title; print line; } { sub (/%/, "", $2); $5 = percent_bar($2) if($2*1 > 80 && $2*1 <= 89){ $1 = BRIGHT_YELLOW($1) $2 = BL_BRIGHT_YELLOW($2"%") $3 = BRIGHT_YELLOW($3); $4 = BL_BRIGHT_YELLOW($4); } else if($2*1 > 89){ $1 = BRIGHT_RED($1) $2 = BL_BRIGHT_RED($2"%") $3 = BRIGHT_RED($3); $4 = BL_BRIGHT_RED($4); } else{ $1 = BRIGHT_CYAN($1) $2 = BRIGHT_WHITE($2"%") $3 = BRIGHT_CYAN($3); $4 = GREEN($4); } printf "%-20s\t%s\t%-10s\t%-10s\t%-16s\t\n", $1,$2,$3,$4,$5; print line }' |
另外, figlet字体文件可从这里下载: https://github.com/xero/figlet-fonts/tree/master
字体效果可以在这里看: https://devhints.io/figlet
2023-6-26更新:
美化了一下样式:
dynmotd:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 |
#!/usr/bin/env bash # author: sean # date: 2023-05-11 # function: show dynamic information after login server # function check_command(){ # local r=0 # `command -v $1 >/dev/null 2>&1` || r=1 # return ${r} # } USER=`whoami` FROM=`who am i | grep -Po "(?<=\().*(?=\))"` HOSTNAME_FQDN=`hostname` HOSTNAME=`hostname -s` IP=`ip addr | awk '/inet/ && ! /\/32/ {ip[$NF] = $2; sub(/\/.*$/,"",ip[$NF])} END {for(i in ip){if(i ~ "en|eth0") print ip[i]}}'` if [ -f /etc/redhat-release ]; then RELEASE=`cat /etc/redhat-release` elif [ -f /etc/os-release ]; then RELEASE=$(cat /etc/os-release | sed -n 's/^NAME=\(.*\)\|^\(VERSION=.*\)/\1, \2/p'|awk '{gsub(/"|,|^\s+|/, "");print}'|sed ":a;N;s/\n//g;s/=/:/g;ta") fi KERNEL_VERSION=`uname -r` # check_command docker && DOCKER_VERSION=`docker -v|awk '{print $3}'|cut -d',' -f1` PSA=`ps -Afl | wc -l` FORMATEDTIME=`date +"%y-%m-%d %T"` # Time of day HOUR=$(date +"%H") if [ $HOUR -lt 12 -a $HOUR -ge 0 ]; then TIME="Morning" elif [ $HOUR -lt 17 -a $HOUR -ge 12 ]; then TIME="Afternoon" else TIME="Evening" fi # System uptime uptime=`cat /proc/uptime | cut -f1 -d.` upDays=$((uptime/60/60/24)) upHours=$((uptime/60/60%24)) upMins=$((uptime/60%60)) upSecs=$((uptime%60)) SYS_UPTIME="$upDays days $upHours hours $upMins minutes $upSecs seconds $RESET_COLORS" ########## 资源统计 ######## # 列表显示系统资源使用情况 #memory MEMORY=`free -m|awk 'NR==2 {printf("内存 %.2f%% %sM %sM\n",100-($7*100/$2),$2,$3,$7)}'` #disk DISK_DATA=`df -Ph| egrep '/$|/data$' |awk '{printf "区(%s) %s %s %s\n", $6,$5,$3,$4}'` disk_warning=`df -Ph | egrep -v '/$|/data$' | sed '1d;/ /!N;s/\n//;s/ \+/ /;' | awk 'sub (/%/, "", $5){if ($5*1 > 89) printf "区(%s) %s %s %s\n", substr($6,1,10),$5,$3,$4}'` #load负载情况 cpu_nums=`grep -c 'processor' /proc/cpuinfo` cpu_load_1min=`uptime | awk '{print $(NF-2)}'|sed 's/,//g'` cpu_load_5min=`uptime | awk '{print $(NF-1)}'|sed 's/,//g'` cpu_load_15min=`uptime | awk '{print $NF}'|sed 's/,//g'` cpu_use_percent_1m=$(echo "$cpu_load_1min $cpu_nums" | awk '{printf ("%.2f\n",$1*100/$2)}') cpu_use_percent_5m=$(echo "$cpu_load_5min $cpu_nums" | awk '{printf ("%.2f\n",$1*100/$2)}') cpu_use_percent_15m=$(echo "$cpu_load_15min $cpu_nums" | awk '{printf ("%.2f\n",$1*100/$2)}') LOAD1="负载1min $cpu_use_percent_1m $cpu_use_percent_1m $(awk "BEGIN{print 100-$cpu_use_percent_1m }")" LOAD5="负载5min $cpu_use_percent_5m $cpu_use_percent_5m $(awk "BEGIN{print 100-$cpu_use_percent_5m }")" LOAD15="负载15min $cpu_use_percent_15m $cpu_use_percent_15m $(awk "BEGIN{print 100-$cpu_use_percent_15m }")" LOAD="${LOAD1}\n${LOAD5}\n${LOAD15}" ######## 汇总显示项 ######## #system base info SYS_INFO="主机@${HOSTNAME_FQDN}\nIP@${IP}\n系统@${RELEASE}\n内核@${KERNEL_VERSION}\n核心@${cpu_nums}\n时间@${FORMATEDTIME}\n运行@${SYS_UPTIME}\n用户@${USER}\n进程@${PSA}" #usage info USAGE_INFO="${LOAD}\n${MEMORY}\n${DISK_DATA}" ## extra info if [[ "X$disk_warning" != "X" ]]; then USAGE_INFO="${USAGE_INFO}\n${disk_warning}" fi # if [[ "X$DOCKER_VERSION" != "X" ]]; then # SYS_INFO="${SYS_INFO}\nDocker版本@${DOCKER_VERSION}" # fi ########## 显示 ######## # 显示logo WIDTH=$(tput cols) AISATSU="GOOD $TIME $USER!" echo -ne "\e[1;35m" if [ ! -z "$WIDTH" ];then figlet $HOSTNAME -w $WIDTH -k 2>/dev/null else figlet $HOSTNAME -k 2>/dev/null fi echo -ne "\e[0m" echo -e "$SYS_INFO" | awk -F'@' -f /usr/local/bin/color.awk -e ' BEGIN{ separater = BRIGHT_CYAN("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); line = CYAN("---------------------------------------------------------"); $1 = BG_CYAN(" "); $2 = BG_CYAN("[ 技 术 中 台 诊 断 信 息 ]"); print separater; printf "%-20s%-20s%-20s\n", $1,$2,$1; print line; } { if($1=="IP"){ $2 = BL_BRIGHT_YELLOW($2) } else{ $2 = BRIGHT_GREEN($2); } $1 = BRIGHT_CYAN($1); printf "%-20s\t%-40s\t\n", $1,$2; }' echo -e "$USAGE_INFO" | awk -f /usr/local/bin/color.awk -e ' BEGIN{ separater = BRIGHT_CYAN("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); line = CYAN("---------------------------------------------------------"); title = BG_CYAN("项目 使用率 已用 空闲 图示 "); print separater; print title; print line; } { sub (/%/, "", $2); $5 = percent_bar($2) if($2*1 > 80 && $2*1 <= 89){ $1 = BL_BRIGHT_YELLOW($1) $2 = BL_BRIGHT_YELLOW($2"%") $3 = BL_BRIGHT_YELLOW($3); $4 = BL_BRIGHT_YELLOW($4); } else if($2*1 > 89){ $1 = BL_BRIGHT_RED($1) $2 = BL_BRIGHT_RED($2"%") $3 = BL_BRIGHT_RED($3); $4 = BL_BRIGHT_RED($4); } else{ $1 = BRIGHT_CYAN($1) $2 = BRIGHT_GREEN($2"%") $3 = BRIGHT_CYAN($3); $4 = GREEN($4); } printf "%-20s\t%s\t%-10s\t%-10s\t%-16s\t\n", $1,$2,$3,$4,$5; print line }' |
color.awk:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
function BLACK(X) { return "\033[30m" X "\033[0m" } function RED(X) { return "\033[31m" X "\033[0m" } function GREEN(X) { return "\033[32m" X "\033[0m" } function YELLOW(X) { return "\033[33m" X "\033[0m" } function BLUE(X) { return "\033[34m" X "\033[0m" } function MAGENTA(X) { return "\033[35m" X "\033[0m" } function CYAN(X) { return "\033[36m" X "\033[0m" } function WHITE(X) { return "\033[37m" X "\033[0m" } function BRIGHT_BLACK(X) { return "\033[90m" X "\033[0m" } function BRIGHT_RED(X) { return "\033[91m" X "\033[0m" } function BRIGHT_GREEN(X) { return "\033[92m" X "\033[0m" } function BRIGHT_YELLOW(X) { return "\033[93m" X "\033[0m" } function BRIGHT_BLUE(X) { return "\033[94m" X "\033[0m" } function BRIGHT_MAGENTA(X) { return "\033[95m" X "\033[0m" } function BRIGHT_CYAN(X) { return "\033[96m" X "\033[0m" } function BRIGHT_WHITE(X) { return "\033[97m" X "\033[0m" } function BG_BLACK(X) { return "\033[40m" X "\033[0m" } function BG_RED(X) { return "\033[41m" X "\033[0m" } function BG_GREEN(X) { return "\033[42m" X "\033[0m" } function BG_YELLOW(X) { return "\033[43m" X "\033[0m" } function BG_BLUE(X) { return "\033[44m" X "\033[0m" } function BG_MAGENTA(X) { return "\033[45m" X "\033[0m" } function BG_CYAN(X) { return "\033[46m" X "\033[0m" } function BG_WHITE(X) { return "\033[47m" X "\033[0m" } function BG_BRIGHT_BLACK(X) { return "\033[100m" X "\033[0m" } function BG_BRIGHT_RED(X) { return "\033[101m" X "\033[0m" } function BG_BRIGHT_GREEN(X) { return "\033[102m" X "\033[0m" } function BG_BRIGHT_YELLOW(X) { return "\033[103m" X "\033[0m" } function BG_BRIGHT_BLUE(X) { return "\033[104m" X "\033[0m" } function BG_BRIGHT_MAGENTA(X) { return "\033[105m" X "\033[0m" } function BG_BRIGHT_CYAN(X) { return "\033[106m" X "\033[0m" } function BG_BRIGHT_WHITE(X) { return "\033[107m" X "\033[0m" } #function SKYBLUE(X) { return "\033[38;2;40;177;249m" X "\033[0m" } function BL_BRIGHT_RED(X) { return "\033[91;5m" X "\033[0m" } function BL_BRIGHT_YELLOW(X) { return "\033[93;5m" X "\033[0m" } function BL_BRIGHT_BLUE(X) { return "\033[94;5m" X "\033[0m" } function BL_BRIGHT_MAGENTA(X) { return "\033[35;5m" X "\033[0m" } function BL_BRIGHT_CYAN(X) { return "\033[96;5m" X "\033[0m" } function percent_bar(percent){ sub (/%/, "", percent) space=" " len=length(space) p=(len*(percent/100)) leadingspace=substr(space,1,p+1) trailingspace=substr(space,p+2,len) if(percent*1 > 80 && percent*1 <= 89){ return "\033[43;37m" leadingspace "\033[47;30m" trailingspace "\033[0m" } else if(percent*1 > 89){ return "\033[41;37m" leadingspace "\033[47;30m" trailingspace "\033[0m" } else{ return "\033[104;37m" leadingspace "\033[47;30m" trailingspace "\033[0m" } } |
某些情况下可能因为磁盘等原因, 导致df等命令执行时间长,导致登录不进服务器, 所以可以增加执行的超时时间:在/etc/profile中添加5秒超时:
——
2023-4-28更新:
简化了一下显示,增加了显示条:
效果:
dynmotd:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
#!/bin/bash # function check_command(){ # local r=0 # `command -v $1 >/dev/null 2>&1` || r=1 # return ${r} # } USER=`whoami` FROM=`who am i | grep -Po "(?<=\().*(?=\))"` HOSTNAME_FQDN=`hostname` HOSTNAME=`hostname -s` IP=`ip addr | awk '/inet/ && ! /\/32/ {ip[$NF] = $2; sub(/\/.*$/,"",ip[$NF])} END {for(i in ip){if(i ~ "en|eth0") print ip[i]}}'` if [ -f /etc/redhat-release ]; then RELEASE=`cat /etc/redhat-release` elif [ -f /etc/os-release ]; then RELEASE=$(cat /etc/os-release | sed -n 's/^NAME=\(.*\)\|^VERSION=\(.*\)/\1, \2/p'|awk '{gsub(/"|,|^\s+|/, "");print}'|sed ":a;N;s/\n//g;ta") fi KERNEL_VERSION=`uname -r` # check_command docker && DOCKER_VERSION=`docker -v|awk '{print $3}'|cut -d',' -f1` PSA=`ps -Afl | wc -l` FORMATEDTIME=`date +"%y-%m-%d %T"` # Time of day HOUR=$(date +"%H") if [ $HOUR -lt 12 -a $HOUR -ge 0 ]; then TIME="Morning" elif [ $HOUR -lt 17 -a $HOUR -ge 12 ]; then TIME="Afternoon" else TIME="Evening" fi # System uptime uptime=`cat /proc/uptime | cut -f1 -d.` upDays=$((uptime/60/60/24)) upHours=$((uptime/60/60%24)) upMins=$((uptime/60%60)) upSecs=$((uptime%60)) SYS_UPTIME="$upDays days $upHours hours $upMins minutes $upSecs seconds $RESET_COLORS" ########## 资源统计 ######## # 列表显示系统资源使用情况 #memory MEMORY=`free -m|awk 'NR==2 {printf("内存 %.f%% %sM %sM\n",100-($7*100/$2),$2,$3,$7)}'` #disk DISK_DATA=`df -Ph| egrep '/$|/data$' |awk '{printf "区(%s) %s %s %s\n", $6,$5,$3,$4}'` disk_warning=`df -m | egrep -v '/$|/data$' | sed '1d;/ /!N;s/\n//;s/ \+/ /;' | awk 'sub (/%/, "", $5){if ($5*1 > 89) printf "区%s %s\n", $6,$5}' | cut -b -15` #load负载情况 cpu_nums=`grep -c 'processor' /proc/cpuinfo` cpu_load_5min=`uptime|awk '{print $11}'|sed 's/,//g'` cpu_use_percent=`echo $(( ${cpu_load_5min%.*} * 100 / $cpu_nums ))` LOAD="负载 $cpu_use_percent $cpu_use_percent $(( 100-$cpu_use_percent ))" ######## 汇总显示项 ######## #system base info SYS_INFO="主机@${HOSTNAME_FQDN}\nIP@${IP}\n系统@${RELEASE}\n内核@${KERNEL_VERSION}\n核心@${cpu_nums}\n时间@${FORMATEDTIME}\n运行@${SYS_UPTIME}\n用户@${USER}\n进程@${PSA}" #usage info USAGE_INFO="${LOAD}\n${MEMORY}\n${DISK_DATA}" ## extra info if [[ "X$disk_warning" != "X" ]]; then USAGE_INFO="${USAGE_INFO}\n${disk_warning}" fi if [[ "X$DOCKER_VERSION" != "X" ]]; then SYS_INFO="${SYS_INFO}\nDocker版本@${DOCKER_VERSION}" fi ########## 显示 ######## # 显示logo WIDTH=$(tput cols) AISATSU="GOOD $TIME $USER!" echo -ne "\e[1;35m" figlet $HOSTNAME -w $WIDTH echo -ne "\e[0m" echo -e "$SYS_INFO" | awk -F'@' -f /usr/local/bin/color.awk -e ' BEGIN{ line = "---------------------------------------------------------"; end = "➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿"; $1 = BRIGHT_WHITE("项目"); $2 = BRIGHT_WHITE("信息"); print end; printf "%-20s\t%-40s\t\n", $1,$2; print line; } { if($1=="IP地址"){ $2 = BL_BRIGHT_MAGENTA($2) } else{ $2 = BRIGHT_GREEN($2); } $1 = BRIGHT_CYAN($1); printf "%-20s\t%-40s\t\n", $1,$2; } END{ print end; }' echo -e "$USAGE_INFO" | awk -f /usr/local/bin/color.awk -e ' BEGIN{ line = "---------------------------------------------------------"; end = "➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿➿"; printf "%-20s\t%s\t%-15s\t%-15s\t%-16s\t\n", \ BRIGHT_MAGENTA("ITEM"),BRIGHT_MAGENTA("USAGE"),BRIGHT_MAGENTA("USED"),BRIGHT_MAGENTA("FREE"),BRIGHT_MAGENTA("BAR"); print line; } { sub (/%/, "", $2); $5 = percent_bar($2) if($2*1 > 80 && $2*1 <= 89){ $1 = BL_BRIGHT_YELLOW($1) $2 = BL_BRIGHT_YELLOW($2) } else if($2*1 > 89){ $1 = BL_BRIGHT_RED($1) $2 = BL_BRIGHT_RED($2) } else{ $1 = BRIGHT_CYAN($1) $2 = BRIGHT_GREEN($2) } $3 = BRIGHT_CYAN($3); $4 = GREEN($4); printf "%-20s\t%s%\t%-15s\t%-15s\t%-16s\t\n", $1,$2,$3,$4,$5; print line }' |
color.awk:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
function BLACK(X) { return "\033[30m" X "\033[0m" } function RED(X) { return "\033[31m" X "\033[0m" } function GREEN(X) { return "\033[32m" X "\033[0m" } function YELLOW(X) { return "\033[33m" X "\033[0m" } function BLUE(X) { return "\033[34m" X "\033[0m" } function MAGENTA(X) { return "\033[35m" X "\033[0m" } function CYAN(X) { return "\033[36m" X "\033[0m" } function WHITE(X) { return "\033[37m" X "\033[0m" } function BRIGHT_BLACK(X) { return "\033[90m" X "\033[0m" } function BRIGHT_RED(X) { return "\033[91m" X "\033[0m" } function BRIGHT_GREEN(X) { return "\033[92m" X "\033[0m" } function BRIGHT_YELLOW(X) { return "\033[93m" X "\033[0m" } function BRIGHT_BLUE(X) { return "\033[94m" X "\033[0m" } function BRIGHT_MAGENTA(X) { return "\033[95m" X "\033[0m" } function BRIGHT_CYAN(X) { return "\033[96m" X "\033[0m" } function BRIGHT_WHITE(X) { return "\033[97m" X "\033[0m" } function BG_BLACK(X) { return "\033[40m" X "\033[0m" } function BG_RED(X) { return "\033[41m" X "\033[0m" } function BG_GREEN(X) { return "\033[42m" X "\033[0m" } function BG_YELLOW(X) { return "\033[43m" X "\033[0m" } function BG_BLUE(X) { return "\033[44m" X "\033[0m" } function BG_MAGENTA(X) { return "\033[45m" X "\033[0m" } function BG_CYAN(X) { return "\033[46m" X "\033[0m" } function BG_WHITE(X) { return "\033[47m" X "\033[0m" } function BG_BRIGHT_BLACK(X) { return "\033[100m" X "\033[0m" } function BG_BRIGHT_RED(X) { return "\033[101m" X "\033[0m" } function BG_BRIGHT_GREEN(X) { return "\033[102m" X "\033[0m" } function BG_BRIGHT_YELLOW(X) { return "\033[103m" X "\033[0m" } function BG_BRIGHT_BLUE(X) { return "\033[104m" X "\033[0m" } function BG_BRIGHT_MAGENTA(X) { return "\033[105m" X "\033[0m" } function BG_BRIGHT_CYAN(X) { return "\033[106m" X "\033[0m" } function BG_BRIGHT_WHITE(X) { return "\033[107m" X "\033[0m" } #function SKYBLUE(X) { return "\033[38;2;40;177;249m" X "\033[0m" } function BL_BRIGHT_RED(X) { return "\033[91;5m" X "\033[0m" } function BL_BRIGHT_YELLOW(X) { return "\033[93;5m" X "\033[0m" } function BL_BRIGHT_BLUE(X) { return "\033[94;5m" X "\033[0m" } function BL_BRIGHT_MAGENTA(X) { return "\033[35;5m" X "\033[0m" } function BL_BRIGHT_CYAN(X) { return "\033[96;5m" X "\033[0m" } function percent_bar(percent){ sub (/%/, "", percent) space=" " len=length(space) p=(len*(percent/100)) leadingspace=substr(space,1,p+1) trailingspace=substr(space,p+1,len) if(percent*1 > 80 && percent*1 <= 89){ return "\033[43;37m" leadingspace "\033[45;37m" trailingspace "\033[0m" } else if(percent*1 > 89){ return "\033[43;37m" leadingspace "\033[41;37m" trailingspace "\033[0m" } else{ return "\033[43;37m" leadingspace "\033[42;37m" trailingspace "\033[0m" } } |
附: 用python实现颜色效果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
#/usr/bin/python #-*- coding: utf-8 -*- # 格式:\033[显示方式;前景色;背景色m # 说明: # # 前景色 背景色 颜色 # --------------------------------------- # 30 40 黑色 # 31 41 红色 # 32 42 绿色 # 33 43 黃色 # 34 44 蓝色 # 35 45 紫红色 # 36 46 青蓝色 # 37 47 白色 # # 显示方式 意义 # ------------------------- # 0 终端默认设置 # 1 高亮显示 # 4 使用下划线 # 5 闪烁 # 7 反白显示 # 8 不可见 # # 例子: # \033[1;31;40m <!--1-高亮显示 31-前景色红色 40-背景色黑色--> # \033[0m <!--采用终端默认设置,即取消颜色设置-->]]] STYLE = { 'fore': { # 前景色 'black' : 30, # 黑色 'red' : 31, # 红色 'green' : 32, # 绿色 'yellow' : 33, # 黄色 'blue' : 34, # 蓝色 'purple' : 35, # 紫红色 'cyan' : 36, # 青蓝色 'white' : 37, # 白色 }, 'back' : { # 背景 'black' : 40, # 黑色 'red' : 41, # 红色 'green' : 42, # 绿色 'yellow' : 43, # 黄色 'blue' : 44, # 蓝色 'purple' : 45, # 紫红色 'cyan' : 46, # 青蓝色 'white' : 47, # 白色 }, 'mode' : { # 显示模式 'mormal' : 0, # 终端默认设置 'bold' : 1, # 高亮显示 'underline' : 4, # 使用下划线 'blink' : 5, # 闪烁 'invert' : 7, # 反白显示 'hide' : 8, # 不可见 }, 'default' : { 'end' : 0, }, } def UseStyle(string, mode = '', fore = '', back = ''): if STYLE['mode'].has_key(mode): mode = STYLE['mode'][mode] else: mode = '' if STYLE['fore'].has_key(fore): fore = STYLE['fore'][fore] else: fore = '' if STYLE['back'].has_key(back): back = STYLE['back'][back] else: back = '' stylelist = [] if mode != '': stylelist.append(str(mode)) if fore != '': stylelist.append(str(fore)) if back != '': stylelist.append(str(back)) style = ';'.join(stylelist) style = '\033[%sm' % style end = '\033[%sm' % STYLE['default']['end'] return '%s%s%s' % (style, string, end) def TestColor( ): print UseStyle('正常显示') print '' print "测试显示模式" print UseStyle('高亮', mode = 'bold'), print UseStyle('下划线', mode = 'underline'), print UseStyle('闪烁', mode = 'blink'), print UseStyle('反白', mode = 'invert'), print UseStyle('不可见', mode = 'hide') print '' print "测试前景色" print UseStyle('黑色', fore = 'black'), print UseStyle('红色', fore = 'red'), print UseStyle('绿色', fore = 'green'), print UseStyle('黄色', fore = 'yellow'), print UseStyle('蓝色', fore = 'blue'), print UseStyle('紫红色', fore = 'purple'), print UseStyle('青蓝色', fore = 'cyan'), print UseStyle('白色', fore = 'white') print '' print "测试背景色" print UseStyle('黑色', back = 'black'), print UseStyle('红色', back = 'red'), print UseStyle('绿色', back = 'green'), print UseStyle('黄色', back = 'yellow'), print UseStyle('蓝色', back = 'blue'), print UseStyle('紫红色', back = 'purple'), print UseStyle('青蓝色', back = 'cyan'), print UseStyle('白色', back = 'white') print '' if __name__ == '__main__': TestColor( ) |
2019-7-9更新:
花了几个晚上, 终于写好了,主要是格式不太好调,还有个坑:就是要显示的N行字符格式很重要, 直接shell赋值的如a=”aaa”跟用awk打印的字符, 最后用awk显示的时候,如果加上颜色显示, 字符长度是不一样的。
有几个坑:
- 每个汉字占两到四个字节, 所以加起来特别长, 在进行格式排版时很不容易排, 所以最好用英文.
- awk的NF设置时, 最好设置在外面, 如awk -F: 如果放到语句里面的话, 第一行会先读进缓冲区, 会导致第一行总是会区分不到分隔符, 这个坑试了好多次, 放到外面就没有问题了.
- awk做数字大小比较时, 如果直接比较的话, 会有问题, 处理方式是: 将数字剩1, 这样强制shell转换成数字再去比较
- 取机器IP地址时, 会取到广播地址(x.x.x.250/32), 所有过滤掉此地址
- 计算机系统负载百分比, 应该用vmstat 1 5来计算机5次做平均值, 但是为了增加ssh登录速度, 而只取一次的值
脚本如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
#!/bin/bash USER=`whoami` FROM=`who am i | grep -Po "(?<=\().*(?=\))"` HOSTNAME_FQDN=`hostname` HOSTNAME=`echo $HOSTNAME_FQDN|cut -d. -f1` IP=`ip addr | awk '/inet/&& ! /\/32/ {ip[$NF] = $2; sub(/\/.*$/,"",ip[$NF])} END {print ("eth0" in ip ? ip["eth0"] : ip["wlan0"])}'` RELEASE=`cat /etc/redhat-release` USERS_NUM=`users | wc -w` KERNEL_VERSION=`uname -r` DOCKER_VERSION=`docker -v|awk '{print $3}'|cut -d',' -f1` PSA=`ps -Afl | wc -l` FORMATEDTIME=`date +"%y-%m-%d %T"` # Time of day HOUR=$(date +"%H") if [ $HOUR -lt 12 -a $HOUR -ge 0 ]; then TIME="Morning" elif [ $HOUR -lt 17 -a $HOUR -ge 12 ]; then TIME="Afternoon" else TIME="Evening" fi # System uptime uptime=`cat /proc/uptime | cut -f1 -d.` upDays=$((uptime/60/60/24)) upHours=$((uptime/60/60%24)) upMins=$((uptime/60%60)) upSecs=$((uptime%60)) #SYS_UPTIME="${upDays}天${upHours}时${upMins}分${upSecs}秒" SYS_UPTIME="$upDays days $upHours hours $upMins minutes $upSecs seconds $RESET_COLORS" ########## 资源统计 ######## #memory MEMORY=`free -m|sed -n '2p'|awk '{printf("内存 %.2f%% 容量:%sM 已用:%sM 可用:%sM\n",100-($7*100/$2),$2,$3,$7)}'` #disk DISK_ROOT=`df -Ph| grep '/$' |awk '{printf "根目录 %s 容量:%s 已用:%s 可用:%s", $5,$2,$3,$4 }'` DISK_DATA=`df -Ph| grep ' /data$' |awk '{printf "数据盘 %s 容量:%s 已用:%s 可用:%s", $5,$2,$3,$4 }'` disk_warning=`df -m | sed '1d;/ /!N;s/\n//;s/ \+/ /;' | awk 'sub (/%/, "", $5){if ($5*1 > 80) printf "分区 %s %s\n", $5,$6}' | cut -b -24` #load负载情况 cpu_nums=`cat /proc/cpuinfo | grep "processor"|wc -l` load1=`w | grep 'average' | awk '{print $(NF-2)}'| sed 's/,//g'` load5=`w | grep 'average' | awk '{print $(NF-1)}'| sed 's/,//g'` load15=`w | grep 'average' | awk '{print $NF}'| sed 's/,//g'` #CpuIdle=`vmstat 1 5 |sed -n '3,$p' |awk '{x = x + $15} END {print x/5}' |awk -F. '{print $1}'` CpuIdle=`vmstat |sed -n '3,$p' |awk '{print $15}' |awk -F. '{print $1}'` CpuUsg=`echo "$((100-$CpuIdle))"` LOAD=`awk 'BEGIN{printf "负载 %.2f% 1分钟%s 5分钟%s 15分钟%s\n", '$CpuUsg', '$load1','$load5','$load15'}'` ######## 汇总显示项 ######## #system base info SYS_INFO="主机名@${HOSTNAME_FQDN}\nIP地址@${IP}\n系统版本@${RELEASE}\n内核版本@${KERNEL_VERSION}\n核心数@${cpu_nums}\n已登录用户@${USERS_NUM}\n系统时间@${FORMATEDTIME}\n系统运行@${SYS_UPTIME}\n当前用户@${USER}\n进程数@${PSA}" #usage info USAGE_INFO="${LOAD}\n${MEMORY}\n${DISK_ROOT}\n${DISK_DATA}" ## extra info if [[ "X$disk_warning" != "X" ]]; then USAGE_INFO="${USAGE_INFO}\n${disk_warning}" fi if [[ "X$DOCKER_VERSION" != "X" ]]; then SYS_INFO="${SYS_INFO}\nDocker版本@${DOCKER_VERSION}" fi ########## 显示 ######## # 显示logo WIDTH=$(tput cols) AISATSU="GOOD $TIME $USER!" echo -ne "\e[1;32m" cowsay -f `cowsay -l|grep -v 'Cow files in /usr/share/cowsay:' | sed 's/ /\n/g'|shuf -n1` `echo "$AISATSU"` echo echo -ne "\e[1;35m" figlet $HOSTNAME -w $WIDTH echo -ne "\e[0m" echo -e "$SYS_INFO" | awk -F'@' -f /usr/local/bin/color.awk -e ' BEGIN{ $1 = BRIGHT_CYAN("项目"); $2 = BRIGHT_GREEN("信息"); print "---------------------------------------------------------------------------------"; printf "|%-25s\t|%-60s\t|\n", $1,$2; print "---------------------------------------------------------------------------------"; } { if($1=="IP地址"){ $2 = BL_BRIGHT_MAGENTA($2) } else{ $2 = BRIGHT_GREEN($2); } $1 = BRIGHT_CYAN($1); printf "|%-25s\t|%-60s\t|\n", $1,$2; } END{ print "---------------------------------------------------------------------------------"; }' # 列表显示系统资源使用情况 echo -e "$USAGE_INFO" | awk -f /usr/local/bin/color.awk -e ' BEGIN{ printf "|%-15s\t|%-20s\t|%-20s\t|%-20s\t|%-20s\t|\n", \ BG_BRIGHT_BLUE("监控项"),BG_BRIGHT_BLUE("使用率(%)"),BG_BRIGHT_BLUE("总量"),BG_BRIGHT_BLUE("已用"),BG_BRIGHT_BLUE("可用"); print "---------------------------------------------------------------------------------"; } { sub (/%/, "", $2); if($2*1 > 80){ $1 = BL_BRIGHT_RED($1) $2 = BL_BRIGHT_RED($2) sub (/$2/, "$2%", $2) } else{ $1 = BRIGHT_WHITE($1) $2 = BRIGHT_YELLOW($2) } $3 = BRIGHT_MAGENTA($3); $4 = BRIGHT_CYAN($4); $5 = BRIGHT_GREEN($5); printf "|%-20s\t|%-20s\t|%-20s\t|%-20s\t|%-20s\t|\n", $1,$2,$3,$4,$5; } END{ print "---------------------------------------------------------------------------------"; }' |
color.awk
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
function BLACK(X) { return "\033[30m" X "\033[0m" } function RED(X) { return "\033[31m" X "\033[0m" } function GREEN(X) { return "\033[32m" X "\033[0m" } function YELLOW(X) { return "\033[33m" X "\033[0m" } function BLUE(X) { return "\033[34m" X "\033[0m" } function MAGENTA(X) { return "\033[35m" X "\033[0m" } function CYAN(X) { return "\033[36m" X "\033[0m" } function WHITE(X) { return "\033[37m" X "\033[0m" } function BRIGHT_BLACK(X) { return "\033[90m" X "\033[0m" } function BRIGHT_RED(X) { return "\033[91m" X "\033[0m" } function BRIGHT_GREEN(X) { return "\033[92m" X "\033[0m" } function BRIGHT_YELLOW(X) { return "\033[93m" X "\033[0m" } function BRIGHT_BLUE(X) { return "\033[94m" X "\033[0m" } function BRIGHT_MAGENTA(X) { return "\033[95m" X "\033[0m" } function BRIGHT_CYAN(X) { return "\033[96m" X "\033[0m" } function BRIGHT_WHITE(X) { return "\033[97m" X "\033[0m" } function BG_BLACK(X) { return "\033[40m" X "\033[0m" } function BG_RED(X) { return "\033[41m" X "\033[0m" } function BG_GREEN(X) { return "\033[42m" X "\033[0m" } function BG_YELLOW(X) { return "\033[43m" X "\033[0m" } function BG_BLUE(X) { return "\033[44m" X "\033[0m" } function BG_MAGENTA(X) { return "\033[45m" X "\033[0m" } function BG_CYAN(X) { return "\033[46m" X "\033[0m" } function BG_WHITE(X) { return "\033[47m" X "\033[0m" } function BG_BRIGHT_BLACK(X) { return "\033[100m" X "\033[0m" } function BG_BRIGHT_RED(X) { return "\033[101m" X "\033[0m" } function BG_BRIGHT_GREEN(X) { return "\033[102m" X "\033[0m" } function BG_BRIGHT_YELLOW(X) { return "\033[103m" X "\033[0m" } function BG_BRIGHT_BLUE(X) { return "\033[104m" X "\033[0m" } function BG_BRIGHT_MAGENTA(X) { return "\033[105m" X "\033[0m" } function BG_BRIGHT_CYAN(X) { return "\033[106m" X "\033[0m" } function BG_BRIGHT_WHITE(X) { return "\033[107m" X "\033[0m" } #function SKYBLUE(X) { return "\033[38;2;40;177;249m" X "\033[0m" } function BL_BRIGHT_RED(X) { return "\033[91;5m" X "\033[0m" } function BL_BRIGHT_YELLOW(X) { return "\033[93;5m" X "\033[0m" } function BL_BRIGHT_BLUE(X) { return "\033[94;5m" X "\033[0m" } function BL_BRIGHT_MAGENTA(X) { return "\033[35;5m" X "\033[0m" } function BL_BRIGHT_CYAN(X) { return "\033[96;5m" X "\033[0m" } |
部署脚本为:
dynmotd.yml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
--- - hosts: all become: yes remote_user: adminuser gather_facts: false vars: - base_url: "https://developer.yonyoucloud.com/download/op" tasks: - name: "install package." yum: name={{ item }} state=present with_items: - "{{ base_url }}/motd/cowsay-3.04-12.fc30.noarch.rpm" - "{{ base_url }}/motd/figlet-2.2.5-9.el7.x86_64.rpm" - name: delete old file file: path: /usr/local/bin/dynmotd state: absent - name: "copy dynmotd file to remote host." get_url: url: '{{ item.url }}' dest: '{{ item.dest }}' mode: 0755 force: yes with_items: - { url: '{{ base_url }}/motd/dynmotd', dest: '/usr/local/bin/dynmotd'} - { url: '{{ base_url }}/motd/color.awk', dest: '/usr/local/bin/color.awk'} - name: "add line in profile" lineinfile: dest: /etc/profile line: "/usr/local/bin/dynmotd" tags: - add_dynmotd |
hosts.ini:
1 2 3 4 5 6 7 8 9 10 11 |
[aliyun] 192.168.1.5 192.168.1.6 [aliyun:vars] ansible_ssh_user=sean ansible_ssh_pass=xxxxxx ansible_sudo_pass=xxxxxx become=yes become_user=root become_method=sudo |
部署:
1 |
ansible-playbook -i hosts.ini dynmotd.yml |
关闭连接确认, 可以打开/etc/ansible/ansible.cfg :
host_key_checking = False
然后在host.ini里增加: 10.3.15.[5:255] 就可以部署到所有此网段的机器上了
———————————– old ————————————————-
脚本为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
#!/bin/bash # Installation: # # 1. vim /etc/ssh/sshd_config # PrintMotd no # # 2. vim /etc/pam.d/login # # session optional pam_motd.so # # 3. vim /etc/profile # /usr/local/bin/dynmotd # Place at the bottom # # 4. Then of course drop this file at # /usr/local/bin/dynmotd # USER=`whoami` FROM=`who am i | grep -Po "(?<=\().*(?=\))"` HOSTNAME=`uname -n` IP=`hostname -i` DISK_ROOT=`df -Ph| grep '/$' |awk '{printf "已用%: %2'\''s |可用: %-2'\''s |容量: %-2'\''s", $5, $4, $2 }'` DISK_DATA=`df -Ph| grep '/data$' |awk '{printf "已用%: %2'\''s |可用: %-2'\''s |容量: %-2'\''s", $5, $4, $2 }'` CPU=`cat /proc/cpuinfo | grep name | cut -f2 -d:` CPU_MODEL=`echo "${CPU}" | uniq | awk '{$1=$1};1'` LOGICAL_CPU_COUNT=`echo "${CPU}" | wc -l` MEMORY=`free -h | grep "Mem" | awk '{printf "已用: %2'\''s |可用: %-2'\''s |总量 %-2'\''s", $3, $7, $2 }'` PSA=`ps -Afl | wc -l` FORMATEDTIME=`date +"%y-%m-%d %T"` # Time of day HOUR=$(date +"%H") if [ $HOUR -lt 12 -a $HOUR -ge 0 ]; then TIME="morning" elif [ $HOUR -lt 17 -a $HOUR -ge 12 ]; then TIME="afternoon" else TIME="evening" fi # System uptime uptime=`cat /proc/uptime | cut -f1 -d.` upDays=$((uptime/60/60/24)) upHours=$((uptime/60/60%24)) upMins=$((uptime/60%60)) upSecs=$((uptime%60)) # System load LOAD1=`cat /proc/loadavg | awk {'print $1'}` LOAD5=`cat /proc/loadavg | awk {'print $2'}` LOAD15=`cat /proc/loadavg | awk {'print $3'}` # aisatsu WIDTH=$(tput cols) AISATSU="------ GOOD $TIME $USER ------" echo -ne "\e[1;35m" figlet $HOSTNAME -c -w $WIDTH echo echo -ne "\e[1;32m" printf "%*s\n" $(((${#AISATSU}+$WIDTH)/2)) "$AISATSU" echo -ne "\e[0m" COLOR_COLUMN="\e[1m-" COLOR_VALUE="\e[36m" COLOR_VALUE_WHITE="\e[46;37m" COLOR_VALUE_RED="\e[46;31m" RESET_COLORS="\e[0m" echo -e " =========================================================================== $COLOR_COLUMN- Hostname$RESET_COLORS............: $COLOR_VALUE_RED $HOSTNAME $RESET_COLORS $COLOR_COLUMN- IP Address$RESET_COLORS..........: $COLOR_VALUE_RED $IP $RESET_COLORS $COLOR_COLUMN- Release$RESET_COLORS.............: $COLOR_VALUE `cat /etc/redhat-release` $RESET_COLORS $COLOR_COLUMN- CPU model$RESET_COLORS...........: $COLOR_VALUE $CPU_MODEL $RESET_COLORS $COLOR_COLUMN- Logical CPU count$RESET_COLORS...: $COLOR_VALUE $LOGICAL_CPU_COUNT $RESET_COLORS $COLOR_COLUMN- Users$RESET_COLORS...............: $COLOR_VALUE Currently `users | wc -w` user(s) logged on $RESET_COLORS =========================================================================== $RESET_COLORS $COLOR_COLUMN- System time$RESET_COLORS.........: $COLOR_VALUE $FORMATEDTIME $RESET_COLORS $COLOR_COLUMN- System uptime$RESET_COLORS.......: $COLOR_VALUE $upDays days $upHours hours $upMins minutes $upSecs seconds $RESET_COLORS $COLOR_COLUMN- Current user$RESET_COLORS........: $COLOR_VALUE $USER (from $FROM) $RESET_COLORS $COLOR_COLUMN- Load average$RESET_COLORS........: $COLOR_VALUE $LOAD1, $LOAD5, $LOAD15 $RESET_COLORS $COLOR_COLUMN- Memory usage$RESET_COLORS........: $COLOR_VALUE_RED $MEMORY $RESET_COLORS $COLOR_COLUMN- Disk / space$RESET_COLORS........: $COLOR_VALUE_RED $DISK_ROOT $RESET_COLORS $COLOR_COLUMN- Disk /data space$RESET_COLORS....: $COLOR_VALUE_RED $DISK_DATA $RESET_COLORS $COLOR_COLUMN- Processes$RESET_COLORS...........: $COLOR_VALUE $PSA running $RESET_COLORS ============================================================================ " |
安装部署脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
#!/bin/bash # # ATUHOR: sean # CREATED AT: 2018-5-9 # 注:figlet可以直接yum装: yum install -y figlet # 在我的VPS上死活找不着这个包,所以只能用rpm离线安装了 #2019-05-12更新:yum装不上是因为默认没有开epel源,打开方法为: #第一步、安装EPEL #yum install -y epel-release #第二步、启动组件包 #yum install -y yum-utils #yum-config-manager --enable epel #另外:PrintMotd no不要往sshd_conf里加了,重启sshd会报错的 deploy_dir="/usr/local/bin" # deploy file deploy_file_name="dynmotd" base_url="https://xxx.xxx.com/download/op/motd" rpm -ivh $base_url/figlet-2.2.5-9.el7.x86_64.rpm rpm -ivh $base_url/cowsay-3.04-12.fc30.noarch.rpm curl -so ${deploy_dir}/dynmotd $base_url/dynmotd curl -so ${deploy_dir}/color.awk $base_url/color.awk chmod +x ${deploy_dir}/* #不要添加PrintMotd no,sshd会报错,如添加了的话,用下面那行删除 #grep "^PrintMotd no" /etc/ssh/sshd_config > /dev/null || echo "PrintMotd no" >> /etc/ssh/sshd_config #grep "^PrintMotd no" /etc/ssh/sshd_config > /dev/null && sed -i "s/PrintMotd no//g" /etc/ssh/sshd_config grep "^/usr/local/bin/dynmotd" /etc/profile > /dev/null || echo "/usr/local/bin/dynmotd" >> /etc/profile grep ":/usr/local/bin:" /etc/profile > /dev/null || printf "PATH="$PATH:/usr/local/bin:/usr/local/sbin" \nexport PATH\n" >> /etc/profile #sed -i "/pam_motd.so/ s/^/#/" /etc/pam.d/login |
效果图如下:
附: 各颜色对应:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
#!/usr/bin/env bash #下面是字体输出颜色及终端格式控制 #字体色30-37 # echo -e "\033[30m黑色字\033[0m" # echo -e "\033[31m红色字\033[0m" # echo -e "\033[32m绿色字\033[0m" # echo -e "\033[33m黄色字\033[0m" # echo -e "\033[34m蓝色字\033[0m" # echo -e "\033[35m紫色字\033[0m" # echo -e "\033[36m天蓝字\033[0m" # echo -e "\033[37m白色字\033[0m" # #字背景颜色范围:40-47 # echo -e "\033[40;37m黑底白字\033[0m" # echo -e "\033[41;33m 红底黄字 \033[0m" # echo -e "\033[41;37m 红底白字 \033[0m" # echo -e "\033[41;30m红底黑字\033[0m" # echo -e "\033[42;34m绿底蓝字\033[0m" # echo -e "\033[43;34m黄底蓝字\033[0m" # echo -e "\033[44;30m蓝底黑字\033[0m" # echo -e "\033[45;30m紫底黑字\033[0m" # echo -e "\033[46;30m天蓝底黑字\033[0m" # echo -e "\033[47;34m白底蓝字\033[0m" function black(){ echo -e "\033[30m$1\033[0m" } function red(){ echo -e "\033[31m$1\033[0m" } function green(){ echo -e "\033[32m$1\033[0m" } function yellow(){ echo -e "\033[33m$1\033[0m" } function blue(){ echo -e "\033[34m$1\033[0m" } function purple(){ echo -e "\033[35m$1\033[0m" } #天蓝字 function navy_blue(){ echo -e "\033[36m$1\033[0m" } function white(){ echo -e "\033[37m$1\033[0m" } ##### background ##### #黑底白字 function black_white(){ echo -e "\033[40;37m$1\033[0m" } #红底黄字 function red_yellow(){ echo -e "\033[41;33m$1\033[0m" } #红底黄字 function red_white(){ echo -e "\033[41;37m$1\033[0m" } #红底黄字 function red_black(){ echo -e "\033[41;30m$1\033[0m" } #绿底蓝字 function green_blue(){ echo -e "\033[42;34m$1\033[0m" } #黄底蓝字 function yellow_blue(){ echo -e "\033[43;34m$1\033[0m" } #蓝底黑字 function blue_black(){ echo -e "\033[44;30m$1\033[0m" } #紫底黑字 function purple_black(){ echo -e "\033[45;30m$1\033[0m" } #天蓝底黑字 function navy_blue_black(){ echo -e "\033[46;30m$1\033[0m" } #白底蓝字 function white_blue(){ echo -e "\033[47;34m$1\033[0m" } ##### blick ##### function bred(){ echo -e "\033[31;5m$1\033[0m" } function byellow(){ echo -e "\033[33;5m$1\033[0m" } |
0 Comments