Скрипт выводит сводку по 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 — если команда доступна