展示系統(tǒng)信息
#!/bin/bash
# 系統(tǒng)信息查看腳本 (函數(shù)式版本)
# 適用平臺: Linux / macOS (部分命令需根據(jù)系統(tǒng)調整)
# 顏色定義 (可選,使輸出更美觀)
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 分隔線
print_separator() {
echo "=============================="
}
# 打印標題
print_title() {
echo -e "\n${BLUE}[$1]${NC}"
}
# 獲取操作系統(tǒng)類型
get_os() {
echo "$(uname -s)"
}
# 1. 操作系統(tǒng)信息
show_os_info() {
print_title "操作系統(tǒng)"
OS=$(get_os)
echo "系統(tǒng)內(nèi)核: $OS"
if [ -f /etc/os-release ]; then
. /etc/os-release
echo "發(fā)行版: $NAME $VERSION"
elif command -v sw_vers &>/dev/null; then
echo "macOS: $(sw_vers -productVersion)"
fi
}
# 2. 主機信息
show_host_info() {
print_title "主機信息"
echo "主機名: $(hostname)"
echo "內(nèi)核版本: $(uname -r)"
echo "系統(tǒng)架構: $(uname -m)"
}
# 3. 運行時間與負載
show_uptime() {
print_title "運行時間與負載"
uptime_info=$(uptime)
echo "$uptime_info"
}
# 4. CPU 信息
show_cpu_info() {
print_title "CPU 信息"
OS=$(get_os)
if [ "$OS" = "Linux" ]; then
lscpu | grep "Model name" | sed 's/Model name:[[:space:]]*//'
echo "物理核心數(shù): $(nproc --all)"
elif [ "$OS" = "Darwin" ]; then
sysctl -n machdep.cpu.brand_string
echo "總核心數(shù): $(sysctl -n hw.ncpu)"
fi
}
# 5. 內(nèi)存使用情況
show_memory_info() {
print_title "內(nèi)存使用"
OS=$(get_os)
if [ "$OS" = "Linux" ]; then
free -h | awk 'NR==1{print $0} NR==2{print $0}'
elif [ "$OS" = "Darwin" ]; then
vm_stat | perl -ne '/page size of (\d+)/ and $size=$1; /Pages free:\s+(\d+)/ and printf "Free: %.2f GB\n", $1*$size/1073741824; /Pages active:\s+(\d+)/ and printf "Active: %.2f GB\n", $1*$size/1073741824; /Pages inactive:\s+(\d+)/ and printf "Inactive: %.2f GB\n", $1*$size/1073741824; /Pages speculative:\s+(\d+)/ and printf "Speculative: %.2f GB\n", $1*$size/1073741824; /Pages wired down:\s+(\d+)/ and printf "Wired: %.2f GB\n", $1*$size/1073741824;'
echo "總物理內(nèi)存: $(sysctl -n hw.memsize | awk '{printf "%.2f GB\n", $1/1073741824}')"
fi
}
# 6. 磁盤使用情況
show_disk_info() {
print_title "磁盤使用 (根目錄)"
df -h / | awk 'NR==1{print $0} NR==2{print $0}'
}
# 7. 網(wǎng)絡信息
show_network_info() {
print_title "網(wǎng)絡信息"
OS=$(get_os)
if [ "$OS" = "Linux" ]; then
ip -4 addr show | grep -oP '(?<=inet\s)\d+(\.\d+){3}' | grep -v 127.0.0.1
elif [ "$OS" = "Darwin" ]; then
ifconfig | grep "inet " | grep -v 127.0.0.1 | awk '{print $2}'
fi
}
# 8. 當前登錄用戶
show_logged_users() {
print_title "登錄用戶"
who | awk '{print $1}' | sort | uniq | paste -s -d ', '
}
# 9. 最近登錄歷史
show_last_logins() {
print_title "最近5次登錄"
if command -v last &>/dev/null; then
last -n 5 | head -n 5
else
echo "last 命令不可用"
fi
}
# 顯示所有信息
show_all_info() {
print_separator
echo -e "${GREEN} 系統(tǒng)信息報告${NC}"
print_separator
show_os_info
show_host_info
show_uptime
show_cpu_info
show_memory_info
show_disk_info
show_network_info
show_logged_users
show_last_logins
print_separator
}
# 顯示幫助信息
show_help() {
echo "用法: $0 [選項]"
echo "選項:"
echo " -a, --all 顯示所有信息 (默認)"
echo " -o, --os 只顯示操作系統(tǒng)信息"
echo " -h, --host 只顯示主機信息"
echo " -u, --uptime 只顯示運行時間"
echo " -c, --cpu 只顯示CPU信息"
echo " -m, --memory 只顯示內(nèi)存信息"
echo " -d, --disk 只顯示磁盤信息"
echo " -n, --network 只顯示網(wǎng)絡信息"
echo " -l, --login 只顯示登錄用戶"
echo " -L, --last 只顯示最近登錄"
echo " --help 顯示此幫助信息"
}
# 主函數(shù) - 處理命令行參數(shù)
main() {
# 如果沒有參數(shù),顯示所有信息
if [ $# -eq 0 ]; then
show_all_info
return
fi
# 解析命令行參數(shù)
case $1 in
-a|--all)
show_all_info
;;
-o|--os)
show_os_info
;;
-h|--host)
show_host_info
;;
-u|--uptime)
show_uptime
;;
-c|--cpu)
show_cpu_info
;;
-m|--memory)
show_memory_info
;;
-d|--disk)
show_disk_info
;;
-n|--network)
show_network_info
;;
-l|--login)
show_logged_users
;;
-L|--last)
show_last_logins
;;
--help)
show_help
;;
*)
echo "未知選項: $1"
show_help
exit 1
;;
esac
}
# 調用主函數(shù),傳遞所有命令行參數(shù)
main "$@"
第二個版本
#!/bin/bash
# 系統(tǒng)信息查看腳本 (函數(shù)式版本)
# 適用平臺: Linux / macOS
# 顏色定義
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
BOLD='\033[1m'
NC='\033[0m' # No Color
# 全局緩存 OS 類型,避免重復調用 uname
OS=$(uname -s)
# 分隔線
print_separator() {
echo "==============================="
}
# 打印標題
print_title() {
echo -e "\n${BLUE}${BOLD}[$1]${NC}"
}
# 打印鍵值對
print_kv() {
echo -e " ${CYAN}$1:${NC} $2"
}
# 1. 操作系統(tǒng)信息
show_os_info() {
print_title "操作系統(tǒng)"
print_kv "內(nèi)核類型" "$OS"
if [ -f /etc/os-release ]; then
. /etc/os-release
print_kv "發(fā)行版" "$NAME ${VERSION:-}"
elif command -v sw_vers &>/dev/null; then
print_kv "macOS 版本" "$(sw_vers -productVersion) ($(sw_vers -buildVersion))"
fi
print_kv "內(nèi)核版本" "$(uname -r)"
}
# 2. 主機信息
show_host_info() {
print_title "主機信息"
print_kv "主機名" "$(hostname)"
print_kv "系統(tǒng)架構" "$(uname -m)"
if [ "$OS" = "Linux" ]; then
print_kv "虛擬化" "$(systemd-detect-virt 2>/dev/null || echo 'N/A')"
fi
}
# 3. 運行時間與負載
show_uptime() {
print_title "運行時間與負載"
if [ "$OS" = "Linux" ]; then
local seconds
seconds=$(awk '{printf "%d", $1}' /proc/uptime 2>/dev/null)
if [ -n "$seconds" ]; then
local days=$(( seconds / 86400 ))
local hours=$(( (seconds % 86400) / 3600 ))
local mins=$(( (seconds % 3600) / 60 ))
print_kv "已運行" "${days}天 ${hours}小時 ${mins}分鐘"
fi
fi
# 通用:顯示原始 uptime 含負載均值
print_kv "負載均值" "$(uptime | grep -oE 'load average[s]?:.*')"
}
# 4. CPU 信息
show_cpu_info() {
print_title "CPU 信息"
if [ "$OS" = "Linux" ]; then
local model
model=$(grep -m1 "model name" /proc/cpuinfo 2>/dev/null | sed 's/.*: //')
print_kv "型號" "${model:-未知}"
print_kv "物理核心數(shù)" "$(grep -c ^processor /proc/cpuinfo 2>/dev/null)"
local physical
physical=$(grep "physical id" /proc/cpuinfo 2>/dev/null | sort -u | wc -l)
[ "$physical" -gt 0 ] && print_kv "物理CPU數(shù)" "$physical"
print_kv "CPU 使用率" "$(top -bn1 2>/dev/null | grep "Cpu(s)" | awk '{printf "%.1f%%", $2+$4}' || echo 'N/A')"
elif [ "$OS" = "Darwin" ]; then
print_kv "型號" "$(sysctl -n machdep.cpu.brand_string 2>/dev/null)"
print_kv "物理核心數(shù)" "$(sysctl -n hw.physicalcpu 2>/dev/null)"
print_kv "邏輯核心數(shù)" "$(sysctl -n hw.logicalcpu 2>/dev/null)"
fi
}
# 5. 內(nèi)存使用情況
show_memory_info() {
print_title "內(nèi)存使用"
if [ "$OS" = "Linux" ]; then
free -h | awk '
NR==1 { printf " %-12s %8s %8s %8s\n", "", $1, $2, $3 }
NR==2 { printf " %-12s %8s %8s %8s\n", "物理內(nèi)存:", $2, $3, $4 }
NR==3 { printf " %-12s %8s %8s %8s\n", "Swap:", $2, $3, $4 }
'
elif [ "$OS" = "Darwin" ]; then
local page_size total_mem free_pages active_pages inactive_pages wired_pages
page_size=$(sysctl -n hw.pagesize 2>/dev/null || echo 4096)
total_mem=$(sysctl -n hw.memsize 2>/dev/null)
eval "$(vm_stat 2>/dev/null | awk -v ps="$page_size" '
/Pages free/ { free=$3+0 }
/Pages active/ { active=$3+0 }
/Pages inactive/ { inactive=$3+0 }
/Pages wired down/ { wired=$5+0 }
/Pages speculative/ { spec=$3+0 }
END {
used = (active + inactive + wired) * ps
free_b = (free + spec) * ps
printf "used_gb=%.2f free_gb=%.2f\n", used/1073741824, free_b/1073741824
}
')"
print_kv "總物理內(nèi)存" "$(awk "BEGIN{printf \"%.2f GB\", $total_mem/1073741824}")"
print_kv "已使用" "${used_gb:-N/A} GB"
print_kv "空閑(含投機)" "${free_gb:-N/A} GB"
fi
}
# 6. 磁盤使用情況
show_disk_info() {
print_title "磁盤使用"
if [ "$OS" = "Linux" ]; then
df -hT -x tmpfs -x devtmpfs -x squashfs 2>/dev/null | awk '
NR==1 { printf " %s\n", $0 }
NR>1 { printf " %s\n", $0 }
'
elif [ "$OS" = "Darwin" ]; then
df -h | grep -E "^/dev/" | awk '{ printf " %s\n", $0 }'
# 首行標題
df -h | awk 'NR==1 { printf " %s\n", $0 }' | head -1
fi
}
# 7. 網(wǎng)絡信息
show_network_info() {
print_title "網(wǎng)絡信息"
if [ "$OS" = "Linux" ]; then
ip -4 addr show 2>/dev/null | awk '
/^[0-9]+:/ { iface=$2 }
/inet / && !/127\.0\.0\.1/ {
gsub("/.*", "", $2)
printf " %-12s %s\n", iface, $2
}
'
elif [ "$OS" = "Darwin" ]; then
ifconfig 2>/dev/null | awk '
/^[a-z]/ { iface=$1 }
/inet / && !/127\.0\.0\.1/ {
printf " %-12s %s\n", iface, $2
}
'
fi
# 默認網(wǎng)關
if [ "$OS" = "Linux" ]; then
local gw
gw=$(ip route 2>/dev/null | awk '/^default/ {print $3; exit}')
[ -n "$gw" ] && print_kv "默認網(wǎng)關" "$gw"
elif [ "$OS" = "Darwin" ]; then
local gw
gw=$(route -n get default 2>/dev/null | awk '/gateway/ {print $2}')
[ -n "$gw" ] && print_kv "默認網(wǎng)關" "$gw"
fi
}
# 8. 當前登錄用戶
show_logged_users() {
print_title "當前登錄用戶"
local users
users=$(who 2>/dev/null | awk '{print $1}' | sort -u | paste -s -d ', ')
print_kv "用戶" "${users:-(無)}"
}
# 9. 最近登錄歷史
show_last_logins() {
print_title "最近5次登錄"
if command -v last &>/dev/null; then
last -n 5 2>/dev/null | head -n 5
else
echo " last 命令不可用"
fi
}
# 顯示所有信息
show_all_info() {
print_separator
echo -e "${GREEN}${BOLD} 系統(tǒng)信息報告${NC}"
print_separator
show_os_info
show_host_info
show_uptime
show_cpu_info
show_memory_info
show_disk_info
show_network_info
show_logged_users
show_last_logins
print_separator
}
# 顯示幫助信息
show_help() {
echo -e "用法: ${BOLD}$0${NC} [選項]"
echo "選項:"
echo " -a, --all 顯示所有信息 (默認)"
echo " -o, --os 只顯示操作系統(tǒng)信息"
echo " -H, --host 只顯示主機信息"
echo " -u, --uptime 只顯示運行時間"
echo " -c, --cpu 只顯示CPU信息"
echo " -m, --memory 只顯示內(nèi)存信息"
echo " -d, --disk 只顯示磁盤信息"
echo " -n, --network 只顯示網(wǎng)絡信息"
echo " -l, --login 只顯示登錄用戶"
echo " -L, --last 只顯示最近登錄"
echo " -h, --help 顯示此幫助信息"
}
# 主函數(shù)
main() {
if [ $# -eq 0 ]; then
show_all_info
return
fi
case $1 in
-a|--all) show_all_info ;;
-o|--os) show_os_info ;;
-H|--host) show_host_info ;;
-u|--uptime) show_uptime ;;
-c|--cpu) show_cpu_info ;;
-m|--memory) show_memory_info ;;
-d|--disk) show_disk_info ;;
-n|--network) show_network_info ;;
-l|--login) show_logged_users ;;
-L|--last) show_last_logins ;;
-h|--help) show_help ;;
*)
echo -e "${RED}未知選項: $1${NC}"
show_help
exit 1
;;
esac
}
main "$@"