跳到主要内容

vps登录信息

效果

● RACKNERD VPS DASHBOARD (2025-12-17 20:56:43)
---------------------------------------------------------------------
 OS:        GNU/Linux x86_64          | LAST:      Dec 17 19:55 (root)      
 KERNEL:    6.8.0                     | UPTIME:    4 hours, 36 minutes      

 CPU Load     [------------------------------]   0.5%  0/2
 RAM Usage    [=====-------------------------]  19.0%  374/1967M
 Disk Space   [===---------------------------]  12.4%  3618/29141M
 Net Monthly  [------------------------------]   0.0%  272/4194304M
 Processes    [======------------------------]  23.2%  116/500
 Services     [=======-----------------------]  25.6%  21/82

 网络流量详情:
  今日累计: ↑ 136.04 MiB      ↓ 136.89 MiB     
  今日总计: 272.93 MiB        | 本月预估: 86.84 GiB      

 关键服务状态:
   ssh            docker         nginx          mysql       
---------------------------------------------------------------------
 快捷操作: 输入 btop | vnstat -l (查看实时跳动)

~ 

实现

首先我喜欢彩色终端,不喜欢原来的单色输出。所以安装了 zsh 和 oh-my-posh,并设置为默认登录终端。

apt update
apt install zsh oh-my-posh
chsh -s $(which zsh)

我希望在登录界面展示 CPU、RAM、Disk、流量、进程、服务的信息。流量统计需要安装 vnstat。

apt install vnstat btop -y

我们屏蔽掉默认输出,然后在 .zshrc 中调用脚本输出自定义信息。

屏蔽默认输出
touch ~/.hushlogin

脚本内容

sh~/custom-scripts/vps-dashboard.sh
#!/bin/bash

# --- 兼容性配色方案 ---
BOLD='\033[1m'
GRAY='\033[0;37m'
BLUE='\033[1;34m'
CYAN='\033[1;36m'
GREEN='\033[1;32m'
YELLOW='\033[1;33m'
RED='\033[1;31m'
MAGENTA='\033[1;35m'
RESET='\033[0m'

draw_bar() {
local label=$1; local current=$2; local total=$3; local unit=$4; local width=30
[[ -z "$current" || "$current" == "0" || "$current" == "" ]] && current=0
if (( $(echo "$total <= 0" | bc -l) )); then total=1; fi
local percent=$(awk "BEGIN {printf \"%.1f\", $current*100/$total}")
local fill=$(awk "BEGIN {print int($percent*$width/100)}")
[[ "$fill" -gt "$width" ]] && fill=$width
local empty=$((width - fill))
local color=$GREEN
if (( $(echo "$percent > 70" | bc -l) )); then color=$YELLOW; fi
if (( $(echo "$percent > 90" | bc -l) )); then color=$RED; fi
local bar_fill=$(printf "%${fill}s" | tr ' ' '=')
local bar_empty=$(printf "%${empty}s" | tr ' ' '-')
printf " ${BOLD}%-12s${RESET} [" "$label"
echo -ne "${color}${bar_fill}${GRAY}${bar_empty}${RESET}"
printf "] %5s%% %s/%s%s\n" "$percent" "${current%.*}" "$total" "$unit"
}

# --- 基础数据 ---
UPTIME=$(uptime -p | sed 's/up //')
LAST_LOGIN=$(last -n 2 -R | head -n 2 | tail -n 1 | awk '{printf "%s %s %s (%s)", $4,$5,$6,$1}')
MEM_USED=$(free -m | awk '/Mem:/ {print $3}'); MEM_TOTAL=$(free -m | awk '/Mem:/ {print $2}')
DISK_USED=$(df -m / | awk 'NR==2 {print $3}'); DISK_TOTAL=$(df -m / | awk 'NR==2 {print $2}')
CPU_LOAD=$(cut -d' ' -f1 /proc/loadavg); CPU_CORES=$(nproc)
PROC_COUNT=$(ps ax | wc -l); PROC_LIMIT=500
SERV_RUNNING=$(systemctl list-units --type=service --state=running --no-legend | wc -l)
SERV_TOTAL=$(systemctl list-unit-files --type=service | grep enabled | wc -l)

# --- 流量采集 (针对你提供的 oneline 格式精准校准) ---
NET_TOTAL_M=0
if command -v vnstat > /dev/null; then
LINE=$(vnstat --oneline)
# 根据你的输出:1;eth0;今天;...;本月;...
# 第 11 位是本月 Total 数值,第 12 位是本月 Total 单位
MONTH_VAL=$(echo "$LINE" | cut -d';' -f11 | awk '{print $1}')
MONTH_UNIT=$(echo "$LINE" | cut -d';' -f11 | awk '{print $2}')

# 这里的最近带宽从今日数据抓取 (第 6 列 RX, 第 7 列 TX 的速率)
# 但为了美观,我们直接提取你最关心的数值
RX_SPEED=$(echo "$LINE" | cut -d';' -f4)
TX_SPEED=$(echo "$LINE" | cut -d';' -f5)

