烧饼论坛 LZ.SB
登录

分享一个查看 vps 信息的 bash 脚本

681
  • ss
    UID 297Lv.3 初识社区 编辑于
    #!/bin/bash
    
    _red() {
        printf '\033[0;31;31m%b\033[0m' "$1"
    }
    
    _green() {
        printf '\033[0;31;32m%b\033[0m' "$1"
    }
    
    _yellow() {
        printf '\033[0;31;33m%b\033[0m' "$1"
    }
    
    _blue() {
        printf '\033[0;31;36m%b\033[0m' "$1"
    }
    
    _exists() {
        local cmd="$1"
        if eval type type >/dev/null 2>&1; then
            eval type "$cmd" >/dev/null 2>&1
        elif command >/dev/null 2>&1; then
            command -v "$cmd" >/dev/null 2>&1
        else
            which "$cmd" >/dev/null 2>&1
        fi
        local rt=$?
        return ${rt}
    }
    
    get_opsy() {
        [ -f /etc/redhat-release ] && awk '{print $0}' /etc/redhat-release && return
        [ -f /etc/os-release ] && awk -F'[= "]' '/PRETTY_NAME/{print $3,$4,$5}' /etc/os-release && return
        [ -f /etc/lsb-release ] && awk -F'[="]+' '/DESCRIPTION/{print $2}' /etc/lsb-release && return
    }
    
    next() {
        printf "%-70s\n" "-" | sed 's/\s/-/g'
    }
    
    calc_size() {
        local raw=$1
        local total_size=0
        local num=1
        local unit="KB"
        if ! [[ ${raw} =~ ^[0-9]+$ ]]; then
            echo ""
            return
        fi
        if [ "${raw}" -ge 1073741824 ]; then
            num=1073741824
            unit="TB"
        elif [ "${raw}" -ge 1048576 ]; then
            num=1048576
            unit="GB"
        elif [ "${raw}" -ge 1024 ]; then
            num=1024
            unit="MB"
        elif [ "${raw}" -eq 0 ]; then
            echo "${total_size}"
            return
        fi
        total_size=$(awk 'BEGIN{printf "%.1f", '"$raw"' / '$num'}')
        echo "${total_size} ${unit}"
    }
    
    # since calc_size converts kilobyte to MB, GB and TB
    # to_kibyte converts zfs size from bytes to kilobyte
    to_kibyte() {
        local raw=$1
        awk 'BEGIN{printf "%.0f", '"$raw"' / 1024}'
    }
    
    calc_sum() {
        local arr=("$@")
        local s
        s=0
        for i in "${arr[@]}"; do
            s=$((s + i))
        done
        echo ${s}
    }
    
    check_virt() {
        _exists "dmesg" && virtualx="$(dmesg 2>/dev/null)"
        if _exists "dmidecode"; then
            sys_manu="$(dmidecode -s system-manufacturer 2>/dev/null)"
            sys_product="$(dmidecode -s system-product-name 2>/dev/null)"
            sys_ver="$(dmidecode -s system-version 2>/dev/null)"
        else
            sys_manu=""
            sys_product=""
            sys_ver=""
        fi
        if grep -qa docker /proc/1/cgroup; then
            virt="Docker"
        elif grep -qa lxc /proc/1/cgroup; then
            virt="LXC"
        elif grep -qa container=lxc /proc/1/environ; then
            virt="LXC"
        elif [[ -f /proc/user_beancounters ]]; then
            virt="OpenVZ"
        elif [[ "${virtualx}" == *kvm-clock* ]]; then
            virt="KVM"
        elif [[ "${sys_product}" == *KVM* ]]; then
            virt="KVM"
        elif [[ "${cname}" == *KVM* ]]; then
            virt="KVM"
        elif [[ "${cname}" == *QEMU* ]]; then
            virt="KVM"
        elif [[ "${virtualx}" == *"VMware Virtual Platform"* ]]; then
            virt="VMware"
        elif [[ "${sys_product}" == *"VMware Virtual Platform"* ]]; then
            virt="VMware"
        elif [[ "${virtualx}" == *"Parallels Software International"* ]]; then
            virt="Parallels"
        elif [[ "${virtualx}" == *VirtualBox* ]]; then
            virt="VirtualBox"
        elif [[ -e /proc/xen ]]; then
            if grep -q "control_d" "/proc/xen/capabilities" 2>/dev/null; then
                virt="Xen-Dom0"
            else
                virt="Xen-DomU"
            fi
        elif [ -f "/sys/hypervisor/type" ] && grep -q "xen" "/sys/hypervisor/type"; then
            virt="Xen"
        elif [[ "${sys_manu}" == *"Microsoft Corporation"* ]]; then
            if [[ "${sys_product}" == *"Virtual Machine"* ]]; then
                if [[ "${sys_ver}" == *"7.0"* || "${sys_ver}" == *"Hyper-V" ]]; then
                    virt="Hyper-V"
                else
                    virt="Microsoft Virtual Machine"
                fi
            fi
        else
            virt="Dedicated"
        fi
    }
    
    ipv4_info() {
        local org city country region
        org="$(curl -s -f --connect-timeout 10 ipinfo.io/org 2>/dev/null || echo "")"
        city="$(curl -s -f --connect-timeout 10 ipinfo.io/city 2>/dev/null || echo "")"
        country="$(curl -s -f --connect-timeout 10 ipinfo.io/country 2>/dev/null || echo "")"
        region="$(curl -s -f --connect-timeout 10 ipinfo.io/region 2>/dev/null || echo "")"
        if [[ -n "${org}" ]]; then
            echo " Organization       : $(_blue "${org}")"
        fi
        if [[ -n "${city}" && -n "${country}" ]]; then
            echo " Location           : $(_blue "${city} / ${country}")"
        fi
        if [[ -n "${region}" ]]; then
            echo " Region             : $(_yellow "${region}")"
        fi
        if [[ -z "${org}" ]]; then
            echo " Region             : $(_red "No ISP detected")"
        fi
    }
    
    # Get System information
    get_system_info() {
        cname=$(awk -F: '/model name/ {name=$2} END {print name}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//')
        cores=$(awk -F: '/^processor/ {core++} END {print core}' /proc/cpuinfo)
        freq=$(awk -F'[ :]' '/cpu MHz/ {print $4;exit}' /proc/cpuinfo)
        ccache=$(awk -F: '/cache size/ {cache=$2} END {print cache}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//')
        cpu_aes=$(grep -i 'aes' /proc/cpuinfo)
        cpu_virt=$(grep -Ei 'vmx|svm' /proc/cpuinfo)
        tram=$(
            LANG=C
            free | awk '/Mem/ {print $2}'
        )
        tram=$(calc_size "$tram")
        uram=$(
            LANG=C
            free | awk '/Mem/ {print $3}'
        )
        uram=$(calc_size "$uram")
        swap=$(
            LANG=C
            free | awk '/Swap/ {print $2}'
        )
        swap=$(calc_size "$swap")
        uswap=$(
            LANG=C
            free | awk '/Swap/ {print $3}'
        )
        uswap=$(calc_size "$uswap")
        up=$(awk '{a=$1/86400;b=($1%86400)/3600;c=($1%3600)/60} {printf("%d days, %d hour %d min\n",a,b,c)}' /proc/uptime)
        if _exists "w"; then
            load=$(
                LANG=C
                w | head -1 | awk -F'load average:' '{print $2}' | sed 's/^[ \t]*//;s/[ \t]*$//'
            )
        elif _exists "uptime"; then
            load=$(
                LANG=C
                uptime | head -1 | awk -F'load average:' '{print $2}' | sed 's/^[ \t]*//;s/[ \t]*$//'
            )
        fi
        opsy=$(get_opsy)
        arch=$(uname -m)
        if _exists "getconf"; then
            lbit=$(getconf LONG_BIT)
        else
            echo "${arch}" | grep -q "64" && lbit="64" || lbit="32"
        fi
        kern=$(uname -r)
        in_kernel_no_swap_total_size=$(
            LANG=C
            df -t simfs -t ext2 -t ext3 -t ext4 -t btrfs -t xfs -t vfat -t ntfs --total 2>/dev/null | grep total | awk '{ print $2 }'
        )
        swap_total_size=$(free -k | grep Swap | awk '{print $2}')
        zfs_total_size=$(to_kibyte "$(calc_sum "$(zpool list -o size -Hp 2> /dev/null)")")
        disk_total_size=$(calc_size $((swap_total_size + in_kernel_no_swap_total_size + zfs_total_size)))
        in_kernel_no_swap_used_size=$(
            LANG=C
            df -t simfs -t ext2 -t ext3 -t ext4 -t btrfs -t xfs -t vfat -t ntfs --total 2>/dev/null | grep total | awk '{ print $3 }'
        )
        swap_used_size=$(free -k | grep Swap | awk '{print $3}')
        zfs_used_size=$(to_kibyte "$(calc_sum "$(zpool list -o allocated -Hp 2> /dev/null)")")
        disk_used_size=$(calc_size $((swap_used_size + in_kernel_no_swap_used_size + zfs_used_size)))
        tcpctrl=$(sysctl net.ipv4.tcp_congestion_control | awk -F ' ' '{print $3}')
    }
    # Print System information
    print_system_info() {
        if [ -n "$cname" ]; then
            echo " CPU Model          : $(_blue "$cname")"
        else
            echo " CPU Model          : $(_blue "CPU model not detected")"
        fi
        if [ -n "$freq" ]; then
            echo " CPU Cores          : $(_blue "$cores @ $freq MHz")"
        else
            echo " CPU Cores          : $(_blue "$cores")"
        fi
        if [ -n "$ccache" ]; then
            echo " CPU Cache          : $(_blue "$ccache")"
        fi
        if [ -n "$cpu_aes" ]; then
            echo " AES-NI             : $(_green "\xe2\x9c\x93 Enabled")"
        else
            echo " AES-NI             : $(_red "\xe2\x9c\x97 Disabled")"
        fi
        if [ -n "$cpu_virt" ]; then
            echo " VM-x/AMD-V         : $(_green "\xe2\x9c\x93 Enabled")"
        else
            echo " VM-x/AMD-V         : $(_red "\xe2\x9c\x97 Disabled")"
        fi
        echo " Total Disk         : $(_yellow "$disk_total_size") $(_blue "($disk_used_size Used)")"
        echo " Total Mem          : $(_yellow "$tram") $(_blue "($uram Used)")"
        if [ "$swap" != "0" ]; then
            echo " Total Swap         : $(_blue "$swap ($uswap Used)")"
        fi
        echo " System uptime      : $(_blue "$up")"
        echo " Load average       : $(_blue "$load")"
        echo " OS                 : $(_blue "$opsy")"
        echo " Arch               : $(_blue "$arch ($lbit Bit)")"
        echo " Kernel             : $(_blue "$kern")"
        echo " TCP CC             : $(_yellow "$tcpctrl")"
        echo " Virtualization     : $(_blue "$virt")"
        echo " IPv4/IPv6          : $online"
    }
    
    
    print_end_time() {
        end_time=$(date +%s)
        time=$((end_time - start_time))
        if [ ${time} -gt 60 ]; then
            min=$((time / 60))
            sec=$((time % 60))
            echo " Finished in        : ${min} min ${sec} sec"
        else
            echo " Finished in        : ${time} sec"
        fi
        date_time=$(date '+%Y-%m-%d %H:%M:%S %Z')
        echo " Timestamp          : $date_time"
    }
    
    ! _exists "wget" && _red "Error: wget command not found.\n" && exit 1
    ! _exists "free" && _red "Error: free command not found.\n" && exit 1
    # check for curl/wget
    _exists "curl" && local_curl=true
    # test if the host has IPv4/IPv6 connectivity
    [[ -n ${local_curl} ]] && ip_check_cmd="curl -s -m 4" || ip_check_cmd="wget -qO- -T 4"
    ipv4_check=$( (ping -4 -c 1 -W 4 ipv4.google.com >/dev/null 2>&1 && echo true) || ${ip_check_cmd} -4 icanhazip.com 2> /dev/null)
    ipv6_check=$( (ping -6 -c 1 -W 4 ipv6.google.com >/dev/null 2>&1 && echo true) || ${ip_check_cmd} -6 icanhazip.com 2> /dev/null)
    if [[ -z "$ipv4_check" && -z "$ipv6_check" ]]; then
        _yellow "Warning: Both IPv4 and IPv6 connectivity were not detected.\n"
    fi
    [[ -z "$ipv4_check" ]] && online="$(_red "\xe2\x9c\x97 Offline")" || online="$(_green "\xe2\x9c\x93 Online")"
    [[ -z "$ipv6_check" ]] && online+=" / $(_red "\xe2\x9c\x97 Offline")" || online+=" / $(_green "\xe2\x9c\x93 Online")"
    start_time=$(date +%s)
    get_system_info
    check_virt
    next
    print_system_info
    ipv4_info
    next
    
    # 获取脚本的绝对路径
    SCRIPT_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}")"
    
    # 检查脚本路径是否已添加到.bash_profile
    if ! grep -qF "$SCRIPT_PATH" ~/.bash_profile; then
      echo "$SCRIPT_PATH" >> ~/.bash_profile
    fi
    
    # 为脚本自身设置执行权限
    chmod +x "$SCRIPT_PATH"
    

    保存为. sh 文件,允许即可,脚本默认会提权,如果权限不足 chmod +x info.sh 给脚本增加权限。
    另外脚本会添加到 .bash_profile,如果不需要去掉最后的代码。
    每次登录 ssh 就会看到信息了。
    如下图:
    PixPin_2026-08-23_16-18-23.webp

1 条回复

  • Router
    UID 2379Lv.1 初来乍到
    #1

    直接用 YABS 也挺方便的

    curl -sL yabs.sh | bash -s -- -i -d -g
    

发表回复