Почему Fabric throw 'TypeError: аргумент должен быть int или иметь метод fileno()?

При выполнении задачи 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-аутентификацией.

Тот же пользователь может запускать git fetch за пределами Fabric, и задача отлично работает на моем ноутбуке.

Что здесь происходит? Как решить эту проблему?

Ответ 1

Проблема, затронутая в журнале отслеживания ошибок Fabric, указывает на то, что ошибка может возникнуть из-за того, что на хосте не запущен ssh-agent.

Я решил проблему, запустив ssh-agent и добавив ключ пользователя:

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

Успех!

Ответ 2

Чтобы автозапуск 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

Ответ 3

Я столкнулся с этой ошибкой при использовании Fabric с Python/Django, когда пытался выполнить задачи вручную ./manage.py shell_plus.

Оказывается (для меня), что ошибка была вызвана тем, что мой shell_plus был настроен на использование bpython вместо ipython.

Когда я побежал ./manage.py shell_plus --ipython, все работало отлично.

Я понимаю, что это, вероятно, не было прямым ответом на вашу проблему, но я полагаю, что я мог бы оставить примечание здесь для всех, кто сталкивается с проблемой, как я.