# 今日用量 (第 6 列)
TODAY_TOTAL=$(echo "$LINE" | cut -d';' -f6)

# 本月预估 (需从 vnstat -m 抓取,oneline 不带预估)
EST_RAW=$(vnstat -m | grep "estimated" | awk '{print $8,$9}')

# 计算进度条 MiB 数值
if [[ "$MONTH_UNIT" == "GiB" ]]; then
NET_TOTAL_M=$(awk "BEGIN {print $MONTH_VAL * 1024}")
elif [[ "$MONTH_UNIT" == "TiB" ]]; then
NET_TOTAL_M=$(awk "BEGIN {print $MONTH_VAL * 1024 * 1024}")
else
NET_TOTAL_M=${MONTH_VAL%.*}
fi
fi
TRAFFIC_LIMIT_M=$((4 * 1024 * 1024))

# --- 界面绘制 ---
clear
echo -e "${MAGENTA}${BOLD}● RACKNERD VPS DASHBOARD${RESET} ${GRAY}($(date '+%Y-%m-%d %H:%M:%S'))${RESET}"
echo -e "${GRAY}---------------------------------------------------------------------${RESET}"
printf " ${CYAN}%-10s${RESET} %-25s | ${CYAN}%-10s${RESET} %-25s\n" "OS:" "GNU/Linux $(uname -m)" "LAST:" "$LAST_LOGIN"
printf " ${CYAN}%-10s${RESET} %-25s | ${CYAN}%-10s${RESET} %-25s\n" "KERNEL:" "$(uname -r | cut -d- -f1)" "UPTIME:" "$UPTIME"
echo ""

draw_bar "CPU Load" "$CPU_LOAD" "$CPU_CORES" ""
draw_bar "RAM Usage" "$MEM_USED" "$MEM_TOTAL" "M"
draw_bar "Disk Space" "$DISK_USED" "$DISK_TOTAL" "M"
draw_bar "Net Monthly" "$NET_TOTAL_M" "$TRAFFIC_LIMIT_M" "M"
draw_bar "Processes" "$PROC_COUNT" "$PROC_LIMIT" ""
draw_bar "Services" "$SERV_RUNNING" "$SERV_TOTAL" ""
echo ""

echo -e " ${BOLD}网络流量详情:${RESET}"
printf " ${BLUE}今日累计:${RESET} ↑ %-15s ↓ %-15s\n" "$TX_SPEED" "$RX_SPEED"
printf " ${BLUE}今日总计:${RESET} %-17s | ${BLUE}本月预估:${RESET} %-15s\n" "$TODAY_TOTAL" "$EST_RAW"
echo ""

echo -e " ${BOLD}关键服务状态:${RESET}"
check_serv() {
if systemctl is-active --quiet "$1" 2>/dev/null; then
printf " ${GREEN}●${RESET} %-12s" "$1"
else
printf " ${RED}○${RESET} %-12s" "$1"
fi
}
check_serv "ssh"; check_serv "docker"; check_serv "nginx"; check_serv "mysql"
echo -e "\n${GRAY}---------------------------------------------------------------------${RESET}"
echo -e " ${BLUE}快捷操作:${RESET} 输入 ${BOLD}btop${RESET} | ${BOLD}vnstat -l${RESET} (查看实时跳动)"
echo ""

注意:为了在后台持续统计流量信息,需开启 vnstat 后台服务。

systemctl enable --now vnstat

改进

显示东八区时间

sh
#!/bin/bash

# --- 强制指定脚本内时间为东八区 ---
export TZ='Asia/Shanghai'

# --- 配色方案 ---
BOLD='\033[1m'; GRAY='\033[0;37m'; BLUE='\033[1;34m'; CYAN='\033[1;36m'
GREEN='\033[1;32m'; YELLOW='\033[1;33m'; RED='\033[1;31m'; MAGENTA='\033[1;35m'; RESET='\033[0m'

draw_bar() {
local label=$1; local current=$2; local total=$3; local unit=$4; local width=30
[[ -z "$current" || "$current" == "0" || "$current" == "" ]] && current=0
if (( $(echo "$total <= 0" | bc -l) )); then total=1; fi
local percent=$(awk "BEGIN {printf \"%.1f\", $current*100/$total}")
local fill=$(awk "BEGIN {print int($percent*$width/100)}")
[[ "$fill" -gt "$width" ]] && fill=$width
local empty=$((width - fill))
local color=$GREEN
if (( $(echo "$percent > 70" | bc -l) )); then color=$YELLOW; fi
if (( $(echo "$percent > 90" | bc -l) )); then color=$RED; fi
local bar_fill=$(printf "%${fill}s" | tr ' ' '=')
local bar_empty=$(printf "%${empty}s" | tr ' ' '-')
printf " ${BOLD}%-12s${RESET} [" "$label"
echo -ne "${color}${bar_fill}${GRAY}${bar_empty}${RESET}"
printf "] %5s%% %s/%s%s\n" "$percent" "${current%.*}" "$total" "$unit"
}

