我想从密码管理器数据库中构建一个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已经在我的列表中,我只需将它们添加到所有列表,而不是管理员列表。
因此,对于这两种情况,我都不知道如何真正解决它们,也许有人知道我怎样甚至以其他方式去这里。
答案 0 :(得分:0)
如果我理解正确,您正在尝试构建两个配置文件:
这是对的吗?
如果是这样,一个解决方案就是两次通过:
构建一个包含所有已知主机的已解析信息的dict,将admin和foo / bar用户凭据分开。例如,它可以采取这种形式
{
'server1': {
'admin': {
'username': 'blah',
'port': 22,
etc.
},
'foobar': {
'username': 'foo',
'port': 22',
etc.
}
},
'server2': {
'foobar': {
'username': 'bar',
'port': 332,
etc.
}
}
}
循环创建此dict,并通过获取“admin”凭据或“foobar”凭据(如果没有“admin”凭据)构建管理文件。例如,像这样:
for server, creds in enumerate(hosts):
credentials = creds.get('admin') or creds.get('foobar')
fill_admin_file(credentials)
这是你想要做的吗?