使用Fabric连接到~/.ssh/config中列出的主机

84 投票
4 回答
28933 浏览
提问于 2025-04-16 00:11

我在使用Fabric的时候遇到了问题,它没有识别我在~/.ssh/config文件中设置的主机。

我的fabfile.py文件内容如下:

from fabric.api import run, env

env.hosts = ['lulu']

def whoami():
    run('whoami')

当我运行$ fab whoami时,得到的结果是:

[lulu] 运行: whoami

致命错误: 找不到名称 lulu

在我的~/.ssh/config文件中,有一个名为lulu,内容是这样的:

Host lulu
     hostname 192.168.100.100
     port 2100
     IdentityFile ~/.ssh/lulu-key

我最初想到的解决办法是往/etc/hosts文件里添加类似lulu.lulu的内容(我用的是Mac),但这样我还得把身份文件传给Fabric——我更希望把我的身份验证(也就是~/.ssh/config)和部署(也就是fabfile.py)分开。

另外,如果你尝试连接hosts文件中的主机,fabric.contrib.projects.rsync_project似乎也不识别hosts.env中的“端口”(也就是说,如果你使用hosts.env = [lulu:2100],调用rsync_project时,它似乎会尝试连接到lulu:21)。

那么,Fabric为什么不识别这个lulu的名字呢?

4 个回答

5

更新: 这个回答 现在已经过时


Fabric 目前不支持 .ssh/config 文件。你可以把这些设置放在一个函数里,然后在命令行中调用,比如:fab production task;其中 production 设置了用户名、主机名、端口和 SSH 身份。

至于 rsync 项目,现在应该可以设置端口了,如果不行,你可以直接运行 local("rsync ..."),因为这基本上就是那个贡献的功能所做的事情。

9

请注意,当名字不在 /etc/hosts 文件里时,也会出现这个问题。我之前也遇到过同样的问题,所以我需要把主机名同时添加到这个文件和 ~/.ssh/config 文件里。

146

从1.4.0版本开始,Fabric部分支持使用你的ssh配置。不过,你需要手动开启这个功能,方法是在你的fabfile文件的顶部附近加上

env.use_ssh_config = True

这样一来,Fabric就会读取你的ssh配置文件(默认是~/.ssh/config,或者是env.ssh_config_path指定的路径)。

需要注意的是:如果你使用的版本低于1.5.4,当env.use_ssh_config被设置时,如果没有找到配置文件,就会出现错误。这种情况下,你可以使用以下的解决方法:

if env.ssh_config_path and os.path.isfile(os.path.expanduser(env.ssh_config_path)):
    env.use_ssh_config = True

撰写回答