python替换列表中的元素

时间:2015-02-09 11:41:43

标签: python

我想从密码管理器数据库中构建一个ssh_config和.alias文件。从数据库中我通过JSON获取所有信息。 然后ssh_config应如下所示:

Servername
    User foo
    Port 22
    Hostname Servername

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

alias Servername="ssh -p 22 foo@Servername"

到目前为止,这很好用。但是现在密码数据库有几个条目,有些是同一个服务器,但是用户不同。我想用户名的文件只以“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“seen”,我添加所有服务器名称。如果我看过Servername并且新用户是“foo”或“bar”,我可以忽略我的管理员列表的条目并将其添加到正常列表中。但是,如果我看到Servername并且新用户不是“foo”或“bar”,那么我需要在ssh_config_admins中找到旧条目来替换它。

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

因此,对于这两种情况,我都不知道如何真正解决它们,也许有人知道我怎样甚至以其他方式去这里。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您正在尝试构建两个配置文件:

  • 一个包含所有已知主机的服务器,每个服务器只有一个条目,仅当没有指定其他用户时才使用用户“foo”或“bar”的凭据
  • 一个将用户“foo”和“bar”的所有凭据,所以不一定是所有已知的主机

这是对的吗?

如果是这样,一个解决方案就是两次通过:

  1. 构建一个包含所有已知主机的已解析信息的dict,将admin和foo / bar用户凭据分开。例如,它可以采取这种形式

    {
      'server1': {
        'admin': {
            'username': 'blah',
            'port': 22,
            etc.
        },
        'foobar': {
            'username': 'foo',
            'port': 22',
            etc.
        }
      },
      'server2': {
        'foobar': {
            'username': 'bar',
            'port': 332,
            etc.
        }
      }
    }
    
  2. 循环创建此dict,并通过获取“admin”凭据或“foobar”凭据(如果没有“admin”凭据)构建管理文件。例如,像这样:

    for server, creds in enumerate(hosts):
        credentials = creds.get('admin') or creds.get('foobar')
        fill_admin_file(credentials)
    
  3. 这是你想要做的吗?