代码之家  ›  专栏  ›  技术社区  ›  Sandra Schlichting

从hdparm输出中提取信息

  •  1
  • Sandra Schlichting  · 技术社区  · 6 年前

    如果你跑步 hdparm -I /dev/X 哪里 X 是您的SSD设备,它将打印类似以下内容的信息(只读操作)

    ...
    Security: 
        Master password revision code = 36401
            supported
        not enabled
            locked
        not frozen
            expired: security count
            supported: enhanced erase
    ...
    

    因此,提取 not 在前面 frozen 具有

    for d in $(ls /sys/block); do
        is_frozen=$(hdparm -I /dev/$d | awk '/frozen/ { print $1 }')
        echo $is_frozen
    done
    

    然而,它总是返回 冻结的 好像 不存在。

    问题

    有人能解释一下如何提取 冻结的 线

    2 回复  |  直到 6 年前
        1
  •  1
  •   Miles Wolbe    6 年前

    在我的系统上,/dev/sda当前已冻结,/dev/sdb未冻结,如下所示:

    # hdparm -I /dev/sda | grep frozen
            frozen
    # hdparm -I /dev/sdb | grep frozen
        not    frozen
    

    只需添加 $d 到您的 echo 命令查看设备及其正确的对应值(我冒昧地替换了 awk 命令要短得多 grep ):

    # for d in $(ls /sys/block) ; do is_frozen=$(hdparm -I /dev/$d | grep frozen) ; echo $d $is_frozen ; done
     HDIO_DRIVE_CMD(identify) failed: Invalid argument
    loop0
    ...
    sda frozen
    sdb not frozen
    

    如果要清理输出,请替换 ls 具有 find :

    # for d in $(find /sys/block -name 'sd*' -exec basename {} \;) ; do is_frozen=$(hdparm -I /dev/$d | grep frozen) ; echo $d $is_frozen ; done
    sda frozen
    sdb not frozen
    

    或者有 ls公司 查询 /dev/sd? 而是:

    # for d in $(ls -1 /dev/sd?) ; do is_frozen=$(hdparm -I $d | grep frozen) ; echo $d $is_frozen ; done
    /dev/sda frozen
    /dev/sdb not frozen
    
        2
  •  1
  •   Gautam    6 年前

    一个可能的原因可能是,您在屏幕上看到的不是awk的结果,而是stderr的结果。以下是您可以执行的诊断操作:

    1. 现在放弃for循环,用一个设备进行测试,比如sda。
    2. 将输出重定向到文件,例如$sudo hdparm-I/dev/sda>/tmp/临时文件
    3. 查看是否仍能看到“冻结”无屏幕的行。