# --- 基础数据采集 ---
NOW=$(date '+%Y-%m-%d %H:%M:%S')
UPTIME=$(uptime -p | sed 's/up //')
# 登录时间也转换为东八区显示
LAST_LOGIN=$(last -n 2 -R -F | head -n 2 | tail -n 1 | awk '{print $4,$5,$6,$7}')
MEM_USED=$(free -m | awk '/Mem:/ {print $3}'); MEM_TOTAL=$(free -m | awk '/Mem:/ {print $2}')
DISK_USED=$(df -m / | awk 'NR==2 {print $3}'); DISK_TOTAL=$(df -m / | awk 'NR==2 {print $2}')
CPU_LOAD=$(cut -d' ' -f1 /proc/loadavg); CPU_CORES=$(nproc)
PROC_COUNT=$(ps ax | wc -l); PROC_LIMIT=500
SERV_RUNNING=$(systemctl list-units --type=service --state=running --no-legend | wc -l)
SERV_TOTAL=$(systemctl list-unit-files --type=service | grep enabled | wc -l)

# --- 流量采集 ---
NET_TOTAL_M=0
if command -v vnstat > /dev/null; then
LINE=$(vnstat --oneline)
AVG_RATE=$(echo "$LINE" | cut -d';' -f7)
TODAY_RX=$(echo "$LINE" | cut -d';' -f4)
TODAY_TX=$(echo "$LINE" | cut -d';' -f5)
TODAY_TOTAL=$(echo "$LINE" | cut -d';' -f6)

MONTH_VAL=$(echo "$LINE" | cut -d';' -f11 | awk '{print $1}')
MONTH_UNIT=$(echo "$LINE" | cut -d';' -f11 | awk '{print $2}')
EST_RAW=$(vnstat -m | grep "estimated" | awk '{print $8,$9}')

if [[ "$MONTH_UNIT" == "GiB" ]]; then
NET_TOTAL_M=$(awk "BEGIN {print $MONTH_VAL * 1024}")
elif [[ "$MONTH_UNIT" == "TiB" ]]; then
NET_TOTAL_M=$(awk "BEGIN {print $MONTH_VAL * 1024 * 1024}")
else
NET_TOTAL_M=${MONTH_VAL%.*}
fi
fi
TRAFFIC_LIMIT_M=$((4 * 1024 * 1024))

# --- 界面绘制 ---
clear
echo -e "${MAGENTA}${BOLD}● RACKNERD VPS DASHBOARD${RESET} ${GRAY}($NOW 北京时间)${RESET}"
echo -e "${GRAY}---------------------------------------------------------------------${RESET}"
printf " ${CYAN}%-10s${RESET} %-25s | ${CYAN}%-10s${RESET} %-25s\n" "OS:" "GNU/Linux $(uname -m)" "LAST:" "$LAST_LOGIN"
printf " ${CYAN}%-10s${RESET} %-25s | ${CYAN}%-10s${RESET} %-25s\n" "KERNEL:" "$(uname -r | cut -d- -f1)" "UPTIME:" "$UPTIME"
echo ""

draw_bar "CPU Load" "$CPU_LOAD" "$CPU_CORES" ""
draw_bar "RAM Usage" "$MEM_USED" "$MEM_TOTAL" "M"
draw_bar "Disk Space" "$DISK_USED" "$DISK_TOTAL" "M"
draw_bar "Net Monthly" "$NET_TOTAL_M" "$TRAFFIC_LIMIT_M" "M"
draw_bar "Processes" "$PROC_COUNT" "$PROC_LIMIT" ""
draw_bar "Services" "$SERV_RUNNING" "$SERV_TOTAL" ""
echo ""

echo -e " ${BOLD}网络流量详情:${RESET}"
printf " ${YELLOW}今日均速:${RESET} %-15s ${GRAY}(自北京时间00:00起)${RESET}\n" "$AVG_RATE"
printf " ${BLUE}今日累计:${RESET} ↑ %-15s ↓ %-15s\n" "$TODAY_TX" "$TODAY_RX"
printf " ${BLUE}今日总计:${RESET} %-17s | ${BLUE}本月预估:${RESET} %-15s\n" "$TODAY_TOTAL" "$EST_RAW"
echo ""

echo -e " ${BOLD}关键服务状态:${RESET}"
check_serv() {
if systemctl is-active --quiet "$1" 2>/dev/null; then
printf " ${GREEN}●${RESET} %-12s" "$1"
else
printf " ${RED}○${RESET} %-12s" "$1"
fi
}
check_serv "ssh"; check_serv "docker"; check_serv "nginx"; check_serv "mysql"
echo -e "\n${GRAY}---------------------------------------------------------------------${RESET}"
echo -e " ${BLUE}快捷操作:${RESET} 输入 ${BOLD}btop${RESET} | ${BOLD}vnstat -l${RESET}"
echo ""