返回列表 发布新帖

[用户教程] 一个文件——美化你的ssh会话界面

729 3
发表于 2026-1-13 20:46:32 来自手机 | 查看全部 阅读模式 IP:–江苏–苏州

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
这个文件放到个人文件夹的根目录即可,用该个人文件夹用户新建ssh会话就能看到效果,登录后,记得执行
  1. sudo usermod -aG docker 用户名 && echo '用户名 ALL=(ALL) NOPASSWD: /usr/sbin/smartctl' | sudo tee /etc/sudoers.d/用户名-smartctl && sudo chmod 440 /etc/sudoers.d/用户名-smartctl
复制代码

示例:用户名为friend,执行代码则为
  1. sudo usermod -aG docker friend && echo 'friend ALL=(ALL) NOPASSWD: /usr/sbin/smartctl' | sudo tee /etc/sudoers.d/friend-smartctl && sudo chmod 440 /etc/sudoers.d/friend-smartctl
复制代码

上面命令只需要执行一次 是为了读取磁盘健康度和CPU温度的,不然没权限,不在乎这俩参数可以不执行。
1000063598.jpg
1000063612.jpg

评论3

绿联NAS私有云Lv.9绿联NAS社区管理员 绿联NAS社区会员用户 发表于 2026-1-15 14:20:12 | 查看全部 IP:–海南–海口
该贴的内容需具备较强的动手能力及Linux操作基础;对相关操作不熟悉的,建议留言咨询作者,以防误操作。
绿联NAS产品功能问题回复、产品功能动态更新、产品需求进度更新、产品公测组织相关事项~
梦梦Lv.7绿联NAS社区会员用户 发表于 2026-1-14 07:28:38 来自手机 | 查看全部 IP:–湖北 /全省通用
点赞
潇潇雨歇Lv.4 发表于 2026-1-14 09:16:45 | 查看全部 IP:–广东–佛山–高明区
```
  1. #!/bin/bash
  2. if [ -n "$BASHRC_ALREADY_RUN" ]; then
  3.     return
  4. fi
  5. export BASHRC_ALREADY_RUN=1

  6. uname -snrvm

  7. load1=$(awk '{printf "%.2f", $1}' /proc/loadavg)
  8. load5=$(awk '{printf "%.2f", $2}' /proc/loadavg)
  9. load15=$(awk '{printf "%.2f", $3}' /proc/loadavg)

  10. uptime=$(uptime -p | sed 's/up //')
  11. memory=$(free -m | awk '/Mem/{printf "%d%% of %.1fGB", $3/$2*100, $2/1024}')

  12. local_ip=$(ip addr show eth0 2>/dev/null | grep 'inet ' | awk '{print $2}' | cut -d/ -f1)
  13. if [ -z "$local_ip" ]; then
  14.     local_ip=$(ip addr show eth1 2>/dev/null | grep 'inet ' | awk '{print $2}' | cut -d/ -f1)
  15. fi
  16. if [ -z "$local_ip" ]; then
  17.     local_ip=$(ip addr show bridge0 2>/dev/null | grep 'inet ' | awk '{print $2}' | cut -d/ -f1)
  18. fi
  19. if [ -z "$local_ip" ]; then
  20.     local_ip=$(hostname -I 2>/dev/null | awk '{print $1}' | head -1)
  21. fi

  22. ipv6_address=$(ip addr show 2>/dev/null | grep inet6 | grep -v 'scope link' | grep -v '::1/128' | head -1 | awk '{print $2}' | cut -d/ -f1)
  23. if [ -z "$ipv6_address" ]; then
  24.     ipv6_address="N/A"
  25. fi

  26. # 系统温度检测
  27. temp="N/A"

  28. # 优先读取CPU温度(thermal_zone1)
  29. if [ -f "/sys/class/thermal/thermal_zone1/temp" ]; then
  30.     temp_raw=$(cat "/sys/class/thermal/thermal_zone1/temp" 2>/dev/null | tr -d -c '0-9')
  31.     if [ -n "$temp_raw" ] && [ "$temp_raw" -gt 0 ]; then
  32.         temp=$((temp_raw/1000))
  33.         temp="${temp}°C"
  34.     fi
  35. fi

  36. # 如果没找到或显示为27°C,尝试其他CPU温度传感器
  37. if [ "$temp" = "N/A" ] || [ "$temp" = "27°C" ]; then
  38.     # 尝试hwmon3下的CPU核心温度
  39.     for sensor in /sys/class/hwmon/hwmon3/temp*_input; do
  40.         if [ -f "$sensor" ]; then
  41.             temp_raw=$(cat "$sensor" 2>/dev/null | tr -d -c '0-9')
  42.             if [ -n "$temp_raw" ] && [ "$temp_raw" -gt 0 ]; then
  43.                 temp_value=$((temp_raw/1000))
  44.                 # 如果不是27度,就用这个值
  45.                 if [ $temp_value -ne 27 ] && [ $temp_value -ge 10 ] && [ $temp_value -le 100 ]; then
  46.                     temp="${temp_value}°C"
  47.                     break
  48.                 fi
  49.             fi
  50.         fi
  51.     done
  52. fi

  53. volume_paths=()
  54. for i in {1..4}; do
  55.     if [ -d "/volume$i" ] && mountpoint -q "/volume$i" 2>/dev/null; then
  56.         volume_paths+=("/volume$i")
  57.     fi
  58. done

  59. if [ ${#volume_paths[@]} -eq 0 ]; then
  60.     storage_summary="0% of 0T"
  61. else
  62.     total_size_kb=0
  63.     total_used_kb=0
  64.    
  65.     for path in "${volume_paths[@]}"; do
  66.         df_output=$(df -k "$path" 2>/dev/null | tail -1)
  67.         if [ -n "$df_output" ]; then
  68.             size_kb=$(echo "$df_output" | awk '{print $2}')
  69.             used_kb=$(echo "$df_output" | awk '{print $3}')
  70.             total_size_kb=$((total_size_kb + size_kb))
  71.             total_used_kb=$((total_used_kb + used_kb))
  72.         fi
  73.     done
  74.    
  75.     if [ $total_size_kb -gt 0 ]; then
  76.         usage_percent=$((total_used_kb * 100 / total_size_kb))
  77.         
  78.         total_size_tb=$(echo "scale=2; $total_size_kb / (1024 * 1024 * 1024)" | bc 2>/dev/null)
  79.         if [ -z "$total_size_tb" ] || [ "$total_size_tb" = "0" ]; then
  80.             total_size_tb=$(awk "BEGIN {printf "%.2f", $total_size_kb / (1024 * 1024 * 1024)}" 2>/dev/null || echo "0")
  81.         fi
  82.         storage_summary="${usage_percent}% of ${total_size_tb}T"
  83.     else
  84.         storage_summary="0% of 0T"
  85.     fi
  86. fi

  87. cpu_model=$(grep -m1 'model name' /proc/cpuinfo | cut -d: -f2 | sed 's/^[ \t]*//' | head -c 30)
  88. cpu_cores=$(grep -c 'processor' /proc/cpuinfo)
  89. # CPU使用率 - 使用/proc/stat计算
  90. cpu_usage="0.0"

  91. # 从/proc/stat读取CPU时间信息
  92. if cpu_line=$(grep '^cpu ' /proc/stat 2>/dev/null); then
  93.     # 移除开头的"cpu ",获取所有时间值
  94.     cpu_times=$(echo "$cpu_line" | cut -d' ' -f2-)
  95.    
  96.     # 计算总时间和空闲时间
  97.     total=0
  98.     idle=0
  99.     count=1
  100.    
  101.     for time_val in $cpu_times; do
  102.         total=$((total + time_val))
  103.         # 第4个和第5个值是idle和iowait(0-based索引,所以是第4和第5个)
  104.         if [ $count -eq 4 ] || [ $count -eq 5 ]; then
  105.             idle=$((idle + time_val))
  106.         fi
  107.         count=$((count + 1))
  108.     done
  109.    
  110.     # 计算使用率百分比
  111.     if [ $total -gt 0 ]; then
  112.         # 使用bc进行浮点计算
  113.         usage=$(echo "scale=1; ($total - $idle) * 100 / $total" | bc 2>/dev/null)
  114.         
  115.         # 如果bc不可用,使用awk
  116.         if [ -z "$usage" ]; then
  117.             usage=$(awk -v total=$total -v idle=$idle 'BEGIN{printf "%.1f", (total-idle)*100/total}')
  118.         fi
  119.         
  120.         cpu_usage="$usage"
  121.     fi
  122. fi

  123. network_iface=$(ip route | grep default | awk '{print $5}' | head -1)
  124. network_speed="N/A"
  125. if [ -n "$network_iface" ] && [ -f "/sys/class/net/$network_iface/speed" ]; then
  126.     speed=$(cat "/sys/class/net/$network_iface/speed" 2>/dev/null)
  127.     [ -n "$speed" ] && [ "$speed" -gt 0 ] && network_speed="${speed}Mbps"
  128. fi

  129. disk_health="N/A"
  130. first_disk=$(lsblk -d -o NAME | grep -E '^sd|^nvme' | head -1)

  131. if [ -n "$first_disk" ]; then
  132.     smartctl_output=$(sudo -n smartctl -H "/dev/$first_disk" 2>&1)
  133.    
  134.     if echo "$smartctl_output" | grep -qi "test result.*passed\|PASSED"; then
  135.         disk_health="PASSED"
  136.     elif echo "$smartctl_output" | grep -qi "test result.*failed\|FAILED"; then
  137.         disk_health="FAILED"
  138.     elif echo "$smartctl_output" | grep -qi "SMART support is: Available"; then
  139.         disk_health="AVAILABLE"
  140.     elif echo "$smartctl_output" | grep -qi "command not found\|Permission denied"; then
  141.         disk_health="ERROR"
  142.     else
  143.         disk_health="UNKNOWN"
  144.     fi
  145. fi

  146. service_status=""
  147. if systemctl is-active --quiet smbd 2>/dev/null; then
  148.     service_status="${service_status}smb:✓ "
  149. else
  150.     service_status="${service_status}smb:✗ "
  151. fi
  152. if systemctl is-active --quiet nmbd 2>/dev/null; then
  153.     service_status="${service_status}nmb:✓ "
  154. else
  155.     service_status="${service_status}nmb:✗ "
  156. fi
  157. if systemctl is-active --quiet ssh 2>/dev/null; then
  158.     service_status="${service_status}ssh:✓ "
  159. else
  160.     service_status="${service_status}ssh:✗ "
  161. fi
  162. if systemctl is-active --quiet docker 2>/dev/null; then
  163.     service_status="${service_status}dkr:✓ "
  164. else
  165.     service_status="${service_status}dkr:✗ "
  166. fi

  167. logged_users=$(who | wc -l)
  168. last_login=$(last -n 1 | head -1 | awk '{print $1" from "$3}')

  169. docker_containers="N/A"
  170. if command -v docker &> /dev/null; then
  171.     if docker info >/dev/null 2>&1; then
  172.         running_containers=$(docker ps -q 2>/dev/null | wc -l)
  173.         total_containers=$(docker ps -aq 2>/dev/null | wc -l)
  174.         docker_containers="${running_containers}/${total_containers}"
  175.     else
  176.         docker_containers="无权限"
  177.     fi
  178. else
  179.     docker_containers="未安装"
  180. fi

  181. total_processes=$(ps -ef | wc -l)
  182. top_process=$(ps -eo pid,comm,%cpu --sort=-%cpu | head -2 | tail -1 | awk '{print $2"("$3"%)"}')

  183. swap_info=$(free -m | awk '/Swap/{printf "%d/%dMB (%.0f%%)", $3, $2, ($3/$2)*100}')

  184. last_update="N/A"
  185. if [ -f "/var/lib/apt/periodic/update-success-stamp" ]; then
  186.     last_update=$(stat -c %y /var/lib/apt/periodic/update-success-stamp 2>/dev/null | cut -d' ' -f1)
  187. elif [ -f "/var/lib/dpkg/status" ]; then
  188.     last_update=$(stat -c %y /var/lib/dpkg/status 2>/dev/null | cut -d' ' -f1)
  189. fi

  190. raid_status="N/A"
  191. if [ -f "/proc/mdstat" ]; then
  192.     active_raids=$(grep -c "^md" /proc/mdstat)
  193.     if [ "$active_raids" -gt 0 ]; then
  194.         raid_list=$(grep "^md" /proc/mdstat | awk '{print $1}')
  195.         raid_details=""
  196.         for raid in $raid_list; do
  197.             raid_line=$(grep -A1 "^$raid" /proc/mdstat | tail -1)
  198.             raid_type=$(echo "$raid_line" | awk '{print $4}')
  199.             raid_state=$(echo "$raid_line" | grep -o '\[[^]]*\]' | head -1)
  200.             if [ -n "$raid_type" ] && [ -n "$raid_state" ]; then
  201.                 [ -n "$raid_details" ] && raid_details="${raid_details}, "
  202.                 raid_details="${raid_details}${raid_type}${raid_state}"
  203.             fi
  204.         done
  205.         
  206.         if [ -n "$raid_details" ]; then
  207.             raid_status="${active_raids} RAID: ${raid_details}"
  208.         else
  209.             raid_status="${active_raids} RAID设备"
  210.         fi
  211.     else
  212.         raid_status="无RAID"
  213.     fi
  214. fi

  215. log_errors="N/A"
  216. if command -v journalctl &> /dev/null; then
  217.     log_errors=$(journalctl --since="1 hour ago" 2>/dev/null | grep -c -i "error\|fail")
  218. fi

  219. echo -e "\e[32m       _   _  _____  _____  ______  ______  _   _\e[0m"
  220. echo -e "\e[32m      | | | ||  __ \|  __ \|  ____||  ____|| \ | |\e[0m"
  221. echo -e "\e[32m      | | | || |  | | |__) | |__   | |__   |  \| |\e[0m"
  222. echo -e "\e[32m      | | | || | -- |  _  /|  __|  |  __|  | . \` |\e[0m"
  223. echo -e "\e[32m      | |_| || |__| | | \ \| |____ | |____ | |\  |\e[0m"
  224. echo -e "\e[32m       \___/ |_____/|_|  \_\______|\______||_| \_|\e[0m"
  225. echo -e "\e[34m      --------------------------------------------\e[0m"
  226. echo -e "\e[35m          UGREEN DXP4800 POWER BY UGOS PRO\e[0m"
  227. echo -e "\e[34m      --------------------------------------------\e[0m"

  228. echo -e "     \e[36m▶ 系统核心\e[0m"
  229. echo -e "       运行时间: \e[32m${uptime}\e[0m"
  230. echo -e "       CPU型号:  \e[32m${cpu_model}\e[0m"
  231. echo -e "       CPU负载:  \e[32m${load1} (1min) ${load5} (5min) ${load15} (15min)\e[0m"
  232. echo -e "       CPU使用率:\e[32m${cpu_usage}%\e[0m   核心数: \e[32m${cpu_cores}\e[0m"

  233. echo -e "     \e[36m▶ 内存与进程\e[0m"
  234. echo -e "       内存已用:  \e[32m${memory}\e[0m"
  235. echo -e "       交换空间:  \e[32m${swap_info}\e[0m"
  236. echo -e "       进程总数:  \e[32m${total_processes}\e[0m   高负载进程: \e[31m${top_process}\e[0m"

  237. echo -e "     \e[36m▶ 存储信息\e[0m"
  238. echo -e "       空间存储:  \e[32m${storage_summary}\e[0m"
  239. echo -e "       磁盘健康:  \e[32m${disk_health}\e[0m"
  240. echo -e "       RAID状态:  \e[32m${raid_status}\e[0m"

  241. echo -e "     \e[36m▶ 网络信息\e[0m"
  242. echo -e "       局域网IP:  \e[32m${local_ip}\e[0m"
  243. echo -e "       网络接口:  \e[32m${network_iface}\e[0m   速率: \e[32m${network_speed}\e[0m"
  244. echo -e "       公网IPv6:  \e[32m${ipv6_address}\e[0m"

  245. echo -e "     \e[36m▶ 服务状态\e[0m"
  246. echo -e "       服务状态:  \e[32m${service_status}\e[0m"
  247. echo -e "       Docker容器:\e[32m${docker_containers} (运行/总数)\e[0m"
  248. echo -e "       登录用户:  \e[32m${logged_users}\e[0m   最近登录: \e[32m${last_login}\e[0m"

  249. echo -e "     \e[36m▶ 系统监控\e[0m"
  250. echo -e "       系统温度:  \e[32m${temp}\e[0m"
  251. echo -e "       最近更新:  \e[32m${last_update}\e[0m"
  252. echo -e "       最近错误:  \e[31m${log_errors} (1小时内)\e[0m"

  253. echo -e "\e[34m      --------------------------------------------\e[0m"
复制代码

```

评论

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2026 绿联NAS私有云社区 版权所有 All Rights Reserved. 粤公网安备44030002002555号| 粤ICP备12028978号
关灯 在本版发帖
联系技术支持
返回顶部
快速回复 返回顶部 返回列表