Luks
向 udisk 提供密碼以解鎖 LUKS 加密的設備
目前,我這樣做是為了掛載我的加密拇指驅動器:
# 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 的情況下掛載加密的文件系統。Udisks 不會接受這種管道方法,因為它使用互動式密碼提示。udisksctl unlock
如何在不手動輸入的情況下提供我的設備密碼?
對於 udisks版本 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')
問題是數據不是從控制終端讀取的,
stdin
而是從控制終端讀取的:unlock
解鎖加密設備。將從控制終端請求密碼,成功完成後,明文設備將列印到標準輸出。
您可以使用建議的解決方法frostschutz 或使用技巧使管道輸入出現在控制終端上,例如使用
expect
或socat
。pass thumbdrive-password | head -n 1 | socat - EXEC:'udisksctl unlock -b /dev/sdb',pty,setsid,ctty