Python Fabric дает: Неустранимая ошибка: нет существующего сеанса
У меня есть следующий простой файл fabfile.py из документации:
from fabric.api import run
def host_type():
run('uname -s')
Я пытаюсь запустить его, используя:
fab -H 192.168.0.201 host_type
Но получите ошибку:
[email protected]:~/me$ fab -H 192.168.0.201 host_type
[192.168.0.201] run: uname -s
Password for [email protected]:
Fatal error: No existing session
Aborting.
Я могу сделать ssh в 192.168.0.201.
Любые идеи?
Ответы
Ответ 1
Короткий ответ: попробуйте флаги командной строки "-k" и "-a", если у вас есть более одного открытого ключа SSH и вы хотите использовать аутентификацию по паролю.
Когда я столкнулся с этой ошибкой, это стало результатом очень уникальной ситуации. У меня много разных открытых ключей в ~/.ssh. У меня также есть много этих открытых ключей, добавленных к моему агенту SSH. Я пытался использовать Fabric только с паролем.
Вот что я видел в журналах проверки подлинности сервера:
Nov 7 07:56:02 ubuntu sshd[1862]: Disconnecting: Too many authentication failures for user [preauth]
Nov 7 07:56:08 ubuntu sshd[1864]: Disconnecting: Too many authentication failures for user [preauth]
Я попросил Fabric использовать не открытые ключи для аутентификации с флагом командной строки '-k'. Я пропустил этот Fabric (через Paramiko) по умолчанию, используя все, что доступно через агента SSH. В моем случае все эти открытые ключи были зарегистрированы агентом SSH, поэтому говорить, что Fabric не использовать открытые ключи, было неполным решением. Я добавил флаг командной строки '-a', который сообщает Fabric, что он не запрашивает агента SSH. Наконец, я могу использовать аутентификацию паролем для подключения к серверу с помощью Fabric.
Ответ 2
В более общем плане, если вы получите эту ошибку, вы должны попробовать SSHing с точными параметрами, которые пытается использовать paramiko:
- имя хоста
- Пользователь
- метод проверки подлинности
Я обнаружил, что наличие слишком большого количества SSH-ключей привело к сбою некоторых (но не всех) моих SSH-подключений, поскольку все ключи были предложены удаленному хосту. Раньше неправильные ключи также поднимали это сообщение об ошибке для меня (вы можете обнаружить их, удалив ключи из ~/.ssh/
, по одному за раз.)
К сожалению, Fabric не поддерживает ваши настройки .ssh/config. Если вы хотите отладить это, вы можете запустить следующее:
#!/usr/bin/env python
import paramiko
paramiko.util.log_to_file("/tmp/paramiko.log")
ssh = paramiko.SSHClient()
# Run this if you get host key errors: see later
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect("example.com", username="myuser", password="mypassword")
и проверьте вывод в /tmp/paramiko.log
- вы можете увидеть что-то вроде:
INF [20120904-16:58:52.155] thr=1 paramiko.transport: Disconnect (code 2): Too many authentication failures for myuser
Вы можете установить no_keys в среду окружения Fabric:
env.no_keys = True
Но тогда вам нужно будет сказать Fabric, чтобы использовать определенные ключи для определенных хостов. Как было предложено выше, вы можете сделать это в своем файле с помощью:
from fabric.api import env
env.key_filename = "/path/to/.ssh/ssk_non_public_key"
В более общем плане здесь используется функция для синтаксического анализа вашей конфигурации .ssh и выделения выборочных ключей - в этих ключах используется SSH-ключ. Чтобы это работало автоматически, вам нужно добавить IdentityFile в ~/.ssh/config
:
Host example.com
IdentityFile /home/jp/.ssh/id_rsa_example
Другой причиной отказа может быть то, что paramiko не распознает все типы ключей хоста. Это несколько более проблематично: paramiko спокойно игнорирует ключ хоста в ~/.ssh/known_hosts
, потому что это не формат ключа хоста, который он понимает. Попробуйте ssh-ing с -v и посмотрите, какая строка SSH говорит, что он находит совпадение с ключом для:
debug1: Host '1.2.3.4' is known and matches the RSA host key.
debug1: Found key in /home/jp/.ssh/known_hosts:105
Вы можете попробовать удалить эту строку, затем снова выполнить ssh и принять (новый?) ключ хоста и посмотреть, понравится ли paramiko. Если эта проблема, тем не менее, и которая ее не решает, то нет ясного решения, которое я могу видеть.
Ответ 3
Чтобы исправить его
-
добавьте эти строки в ваш прием ткани:
from fabric.api import env
env.key_filename = "/path/to/.ssh/ssk_non_public_key"
Если вы разместили общедоступный ключ ssh на сервере, к которому необходимо получить доступ с помощью fab script.
-
Если нет - удалите каталог .ssh, это также поможет
Или вы можете создать ssh-ключ ssh-keygen и использовать комбинацию 1) и 2)
Ответ 4
У меня был секретный ключ в ~/.ssh/config
и, оказывается, мне нужно добавить его снова с помощью ssh-add ~/.ssh/PRIVATE_KEY_NAME
, после чего все снова начнет работать. Я использую команду с опцией прямого агента -A
Ответ 5
Недостаточно репутации, чтобы прокомментировать сообщение Трои Дж. Фаррелла в ответ на вопросы jberryman's. Это НЕ ошибка, но артефакт в том, как обрабатываются открытые ключи SSH.
Моя проблема была одним из ключей, которые я загрузил в ssh-agent (ed25519), был несовместим с одной из систем, которые я загрузил в env.hosts в ткани. Поскольку я действительно хотел использовать другие ключи, я просто добавил параметр -a, а не -k-вариант для создания. Это сработало. Единственное предостережение в том, что если один из ваших секретных ключей защищен паролем, вам придется вводить эту кодовую фразу каждый раз, когда ткань использует ключ.
Ответ 6
Одно из самых простых решений в fab --help - использование параметра -a.
имя файла: fabfile.py Для запуска из командной строки: fab -a check_service
from fabric.api import run, env
env.hosts = ['127.0.0.1']
env.user = 'viraj'
def check_service():
"""
Function will show status of nginx service.
"""
run ("systemctl status nginx.service")
Ответ 7
Хммм, просто догадываюсь... вы пробовали это?
def host_type():
run('uname -s', pty=True)
Помню, я применил эту запись faq для аналогичной проблемы: http://docs.fabfile.org/en/1.0.0/faq.html#why-do-i-sometimes-see-err-stdin-is-not-a-tty
Ответ 8
Это был сбой агента ssh для меня, вызванный удалением смарт-карт.
Проблема может быть легко видна на выходе "ssh user @host" (в моем случае это было сообщение "Агент признано не подписано с использованием ключа" ).
Моя догадка заключается в том, что у OP была некоторая временная проблема с ssh, следовательно, та же самая (не особенно явная) ошибка paramiko.
Ответ 9
Я тоже получил такую же неприятную и бесполезную ошибку. Изучив и пробовав несколько вещей, я, наконец, исправил его на Ubuntu 10.04. Это то, что я сделал:
- После нахождения this, я использовал gconf-editor для установки /apps/gnome -keyring/daemon-components/ssh в false, чтобы отключить Интерфейс Gnome Keyring для SSH.
- Я удалил свой каталог ~/.ssh.
- Я перезагрузился.