为什么Fabric显示与服务器断开连接的信息近2分钟?

5 投票
2 回答
1134 浏览
提问于 2025-04-15 21:53

Fabric 在我每次输入 fab 命令时,都会显示 Disconnecting from username@server... done.,这个过程几乎要持续两分钟,之后才会出现新的命令提示符。

这个问题在我对内部服务器和 Rackspace 云服务器使用 Fabric 命令时都存在。下面我附上了服务器的 auth.log 日志,而在我的 MacBook 上没有看到任何相关的日志。

大家有什么想法,觉得问题出在哪里吗?

服务器的 SSH auth.log,日志级别设置为 VERBOSE

Apr 21 13:30:52 qsandbox01 sshd[19503]: Accepted password for mrankin from 10.10.100.106 port 52854 ssh2
Apr 21 13:30:52 qsandbox01 sshd[19503]: pam_unix(sshd:session): session opened for user mrankin by (uid=0)
Apr 21 13:30:52 qsandbox01 sudo:  mrankin : TTY=unknown ; PWD=/home/mrankin ; USER=root ; COMMAND=/bin/bash -l -c apache2ctl graceful
Apr 21 13:30:53 qsandbox01 sshd[19503]: pam_unix(sshd:session): session closed for user mrankin

服务器配置

  • 操作系统:Ubuntu 9.10 和 Ubuntu 6.10(测试了4台使用这些操作系统的服务器)
  • OpenSSH:Ubuntu 软件包版本 1.5.1p1-6ubuntu2

客户端配置

  • 操作系统:Mac OS X 10.6.3
  • Fabric 版本 0.9
  • Virtualenv 版本 1.4.7
  • pip 版本 0.7

用于测试的简单 fabfile.py

即使我只是运行 fab -H server_ip host_type,使用以下的 fabfile,问题依然存在。

from fabric.api import run

def host_type():
    run('uname -s')

对问题原因的思考

我不确定这个问题持续了多久,但以下是我开始注意到使用 Fabric 时服务器断开连接变慢后的一些变化。

  1. 我使用 virtualenv 1.4.7、virtualenvwrapper 2.1 和 pip 0.7 重新创建了我的虚拟环境。不确定这是否相关,但我在虚拟环境中运行 fabfiles,所以这是个考虑因素。
  2. 我启用了 OS X 的防火墙。 我禁用了 OS X 的防火墙,但问题依然存在,所以这不是问题的原因。

2 个回答

2

感谢大家在这里关注这个问题。我想提醒一下读者,之前Paramiko 1.7.4版本和Fabric 0.9版本是比较稳定的,但最近一两周,有好几个用户开始遇到类似的断开连接超时的问题。所以我猜可能是其他某个组件(比如Python升级,或者远程服务器的软件包升级,或者其他什么原因)导致了1.7.4版本出现了bug。

我会查看Paramiko 1.7.5和1.7.6的更新日志,并收集更多关于用户平台、Python版本等的信息,看看是否能找出一些规律。

编辑:关于这个问题的新创建的Redmine工单在这里: http://code.fabfile.org/issues/show/158

6

解决方案

在我的虚拟环境中,我输入了以下命令后,问题就解决了:

pip install -U paramiko

这个命令安装了paramiko-1.7.6和pycrypto-2.0.1。之前我用的是paramiko-1.7.4和pycrypto-2.0.1。

看起来是paramiko出了问题,因为pycrypto的版本没有变化。至少可以确定paramiko 1.7.4和Fabric 0.9之间有一些不兼容的地方,而通过把paramiko升级到1.7.6就解决了这个问题。

注意:我在一个虚拟环境中把paramiko升级到1.7.6,确认问题消失了。然后我激活了另一个仍然使用paramiko-1.7.4的虚拟环境,发现问题依然存在。接着我把paramiko从1.7.4升级到1.7.6,结果在那个虚拟环境中问题也解决了。

撰写回答