AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1487099
Accepted
Mr. T
Mr. T
Asked: 2023-09-27 08:28:41 +0800 CST2023-09-27 08:28:41 +0800 CST 2023-09-27 08:28:41 +0800 CST

Ubuntu 22.04 bash 单行代码来识别支持 ​​LUKS 卷的设备?

  • 772

我有一个标准的 ubuntu 加密 lvm 设置。/dev/sda3使用 LUKS 加密。在 LUKS 容器内部是一个 LVM ( at /dev/mapper/dm_crypt-0),在该 LVM 内部是一个从 挂载到 的文件/dev/ubuntu-vg/ubuntu-lv系统/

如何在 bash 中将已知的挂载点转换/为/dev/sda3一行,最好无需 root?如果可以实现此目的,我很乐意安装一个单独的实用程序。

我已经想办法df|tail -n +2|cut -f 1 -d抓住我了/dev/mapper/ubuntu--vg-ubuntu--lv,但我该如何摆脱呢/dev/sda3?

mount
  • 1 1 个回答
  • 134 Views

1 个回答

  • Voted
  1. Best Answer
    mpboden
    2023-09-30T12:32:21+08:002023-09-30T12:32:21+08:00

    可能有一种更简单、更有效的方法来做到这一点,但我能够使用lsblk、grep和 来实现您想要的,并且awk不需要 root 访问权限。

    太长了;博士

    pkname=$(lsblk -o MOUNTPOINT,PKNAME | grep "^/"[^[:alnum:]] | awk '{ print $2 }');pkname=$(lsblk -o PATH,PKNAME,KNAME | grep $pkname | awk -v val="$pkname" '$3 == val { print $2 }');lsblk -o PATH,KNAME | grep $pkname | awk '{ print $1 }';unset pkname
    

    让我们将其分解并使用测试虚拟机作为示例,Ubuntu 22.04.3 Server。从 的输出开始lsblk。正如您所看到的,您想要的所有信息都在那里。它显示了挂载点和沿树向上到达的路径/dev/sda3。挑战在于如何解析此输出以获取/dev/sda3来自安装点的路径/。

    $ lsblk
    NAME                        MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINTS
    loop0                         7:0    0  63.4M  1 loop  /snap/core20/1974
    loop1                         7:1    0 111.9M  1 loop  /snap/lxd/24322
    loop2                         7:2    0  53.3M  1 loop  /snap/snapd/19457
    sda                           8:0    0    25G  0 disk  
    ├─sda1                        8:1    0     1M  0 part  
    ├─sda2                        8:2    0     2G  0 part  /boot
    └─sda3                        8:3    0    23G  0 part  
      └─dm_crypt-0              253:0    0    23G  0 crypt 
        └─ubuntu--vg-ubuntu--lv 253:1    0    23G  0 lvm   /
    sr0                          11:0    1  1024M  0 rom  
    

    幸运的是,lsblk有一个-o选项允许您提供要打印的列列表。这显示可以使用grep和解析的附加信息awk。查看lsblk --help完整列表。首先,我选择了MOUNTPOINTand ,但稍后PKNAME我也会使用PATHand 。KNAME

    $ lsblk --help
    --snip--
     KNAME  internal kernel device name
     PATH  path to the device node
    --snip--
     MOUNTPOINT  where the device is mounted
    --snip--
     PKNAME  internal parent kernel device name
    --snip--
    

    1.找到PKNAMEfor挂载点:/

    以下行打印与挂载点关联的MOUNTPOINT和:PKNAME/

    $ lsblk -o MOUNTPOINT,PKNAME | grep "^/"[^[:alnum:]]
    /                 dm-0
    

    用于awk打印第二列 并将其分配PKNAME给变量:

    $ pkname=$(lsblk -o MOUNTPOINT,PKNAME | grep "^/"[^[:alnum:]] | awk '{ print $2 }')
    $ echo $pkname
    dm-0
    

    2. 找到PKNAME上一个的PKNAME

    再次使用lsblk,这次与PATH、PKNAME和KNAME作为列。用于grep查找包含 值的行$pkname:

    $ lsblk -o PATH,PKNAME,KNAME | grep $pkname
    /dev/mapper/dm_crypt-0            sda3   dm-0
    /dev/mapper/ubuntu--vg-ubuntu--lv dm-0   dm-1
    

    这会产生两个匹配项,但我们只想要一个与$pkname第三列(即 )匹配的匹配项KNAME。PKNAME必须包含第二列,因为这是需要的下一个值。

    再次使用awk来获取该值,并将其重新分配给您的变量:

    $ pkname=$(lsblk -o PATH,PKNAME,KNAME | grep $pkname | awk -v val="$pkname" '$3 == val { print $2 }')
    $ echo $pkname
    sda3
    

    3. 找到PATH上一个的PKNAME

    用于lsblk显示PATH和KNAME列,grep查找匹配行,并awk打印第一列,PATH:

    $ lsblk -o PATH,KNAME | grep $pkname | awk '{ print $1 }'
    /dev/sda3
    

    最后,将所有命令组合在一起,并用分号分隔。unset为了完整起见,请在末尾添加 来清除变量$pkname。这就是您不需要 root 访问权限的单行代码。

    $ pkname=$(lsblk -o MOUNTPOINT,PKNAME | grep "^/"[^[:alnum:]] | awk '{ print $2 }');pkname=$(lsblk -o PATH,PKNAME,KNAME | grep $pkname | awk -v val="$pkname" '$3 == val { print $2 }');lsblk -o PATH,KNAME | grep $pkname | awk '{ print $1 }';unset pkname
    /dev/sda3
    
    • 1

相关问题

  • 如何挂载 ISO?

  • 将 USB 磁盘挂载到永久位置

  • 修复 USB 驱动器自动通知

  • 是否有更好的方式为 /home/userX 构建分区/挂载

  • 当另一个文件系统安装在路径上时是否可以删除文件?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve