怎样用脚本获取硬盘信息?

wen 实用脚本 2

本文目录导读:

怎样用脚本获取硬盘信息?

  1. Bash 脚本(最常用)
  2. Python 脚本(跨平台兼容)
  3. 综合监控脚本
  4. 生成HTML报告的脚本
  5. 直接读取系统文件(无需外部命令)
  6. 使用建议

在Linux/Unix系统中,可以用多种脚本(Bash、Python等)获取硬盘信息,以下是几种常见且实用的方法:

Bash 脚本(最常用)

使用 df 命令获取分区使用情况

#!/bin/bash
# 获取所有挂载点的磁盘使用情况
echo "=== 磁盘分区使用情况 ==="
df -h
# 只显示物理硬盘(排除tmpfs等虚拟文件系统)
echo ""
echo "=== 物理硬盘分区 ==="
df -h --type=ext4 --type=xfs --type=ntfs --type=vfat 2>/dev/null

使用 lsblk 获取块设备信息

#!/bin/bash
echo "=== 块设备列表 ==="
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,FSTYPE,MODEL
echo ""
echo "=== 详细设备信息 ==="
lsblk -d -o NAME,SIZE,TYPE,TRAN,ROTA,MODEL

使用 fdiskparted 获取分区表

#!/bin/bash
echo "=== 分区表信息 ==="
sudo fdisk -l 2>/dev/null | grep -E "^Disk /dev/[sv]d|^/dev/[sv]d"
# 或者使用parted
echo ""
echo "=== 分区类型与大小 ==="
sudo parted -l 2>/dev/null | grep -E "Disk /dev|Partition Table"

获取磁盘SMART健康状态

#!/bin/bash
# 需要安装 smartmontools
echo "=== 磁盘健康状态 ==="
for disk in /dev/sd[a-z] /dev/nvme[0-9]n[0-9]; do
    if [ -b "$disk" ]; then
        echo "--- $disk ---"
        sudo smartctl -H "$disk" 2>/dev/null | grep -E "SMART overall-health|SMART Health Status"
    fi
done

Python 脚本(跨平台兼容)

#!/usr/bin/env python3
import os
import subprocess
import json
def get_disk_info_linux():
    """获取Linux系统硬盘信息"""
    info = {}
    # 使用 df 命令
    result = subprocess.run(['df', '-h', '--output=source,fstype,size,used,avail,pcent,target'], 
                          capture_output=True, text=True)
    info['df_output'] = result.stdout.splitlines()
    # 使用 lsblk 命令(需要root权限获取更多信息)
    try:
        result = subprocess.run(['lsblk', '-J', '-o', 'NAME,SIZE,TYPE,MOUNTPOINT,FSTYPE'],
                              capture_output=True, text=True)
        info['lsblk_json'] = json.loads(result.stdout)
    except:
        info['lsblk_json'] = "lsblk not available"
    return info
def get_disk_info_windows():
    """获取Windows系统硬盘信息"""
    import wmi
    c = wmi.WMI()
    info = {}
    drives = []
    for disk in c.Win32_DiskDrive():
        drive_info = {
            'model': disk.Model,
            'size': int(disk.Size) // (1024**3),  # GB
            'interface': disk.InterfaceType,
            'serial': disk.SerialNumber,
        }
        drives.append(drive_info)
    info['drives'] = drives
    # 获取分区信息
    partitions = []
    for partition in c.Win32_DiskPartition():
        partitions.append({
            'name': partition.Name,
            'size': int(partition.Size) // (1024**3),
            'type': partition.Type,
        })
    info['partitions'] = partitions
    return info
if __name__ == "__main__":
    if os.name == 'nt':  # Windows
        info = get_disk_info_windows()
        print(json.dumps(info, indent=2))
    else:  # Linux/Unix
        info = get_disk_info_linux()
        print("df 命令输出:")
        for line in info['df_output']:
            print(line)

综合监控脚本

磁盘IO监控

#!/bin/bash
# 监控磁盘IO(需要安装sysstat)
echo "=== 磁盘IO统计 ==="
iostat -x 1 3 2>/dev/null | tail -n +4 | head -n 5
# 使用iotop(需要root)
echo ""
echo "=== 实时磁盘IO(按w切换排序)==="
sudo iotop -d 1 -n 5 -o 2>/dev/null | head -20

磁盘温度检测(需要安装hddtemp或nvme-cli)

#!/bin/bash
echo "=== 磁盘温度 ==="
for disk in /dev/sd[a-z] /dev/nvme[0-9]n[0-9]; do
    if [ -b "$disk" ]; then
        temp=$(sudo hddtemp "$disk" 2>/dev/null | awk '{print $NF}')
        [ -n "$temp" ] && echo "$disk: $temp"
    fi
done
# NVMe固态温度
echo ""
echo "=== NVMe设备温度 ==="
sudo nvme list 2>/dev/null | grep -E "Temperature|温度"

生成HTML报告的脚本

#!/bin/bash
# 生成磁盘健康报告
output="/tmp/disk_report_$(date +%Y%m%d).html"
cat > "$output" <<HTMLHEADER
<html>
<head><title>硬盘信息报告 - $(date)</title></head>
<body>
<h1>硬盘信息报告</h1>
<h2>1. 分区使用情况</h2>
<pre>
HTMLHEADER
# 添加df输出
df -h >> "$output"
echo "</pre><h2>2. 物理设备列表</h2><pre>" >> "$output"
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,FSTYPE,MODEL >> "$output"
echo "</pre><h2>3. SMART健康状态</h2><pre>" >> "$output"
for disk in /dev/sd[a-z] /dev/nvme[0-9]n[0-9]; do
    if [ -b "$disk" ]; then
        echo "--- $disk ---" >> "$output"
        sudo smartctl -H "$disk" 2>/dev/null | grep -E "SMART overall-health|SMART Health Status" >> "$output"
    fi
done
echo "</pre></body></html>" >> "$output"
echo "报告已生成: $output"

直接读取系统文件(无需外部命令)

#!/bin/bash
# 从/proc和/sys文件系统读取硬盘信息
echo "=== 从 /proc/partitions 读取分区信息 ==="
awk '{if(NR>1) print $4, $3/1024/1024 " MB"}' /proc/partitions | grep -v ^name
echo ""
echo "=== 从 /sys/block 获取块设备详细信息 ==="
for device in /sys/block/*; do
    dev_name=$(basename "$device")
    if [ -f "$device/size" ]; then
        size=$(cat "$device/size")
        size_gb=$((size * 512 / 1024 / 1024 / 1024))
        echo "$dev_name: ${size_gb}GB"
    fi
done
# 获取磁盘型号(需要root或特定权限)
echo ""
echo "=== 磁盘型号信息 ==="
for dev in /sys/block/sd* /sys/block/nvme*; do
    if [ -f "$dev/device/model" ]; then
        echo "$(basename $dev): $(cat $dev/device/model)"
    fi
done

使用建议

  1. 权限问题:部分命令(如fdisk -lsmartctliotop)需要root权限,建议使用sudo
  2. 跨平台:Windows推荐用PowerShell + WMI,Linux用上述Bash脚本
  3. 输出格式
    • 日常监控:df -h + lsblk
    • 详细分析:fdisk -l + smartctl
    • 编程接口:Python脚本(可输出JSON)

需要保存脚本并赋予执行权限:

chmod +x disk_info.sh
./disk_info.sh

抱歉,评论功能暂时关闭!