我正在使用
Fabric
来自动化我的一些工作流程,其中大部分涉及操作 EC2 实例。
我正在寻找一种方法来使我的
.ssh/config
文件保持最新,因为我经常启动和关闭 EC2 实例,如果我可以轻松 ssh 进入它们进行调试等,这对我非常有帮助。
我的 SSH 配置文件中的条目如下所示
Host ins_id
Hostname xxxxxxxx.com
User ubuntu
IdentityFile ~/.ssh/kp.pem
目前,我正在做类似以下的事情(利用
Fabric
和boto
),坦率地说,这是一种垃圾方法:
def my_cool_spin_up_function(self):
. . .
. . .
ssh_conf = os.path.join(homedir, '.ssh/config')
ssh_info = '\n'.join(['Host %s' % name,
'Hostname %s' % ins.dns_name,
'User %s' % env.user,
'IdentityFile %s' % kp_loc,
'\n'])
w_com = 'echo %s | cat - %s | tee %s > /dev/null' % (ssh_info, ssh_conf, ssh_conf)
local(w_com)
如您所见,每次调用时,这都会保留在我的配置文件之前,这很好,因为 SSH 占用配置中每个主机的第一部分,但这意味着文件会不断构建。 。 .
我想知道是否有任何Python库允许人们将
.ssh/config
视为更多的配置文件,其相关部分可以随时更新。例如,如果您可以简单地将 .ssh/config
视为字典并抽象出文件读/写,那就太棒了。 。 .
感谢您的建议!
我们对此类配置所做的是维护一个配置片段目录,可以根据需要添加/删除该目录,然后执行以下操作:
cat .ssh/config.d/* > .ssh/config
这将按词汇顺序附加内容,这意味着顺序取决于您选择如何命名文件。这使得旧配置过期、删除特定项目以及以其他方式控制配置文件变得非常容易。
这个线程已有很多年历史了,但让我尝试一下,因为我遇到了同样的问题,并且该线程没有可接受的解决方案。
我最终在
Include
上使用了
ssh_config
功能
Include
Include the specified configuration file(s). Multiple pathnames may be specified and each pathname may contain glob(7) wildcards and, for user configurations, shell-like
‘~’ references to user home directories. Files without absolute paths are assumed to be in ~/.ssh if included in a user configuration file or /etc/ssh if included from the
system configuration file. Include directive may appear inside a Match or Host block to perform conditional inclusion.
所以在我的主
~/.ssh/config
我有默认选项,然后在顶部 - 因为这些问题有一行
Include ~/.ssh/config.d/*
...
(rest of the file)
这两个文件是使用
aws
和 gcloud
(来自云提供商的命令行工具)从 crontab 运行的 bash 脚本自动生成的。
此方法的优点是它不会触及您的
.ssh/config
文件,因为它可能包含您不希望弄乱的敏感条目。
这样的事情怎么样:
class SSHConfig(object):
def __init__(self, filename=None):
if filename is not None:
self.read(filename)
else:
self.conf = dict()
def read(self, filename):
self.conf = dict(line.decode("utf-8").rstrip().split(" ", 1) for line in open(filename))
def write(self, filename):
with open(filename, "w") as f:
for key, value in self.conf.items():
f.write("%s %s\n".encode("utf-8") % (key, value))
def set(self, key, value):
self.conf[key] = value
def get(self, key):
return self.conf.get(key, None)
我遇到了类似的问题,但无法找到现有的解决方案,所以我制作了这个 Python 包。 https://github.com/emileindik/slosh
$ pip install slosh
$ slosh [email protected] --save-as myserver
这将在您的 SSH 配置文件中创建一个条目,如下所示
Host=myserver
HostName=1.1.1.1
User=ubuntu
可以使用相同的别名来更新相同的条目。例如,向连接添加 .pem 文件:
$ slosh -i ~/.ssh/mykey.pem [email protected] --save-as myserver
它目前支持许多
ssh
选项,但请告诉我是否应该添加其他选项!