2015-02-09 142 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