首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过循环更新dict中的密钥

通过循环更新dict中的密钥
EN

Stack Overflow用户
提问于 2019-08-06 05:09:00
回答 1查看 75关注 0票数 1

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

用户列表和ssh-key存储在不同的yaml文件中,需要从中获取信息。这些文件是"admins“和"users”,它们看起来如下所示:

Admins文件:

代码语言:javascript
复制
admins:
  global:
    - bob
    - john
    - jimmy
    - hubert

SSH密钥文件:

代码语言:javascript
复制
users:
  bob:
    fullname: Bob McBob
    ssh-keys: 
      ssh-rsa "thisismysshkey"


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

到目前为止,我有以下代码:

代码语言:javascript
复制
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)

因此,在这一点上,我有这样一句话:

代码语言:javascript
复制
print(admin_dict)
{'bob': 0, 'john': 0}

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

所以我这么做了:

代码语言:javascript
复制
f = open("./users.sls", 'r')
ssh_keys = yaml.load(f)

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

但是当运行for循环时,只有一个值被更新。有点卡在这里了,我已经超出了我的能力范围...我是不是走对了路?

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

代码语言:javascript
复制
for i in admins:
      for key, value in admin_dict.items():
          admin_dict[key] = ssh_keys['users'][i]['ssh-keys']

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

EN

回答 1

Stack Overflow用户

发布于 2019-08-06 06:10:39

使用如下的admin.yaml文件:

代码语言:javascript
复制
admins:
  global:
    - bob
    - john
    - jimmy
    - hubert

和一个类似这样的ssh_key.yaml

代码语言:javascript
复制
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密钥(如果不是在字典理解中对密钥类型的特定名称进行更深一层的索引):

代码语言:javascript
复制
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()

输出:

代码语言:javascript
复制
{ '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密钥,则使用替代输出:

代码语言:javascript
复制
{ 'bob': 'bob-rsa-key',
  'hubert': None,
  'jimmy': 'jimmy-rsa-key',
  'john': 'john-rsa-key'}

以上输出结果对字典理解进行了以下更改:

代码语言:javascript
复制
admin: users_dict[admin]['ssh-keys']['ssh-rsa'] if admin in users_dict else None
                                    ^^^^^^^^^^^
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57366128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档