我正在尝试创建一个包含用户及其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}
现在,我想遍历“管理员”中的名称列表,并使用其他文件中的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循环时,仅更新一个值。 Kinda卡在这里,我已经超出了python的深度...在这里我走对了吗?
编辑: 将最后一个循环更改为:
for i in admins:
for key, value in admin_dict.items():
admin_dict[key] = ssh_keys['users'][i]['ssh-keys']
,情况看起来更好。这有效吗?
答案 0 :(得分:0)
带有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
^^^^^^^^^^^