如何在单个命令中执行“cryptsetup luksOpen”和“mount”?

如何在单个命令中执行“cryptsetup luksOpen”和“mount”?

我目前有以下脚本。当我需要安装所述磁盘时,我会手动运行此脚本。我不需要/不希望此磁盘在启动时自动安装:

disk1="/dev/disk/by-uuid/84ea2a10-abcd-abcd-abcd-06deabcdabcd"
sudo cryptsetup luksOpen "${disk1}" disk1-crypt
sudo mount /dev/mapper/disk1-crypt /mnt/disk1

是否可以设置 Linux,使其知道在我尝试安装此磁盘时自动执行 luksOpen 命令?如果可能的话,在我卸载它时也执行 luksClose。

答案1

如果你使用 systemd:

  1. 将 LUKS 配置添加到/etc/crypttab,并指定“无”作为密钥文件。
  2. 将安装配置添加到/etc/fstab(可能指定noauto为选项)。
  3. 运行systemctl daemon-reload以使其获取更改。
  4. 用于systemctl start /mnt/disk1解锁并挂载文件系统。
  5. 用于systemctl stop /mnt/disk1卸载文件系统,这会导致解锁的设备也因不需要而被停止。

如果您正在使用 GNOME(或通常安装了其组件):

  1. 用于gio mount -d /dev/disk/by-whatever直接从其锁定的设备挂载文件系统。这不接受挂载点位置 - 如果磁盘与 crypttab 和 fstab 条目匹配,它将遵守这些条目,否则它将始终默认为/run/media/USER/FSLABEL
  2. 用于gio mount -u /run/media/ana/disk1卸载它。

答案2

@user1686 展示了在 systemd 下执行此操作的“正确”方法,但对于那些没有 systemd 的人来说(或者认为 systemd 是用胶水粘合在一起的太多复杂脚本的人!),只需使用@Gabriel 的脚本并将其粘贴进去/usr/local/bin/mount-my-disk

#!/bin/bash

if [ $UID != 0 ]; exec sudo "$0" "$@"; fi

disk1="/dev/disk/by-uuid/84ea2a10-abcd-abcd-abcd-06deabcdabcd"
cryptsetup luksOpen "${disk1}" disk1-crypt
mount /dev/mapper/disk1-crypt /mnt/disk1

您可能不想授予 sudo 访问所有这些命令的权限,或者具有sudo mount访问权限的用户可能会做一些恶作剧:请遵守最小特权原则。

$UID 检查可以让你只为/usr/local/bin/mount-my-disk

答案3

这不是一个优雅的解决方案,但它可能适合您的用例(并且这绝对是我自己解决问题的方法)。

您可以创建一个 bash 脚本,以别名的形式覆盖该命令,检查参数并在传递该精确参数时执行您需要的操作,在传递其他任何内容时mount返回到实际命令。mount

看一下这个脚本:

#!/bin/bash

mount_disk1 () {
    disk1="/dev/disk/by-uuid/84ea2a10-abcd-abcd-abcd-06deabcdabcd"
    sudo cryptsetup luksOpen "${disk1}" disk1-crypt
    sudo mount /dev/mapper/disk1-crypt /mnt/disk1
}

[[ "$@" == "disk1" ]] && mount_disk1 \
|| mount "$@"

这里有一个函数,它可以执行您想要的操作。如果您传递给它的唯一内容是disk1它将执行该函数,否则它将执行mount传递所有参数的原始函数。

~/.bashrc您可以将此脚本放在文件夹中,并在您的或~/.zshrc使用中设置别名

alias mount='<path to script>'

然后如果你想使用原来的mount,你可以\mount在终端中运行。

希望能帮助到你!

相关内容