Linux Proxmox статус в MOTD
Скрипт выводит сводку по Proxmox VE при каждом входе по SSH: состояние хоста, список ВМ и LXC-контейнеров с IP-адресами и хранилища. Команда px для ручного вызова.
Требования
- Proxmox VE с командами
pvesh,qm,pct,pvesm - Bash
Установка
cat > /etc/profile.d/proxmox-motd.sh << 'SCRIPT'
#!/bin/bash
# Proxmox status MOTD
[[ $- != *i* ]] && return
command -v pvesh &>/dev/null || return
C_RESET='\\033[0m'; C_BOLD='\\033[1m'; C_DIM='\\033[2m'
C_GREEN='\\033[32m'; C_RED='\\033[31m'; C_YELLOW='\\033[33m'
C_CYAN='\\033[36m'; C_BLUE='\\033[34m'; C_WHITE='\\033[97m'
C_LINE='\\033[38;5;240m'
_hr() { printf "${C_LINE} %-60s${C_RESET}
" "------------------------------------------------------------"; }
_proxmox_motd() {
local hostname uptime_str mem_total mem_used mem_pct disk_used disk_total disk_pct
hostname=$(hostname -f 2>/dev/null || hostname)
uptime_str=$(uptime -p 2>/dev/null | sed 's/up //')
read -r mem_total mem_used <<< "$(free -m | awk '/^Mem:/ {print $2, $3}')"
mem_pct=$(( mem_used * 100 / mem_total ))
read -r disk_used disk_total disk_pct <<< "$(df -h / | awk 'NR==2 {print $3, $2, $5}')"
echo ""
printf " ${C_BOLD}${C_CYAN}>> %s${C_RESET} ${C_DIM}| Proxmox VE | up %s${C_RESET}
" "$hostname" "$uptime_str"
printf " ${C_DIM} RAM: ${C_WHITE}%s${C_DIM}/%sM (%s%%) | Disk: ${C_WHITE}%s${C_DIM}/%s (%s)${C_RESET}
" \\
"$mem_used" "$mem_total" "$mem_pct" "$disk_used" "$disk_total" "$disk_pct"
_hr
printf "
${C_BOLD}${C_BLUE}>> VM (QEMU)${C_RESET}
"
printf " ${C_DIM} %-6s %-18s %-10s %-18s %s${C_RESET}
" "ID" "NAME" "STATUS" "IP" "RAM"
_hr
qm list 2>/dev/null | tail -n +2 | while read -r id name status mem _; do
local color="$C_GREEN"
[ "$status" != "running" ] && color="$C_RED"
local ip
ip=$(pvesh get /nodes/$(hostname)/qemu/$id/agent/network-get-interfaces 2>/dev/null \\
| awk '/ip-address/ && $2 ~ /\\./ {print $2; exit}')
[ -z "$ip" ] && ip="-"
printf " ${color}%-6s${C_RESET} ${C_WHITE}%-18s${C_RESET} ${color}%-10s${C_RESET} ${C_DIM}%-18s %s MB${C_RESET}
" \\
"$id" "$name" "$status" "$ip" "$mem"
done
printf "
${C_BOLD}${C_BLUE}>> LXC${C_RESET}
"
printf " ${C_DIM} %-6s %-18s %-10s %s${C_RESET}
" "ID" "NAME" "STATUS" "IP"
_hr
pct list 2>/dev/null | tail -n +2 | while read -r id status name _; do
local color="$C_GREEN"
[ "$status" != "running" ] && color="$C_RED"
local ip
ip=$(pct exec "$id" -- ip -4 -o addr show scope global 2>/dev/null | awk '{print $4}' | head -n1)
[ -z "$ip" ] && ip="-"
printf " ${color}%-6s${C_RESET} ${C_WHITE}%-18s${C_RESET} ${color}%-10s${C_RESET} ${C_DIM}%s${C_RESET}
" \\
"$id" "$name" "$status" "$ip"
done
printf "
${C_BOLD}${C_BLUE}>> STORAGE${C_RESET}
"
pvesm status 2>/dev/null | awk 'NR>1 {printf " * %-12s %-8s %s/%s
", $1, $2, $4, $3}' || true
echo ""
_hr
printf " ${C_DIM}Команда: ${C_WHITE}px${C_RESET}
"
}
px() { _proxmox_motd; }
[ -n "$SSH_CONNECTION" ] || [ -n "$SSH_TTY" ] && _proxmox_motd
SCRIPT
chmod +x /etc/profile.d/proxmox-motd.sh
Ручное обновление
px
Удаление
rm -f /etc/profile.d/proxmox-motd.sh
Примечания
- Скрипт работает только на Proxmox VE
- IP-адреса ВМ берутся через QEMU Guest Agent — он должен быть установлен в ВМ
- Для кластера используется
pvecm status— если команда доступна