如何在终端中从密钥环获取密码以供脚本使用?

当您的计算机中有一个加密的 LUKS 驱动器时, Nautilus 或 Nemo 将其显示在设备下,作为带有小锁的驱动器。
单击它后,您需要输入密码。如果选择“永久记住此密码”,则会保存到您的钥匙环中。下一次启动,单击驱动器将立即挂载它。
如何从终端“立即挂载”存储在钥匙环中的驱动器的密码?我想要一个自动启动脚本,在登录时将我的LUKS驱动器挂载。我不想将密码存储在脚本中,我想使用钥匙环中的密码:
如果您转到密码与钥匙,那里有一些没有名字的钥匙。在它们的属性中,您可以找到类似于 gvfs-luks-uuid = xxxxxxxxxxxx 的描述,以及该LUKS驱动器的密码。这是Ubuntu使用的方法。
我考虑过一个选项,那就是使用python-gnomekeyring,但它只能获取密钥名称和密码。我需要GUI中所称的“技术细节”,以便根据特定的uuid获取密码,因为密钥名称始终为空。
4个回答

你可以使用secret-tools将密码存储到钥匙链中,并从中检索出来。
要存储新密码:
secret-tool store --label='Password for mydrive' drive mydrive

我让你在钥匙环中检查它的外观。要查找它(这个命令可以轻松地插入到你的脚本中):
secret-tool lookup drive mydrive

请注意,secret-tool的秘密在于您不能以root身份运行示例! - Paul Flint
2“secret-tools”不是一个键值工具吗?既然“--label”选项是必须的,为什么我需要三个键来存储一个值?我只是像这样保存我的值:“secret-tool store --label=my_key my_key my_key”,它可以工作,但这太奇怪了。 - phil294
@phil294 所谓的“属性”(键)和“值”并非随意。请参阅文档以了解更多信息。 - xebeche
1@phil294 这个页面解释了它:Gnomering密钥环简介 -- "密钥环中的数据存储在"项"中。每个项都有一个名称,比如"大学代理密码"或"example.org SSH私钥密码",一个秘密和一个无限列表的属性。每个属性由一个名称-值对组成,旨在为应用程序提供提示(例如"user=fer"或"server=example.org")。这使得应用程序能够在密钥环中找到相关的项。所有字符串都是UTF-8编码。" - wjandrea
@xebeche 我已经查阅了相关文档,但是它并没有解释属性和值的含义。甚至连一个“参见”页面或者其他有用的学习资料都没有提供。不过,我自己找到了相关信息。请参考我上面的评论。 - wjandrea

我认为唯一的答案是通过python,但有两个错误使事情变得困难。
  1. 你需要手动给你的键命名(海马:描述),因为其他应用程序使用的识别细节在python版本中不可用。我在这里创建了一个错误报告:https://bugs.launchpad.net/ubuntu/+source/gnome-python-desktop/+bug/1144781
  2. 在LUKS密钥的特定情况下,这些描述在海马中为空,但更改空描述实际上会更改密钥名称,因此您可以在python中查找它。我在这里创建了一个错误报告:https://bugs.launchpad.net/ubuntu/+source/seahorse/+bug/1144703

如果您正在使用脚本和密钥环,请提到这些错误也会影响您。

至于python部分,这里有一个例子:

#!/usr/bin/env python

import gnomekeyring as gk

keyring = 'login'
keyItems = gk.list_item_ids_sync(keyring)

for keyItem in keyItems:
    key = gk.item_get_info_sync(keyring, keyItem)
    if  key.get_display_name() == 'KeyName you are looking for':
        # Your script here using key.get_secret()
        print "Password:", key.get_secret()

如果你知道其他方法,例如通过简单的bash命令,请告诉我们。


3一个Python3的例子? - Khurshid Alam
源代码存档中还有一个工具:https://gitlab.gnome.org/GNOME/gnome-keyring/-/blob/master/pkcs11/secret-store/dump-keyring0-format.c 还可以参考这个答案:https://askubuntu.com/a/1155765/207933 - Frederick Nord

使用Python Keyring Lib
它具有方便的CLI,可用于shell脚本。
安装方法如下:
pip install keyring

设置和获取键

$ keyring set system username
Password for 'username' in 'system':
$ keyring get system username
password

这是我在这里阅读、那里阅读和测试“lssecret”之后得出的“精炼”答案。
$ secret-tool lookup xdg:schema org.gnome.GVfs.Luks.Password gvfs-luks-uuid {uuid}
asupersecretpassword

这将为具有给定UUID的设备获取LUKS密码。使用libsecret v0.21.1。