使用Python自动更新SSH配置文件的首选方法?

问题描述 投票:0回答:4

我正在使用

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
视为字典并抽象出文件读/写,那就太棒了。 。 .

感谢您的建议!

python configuration ssh amazon-ec2 fabric
4个回答
10
投票

我们对此类配置所做的是维护一个配置片段目录,可以根据需要添加/删除该目录,然后执行以下操作:

cat .ssh/config.d/* > .ssh/config

这将按词汇顺序附加内容,这意味着顺序取决于您选择如何命名文件。这使得旧配置过期、删除特定项目以及以其他方式控制配置文件变得非常容易。


2
投票

这个线程已有很多年历史了,但让我尝试一下,因为我遇到了同样的问题,并且该线程没有可接受的解决方案。

我最终在

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
文件,因为它可能包含您不希望弄乱的敏感条目。


0
投票

这样的事情怎么样:

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)

0
投票

我遇到了类似的问题,但无法找到现有的解决方案,所以我制作了这个 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
选项,但请告诉我是否应该添加其他选项!

© www.soinside.com 2019 - 2024. All rights reserved.