目前,我这样做是为了安装我的加密拇指驱动器:
# Works!
pass thumbdrive-password | # get device password entry from password manager
head -n 1 | # get the device password itself
sudo cryptsetup luksOpen /dev/sdb thumbdrive # unlock device
udisksctl mount -b /dev/mapper/thumbdrive # mount device
我想做这样的事情:
# Does not work!
pass thumbdrive-password |
head -n 1 |
udisksctl unlock -b /dev/sdb # unlock device
udisksctl mount -b /dev/mapper/luks-foobar # mount device with uuid "foobar"
这将允许半特权用户(org.freedesktop.udisks2.filesystem-mount
在 polkit 中具有权限)无需使用 sudo 即可挂载加密文件系统。 Udisk 不会接受这种管道方法,因为它使用交互式密码提示。如何在udisksctl unlock
不手动输入的情况下提供我的设备密码?
答案1
对于优盘版本2.6.4然后
笔记:我没有测试过这个。一旦我得到 udisks 2.6.4 我就会(每当https://github.com/NixOS/nixpkgs/pull/41723向后移植到 NixOS 稳定版)。
更新:我现在有 udisks 2.8.0,所以我可以测试我的解决方案。我唯一错过的是从 的输出中删除尾随换行符pass (...) | head (...)
。要修剪它,请使用-n
标志echo
,或附加| tr -d '\n'
到head
输出 。我在下面的两个解决方案中反映了这一点。
通用(不安全)解决方案
使用该--key-file
标志并用密码字符串代替密钥文件。/dev/sdb
使用密码解锁hunter2
:
udisksctl unlock --block-device /dev/sdb --key-file <(echo -n "hunter2")
直接通过命令行传递敏感数据是不安全的,因此应避免使用此方法。
pass
执行
相反,使用 检索密码字符串pass thumbdrive-password | head -n 1
,修剪尾随换行符,并将其替换为密钥文件:
udisksctl unlock \
--block-device /dev/sdb \
--key-file <(pass thumbdrive-password | head -n 1 | tr -d '\n')
答案2
问题是数据不是从控制终端读取的,stdin
而是从控制终端读取的:
解锁
解锁加密设备。将从控制终端请求密码,成功完成后,明文设备将打印到标准输出。
您可以使用霜冻建议的解决方法,也可以使用技巧使管道输入出现在控制终端上,例如使用expect
或socat
。
pass thumbdrive-password |
head -n 1 |
socat - EXEC:'udisksctl unlock -b /dev/sdb',pty,setsid,ctty
答案3
贡献永远不会太晚。我只需运行 #sudo apt-get install udisks2-lvm2 它就会自动安装。 Kubuntu 20.4 - 1TB SATA 磁盘的 USB 适配器。