为什么Fabric抛出'TypeError:参数必须是int,或者有一个fileno()方法'?

时间:2012-06-07 15:46:26

标签: ssh fabric ssh-keys

在远程服务器上运行Fabric任务时,我得到以下堆栈跟踪:

[x.x.x.x] run: git fetch && git reset --hard origin/develop
Exception in thread Thread-2:
Traceback (most recent call last):
  File "/usr/lib/python2.6/threading.py", line 532, in __bootstrap_inner
    self.run()
  File "/var/lib/jenkins/jobs/deploy/workspace/.pyenv/lib/python2.6/site-packages/ssh/agent.py", line 115, in run
    self._communicate()
  File "/var/lib/jenkins/jobs/deploy/workspace/.pyenv/lib/python2.6/site-packages/ssh/agent.py", line 125, in _communicate
    events = select([self._agent._conn, self.__inr], [], [], 0.5)
TypeError: argument must be an int, or have a fileno() method.

Fabric任务正在尝试执行 git fetch 并且在 ssh / agent.py 中引发异常的事实让我觉得SSH身份验证有问题

同一个用户可以在Fabric之外运行 git fetch ,并且我的笔记本电脑上的任务运行正常。

这里发生了什么?我该如何解决这个问题?

3 个答案:

答案 0 :(得分:17)

在Fabric的问题跟踪器上提出的{p> An issue提到错误可能是因为没有在主机上运行ssh-agent。

我通过启动ssh-agent并添加用户密钥来解决问题:

$> eval `ssh-agent`
$> ssh-add ~/.ssh/id_rsa

成功!

答案 1 :(得分:0)

要在首次登录时自动启动ssh-agent,请将其添加到~/.bashrc

if [ ! -S ~/.ssh/ssh_auth_sock ]; then
  eval `ssh-agent`
  ln -sf "$SSH_AUTH_SOCK" ~/.ssh/ssh_auth_sock
  ssh-add
fi
export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock

答案 2 :(得分:0)

当我尝试在./manage.py shell_plus内手动执行任务时,我在使用Fabric with Python / Django时遇到此错误。

事实证明(对我来说)错误是由于我的shell_plus设置为使用bpython而不是ipython这一事实造成的。

当我跑./manage.py shell_plus --ipython时,一切都运转良好。

我意识到这可能不是你问题的直接答案,但我想我也可以在这里留下一张便条给其他人,就像我一样。