【问题标题】:Updating keys in dict via loop通过循环更新dict中的键
【发布时间】:2019-08-05 21:09:00
【问题描述】:

我正在尝试创建一个包含用户列表及其 ssh 密钥的字典。

用户列表和 ssh 密钥存储在不同的 yaml 文件中,需要从中获取信息。这些文件是“管理员”和“用户”,它们看起来像:

管理员文件:

admins:
  global:
    - bob
    - john
    - jimmy
    - hubert

SSH 密钥文件:

users:
  bob:
    fullname: Bob McBob
    ssh-keys: 
      ssh-rsa "thisismysshkey"


  john:
    fullname: John McJohn
    ssh-keys: 
      ssh-rsa "thisismysshkey"

到目前为止,我有这个代码:

import yaml

#open admins list as "f"
f = open("./admins.sls", 'r')
#creates "admins" list
admins = yaml.load(f)
#grab only needed names and make a list
admins = admins['admins']['global']

#convert back to dict with dummy values of 0
admin_dict = dict.fromkeys(admins, 0)

所以在这一点上我有这个字典:

print(admin_dict)
{'bob': 0, 'john': 0}

现在我想遍历“admins”中的名称列表,并使用来自其他文件的 ssh-key 更新密钥(当前设置为 0)。

所以我这样做:

f = open("./users.sls", 'r')
ssh_keys = yaml.load(f)

for i in admins:
    admin_dict[k] = ssh_keys['users'][i]['ssh-keys']

但是当运行那个 for 循环时,只有一个值被更新。 有点卡在这里,我已经超出了我的 python 深度......我在正确的轨道上吗?

编辑: 将最后一个循环更改为:

for i in admins:
      for key, value in admin_dict.items():
          admin_dict[key] = ssh_keys['users'][i]['ssh-keys']

事情看起来好多了。这有效吗?

【问题讨论】:

  • 您上一个代码中的k 是什么?
  • 没什么...我用'k'表示它是字典的键。但它没有任何定义
  • 所以这应该会引发错误......你不能使用未定义的东西 +它使这个不可重现。另外,您可以尝试使用 dict-comp 一次性完成此操作:admin_dict = {usr: ssh_keys['users'][usr]['ssh-keys'] for usr in admins}
  • 让我试试。我刚才也做了这个,看起来确实有效:for i in admins: for key, value in admin_dict.items(): admin_dict[key] = ssh_keys['users'][i]['ssh-keys']
  • 这似乎是一种非常奇怪的做法,而且工作起来也很奇怪。那应该使您的所有项目都具有与上一个管理员相同的值...

标签: python python-3.x


【解决方案1】:

使用admin.yaml 文件,例如:

admins:
  global:
    - bob
    - john
    - jimmy
    - hubert

还有一个像这样的ssh_key.yaml

users:
  bob:
    fullname: Bob McBob
    ssh-keys: 
      ssh-rsa: "bob-rsa-key"
  john:
    fullname: John McJohn
    ssh-keys: 
      ssh-rsa: "john-rsa-key"
  jimmy:
    fullname: Jimmy McGill
    ssh-keys:
      ssh-rsa: "jimmy-rsa-key"
      ssh-ecdsa: "jimmy-ecdsa-key"

假设您想知道每个用户拥有哪种类型的 ssh 密钥,您可以做这样的事情(如果不只是在字典理解中为密钥类型的特定名称深入索引一级):

import yaml
import pprint


def main():
    with open('admin.yaml', 'r') as f:
        admins_dict = yaml.load(f, yaml.SafeLoader)
        admins_list = admins_dict['admins']['global']
    with open('ssh_keys.yaml', 'r') as f:
        ssh_dict = yaml.load(f, yaml.SafeLoader)
        users_dict = ssh_dict['users']

    admins_with_keys_dict = {
        admin: users_dict[admin]['ssh-keys'] if admin in users_dict else None
        for admin in admins_list
    }

    pp = pprint.PrettyPrinter(indent=2)
    pp.pprint(admins_with_keys_dict)


if __name__ == '__main__':
    main()

输出:

{ 'bob': {'ssh-rsa': 'bob-rsa-key'},
  'hubert': None,
  'jimmy': {'ssh-ecdsa': 'jimmy-ecdsa-key', 'ssh-rsa': 'jimmy-rsa-key'},
  'john': {'ssh-rsa': 'john-rsa-key'}}

如果您只需要 rsa 密钥,则另一种输出:

{ 'bob': 'bob-rsa-key',
  'hubert': None,
  'jimmy': 'jimmy-rsa-key',
  'john': 'john-rsa-key'}

以上输出实现了对字典理解的以下更改:

admin: users_dict[admin]['ssh-keys']['ssh-rsa'] if admin in users_dict else None
                                    ^^^^^^^^^^^

【讨论】:

    猜你喜欢
    • 2021-07-12
    • 1970-01-01
    • 2015-06-18
    • 2019-07-21
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    相关资源
    最近更新 更多