2015-02-09 122 views
1

我想从密码管理器数据库中构建ssh_config和.alias文件。从数据库中,我通过JSON获取所有信息。 然后ssh_config应该如下所示:python替换列表中的元素

Servername 
    User foo 
    Port 22 
    Hostname Servername 

可能会出现其他值。别名文件获得相同的值,但在一行中:

alias Servername="ssh -p 22 [email protected]" 

到目前为止这么好,这工作正常。但是现在密码数据库有几个条目,一些是相同的服务器,但是不同的用户。我想要一个用户名的文件只能以“foo”或“bar”开头,对于任何其他我假设有管理员用户,如果有这样一个管理员用户的条目我想这个用户,而不是任何“foo “或‘ - ’ 这是目前我的函数来创建ssh_config中和别名文件

# define function to add values to files 
def fillSSH (item, ssh_config, alias): 
    # split item name, first is customer server 
    shortname = item.get('name').split()    
    # append Host entry to ssh_config 
    ssh_config.append('Host ' + shortname[0]) 
    # append User entry to ssh_config 
    ssh_config.append(' User ' + access_url[3]) 
    # If there is a :[port] at the end, we have 6 objects 
    if len(access_url) >= 6: 
     # append Port entry to ssh_config if it exists 
     ssh_config.append(' Port ' + access_url[5]) 
     # create the alias entry just once 
     aliasurl = 'alias ' + shortname[0] + '="ssh -p' + access_url[5] + ' ' + access_url[3] + '@' + access_url[4] + '"' 
    else: 
     # create the alias entry just once 
     aliasurl = 'alias ' + shortname[0] + '="ssh ' + access_url[3] + '@' + access_url[4] + '"' 
    # append HostName entry to ssh_config 
    ssh_config.append(' HostName ' + access_url[4]) 
    # append empty line 
    ssh_config.append('') 

    # append entry for alias to list 
    alias.append(aliasurl) 

现在我不知道如何与我不同的用户进行。我有类似的东西

# split access url by :/@ 
    access_url = re.split(':|/|@',item.get('access_info')) 
    # if foo or bar, for everyone 
    if access_url[3] == 'foo' or access_url[3] == 'bar': 
     fillSSH (item, ssh_config, alias) 
    # else just for admins if not seen before 
    else: 
     fillSSH (item, ssh_config_admins, alias_admins) 

所以目前我有两个想法,我可以在这里继续。 1)我必须添加一个var“看到”我添加所有服务器名称。如果我看到Servername并且新用户是“foo”或“bar”,我可以忽略管理列表的条目并将其添加到普通列表中。但是如果我看到Servername和新用户不是“foo”或“bar”,那么我需要在ssh_config_admins中找到旧条目来替换它。

2)另一个想法是创建一个包含所有“foo”和“bar”用户的列表以及所有其他用户的列表。但是,如果没有其他登录名的服务器,我想为我的管理员设置“foo”和“bar”用户,那么在这种情况下如何合并它们?我想我必须在列表中走两遍,一次获得所有非“foo”和“bar”用户,第二次获得foo和bar,如果servername已经在我的列表中,我只需将它们添加到全部列表而不是管理员列表。

因此,对于这两种情况,我不知道如何真正解决它们,也许有人知道如何甚至是另一种方式我可以去这里。

+0

我看到了你的问题的标题。你可以像下面这样替换列表中的元素:your_list [i] = new_object – 2015-02-09 11:51:45

回答

0

如果我理解正确,你正在建设两个配置文件:

  • 一个与所有已知的主机,每个服务器一个条目,随着用户“foo”的凭据或“栏”只有在没有指定其他用户
  • 一个将用户“foo”和“bar”的所有凭证,所以不一定所有已知的主机

这是正确的吗?

如果是这样,一个解决办法是将做两遍:

  1. 构建包含所有已知的主机所解析的信息,管理和富/栏用户证书之间分离一个字典。例如,它可能会采取的形式

    { 
        'server1': { 
        'admin': { 
         'username': 'blah', 
         'port': 22, 
         etc. 
        }, 
        'foobar': { 
         'username': 'foo', 
         'port': 22', 
         etc. 
        } 
        }, 
        'server2': { 
        'foobar': { 
         'username': 'bar', 
         'port': 332, 
         etc. 
        } 
        } 
    } 
    
  2. 遍历这个创建字典,并要么以“管理员”凭证建立自己的管理文件,或“foobar的”资格证书,如果没有“管理员”证书。例如,像这样:

    for server, creds in enumerate(hosts): 
        credentials = creds.get('admin') or creds.get('foobar') 
        fill_admin_file(credentials) 
    

这就是你想做什么?

+0

这听起来不错。但我不知道如何建立第一本字典。我通过JSON获得的信息更像server1 {root @ server1},server2 {foo @ server2},server3 {admin @ server3},server1 {bar @ server1} – 2015-02-09 13:46:11

+0

那么你可以调整你已经使用的代码。例如,你用''item.get('name')。split()[0]''解析主机名。而不是直接写入结果文件,只需在dict中使用适当的键,比如使用''host_dict ['Host'] = item.get('name')。split()[0]'' 。我可以写一个更详细的例子,如果你喜欢 – axelcdv 2015-02-09 13:49:58

+0

我刚刚解决它,为foo和bar用户创建一个列表,在同样的'if'情况下,我把整个项目也列入列表中,稍后我会遍历该列表,如果有一个服务器还没有添加到我的管理列表中。 – 2015-02-09 15:07:01