Paramiko AuthenticationException проблема

У меня проблема с подключением к устройству через ssh-клиент Paramiko (версия 1.7.6-2):

$ python
Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import paramiko
>>> ssh = paramiko.SSHClient()
>>> ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
>>> ssh.connect("123.0.0.1", username="root", password=None)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/pymodules/python2.6/paramiko/client.py", line 327, in connect
    self._auth(username, password, pkey, key_filenames, allow_agent, look_for_keys)
  File "/usr/lib/pymodules/python2.6/paramiko/client.py", line 481, in _auth
    raise saved_exception
paramiko.AuthenticationException: Authentication failed.
>>> 

Когда я использую ssh из командной строки, он работает нормально:

ssh root@123.0.0.1


BusyBox v1.12.1 (2010-11-03 13:18:46 EDT) built-in shell (ash)
Enter 'help' for a list of built-in commands.

# 

Кто-нибудь видел это раньше?

Редактировать 1

Вот подробный вывод команды ssh:

:~$ ssh -v root@123.0.0.1
OpenSSH_5.3p1 Debian-3ubuntu4, OpenSSL 0.9.8k 25 Mar 2009
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Applying options for *
debug1: Connecting to 123.0.0.1 [123.0.0.1] port 22.
debug1: Connection established.
debug1: identity file /home/waffleman/.ssh/identity type -1
debug1: identity file /home/waffleman/.ssh/id_rsa type -1
debug1: identity file /home/waffleman/.ssh/id_dsa type -1
debug1: Remote protocol version 2.0, remote software version OpenSSH_5.1
debug1: match: OpenSSH_5.1 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.3p1 Debian-3ubuntu4
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5 none
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
debug1: Host '123.0.0.1' is known and matches the RSA host key.
debug1: Found key in /home/waffleman/.ssh/known_hosts:3
debug1: ssh_rsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentication succeeded (none).
debug1: channel 0: new [client-session]
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
debug1: Sending environment.
debug1: Sending env LANG = en_US.utf8

Edit 2 Вот вывод Python с выводом отладки:

Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import paramiko, os
>>> paramiko.common.logging.basicConfig(level=paramiko.common.DEBUG)
>>> ssh = paramiko.SSHClient()
>>> ssh.load_system_host_keys()
>>> ssh.load_host_keys(os.path.expanduser('~/.ssh/known_hosts'))
>>> ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
>>> ssh.connect("123.0.0.1", username='root', password=None)
DEBUG:paramiko.transport:starting thread (client mode): 0x928756cL
INFO:paramiko.transport:Connected (version 2.0, client OpenSSH_5.1)
DEBUG:paramiko.transport:kex algos:['diffie-hellman-group-exchange-sha256', 'diffie-hellman-group-exchange-sha1', 'diffie-hellman-group14-sha1', 'diffie-hellman-group1-sha1'] server key:['ssh-rsa', 'ssh-dss'] client encrypt:['aes128-cbc', '3des-cbc', 'blowfish-cbc', 'cast128-cbc', 'arcfour128', 'arcfour256', 'arcfour', 'aes192-cbc', 'aes256-cbc', 'rijndael-cbc@lysator.liu.se', 'aes128-ctr', 'aes192-ctr', 'aes256-ctr'] server encrypt:['aes128-cbc', '3des-cbc', 'blowfish-cbc', 'cast128-cbc', 'arcfour128', 'arcfour256', 'arcfour', 'aes192-cbc', 'aes256-cbc', 'rijndael-cbc@lysator.liu.se', 'aes128-ctr', 'aes192-ctr', 'aes256-ctr'] client mac:['hmac-md5', 'hmac-sha1', 'umac-64@openssh.com', 'hmac-ripemd160', 'hmac-ripemd160@openssh.com', 'hmac-sha1-96', 'hmac-md5-96'] server mac:['hmac-md5', 'hmac-sha1', 'umac-64@openssh.com', 'hmac-ripemd160', 'hmac-ripemd160@openssh.com', 'hmac-sha1-96', 'hmac-md5-96'] client compress:['none', 'zlib@openssh.com'] server compress:['none', 'zlib@openssh.com'] client lang:[''] server lang:[''] kex follows?False
DEBUG:paramiko.transport:Ciphers agreed: local=aes128-ctr, remote=aes128-ctr
DEBUG:paramiko.transport:using kex diffie-hellman-group1-sha1; server key type ssh-rsa; cipher: local aes128-ctr, remote aes128-ctr; mac: local hmac-sha1, remote hmac-sha1; compression: local none, remote none
DEBUG:paramiko.transport:Switch to new keys ...
DEBUG:paramiko.transport:Trying discovered key b945197b1de1207d9aa0663f01888c3c in /home/waffleman/.ssh/id_rsa
DEBUG:paramiko.transport:userauth is OK
INFO:paramiko.transport:Authentication (publickey) failed.
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/pymodules/python2.6/paramiko/client.py", line 327, in connect
    self._auth(username, password, pkey, key_filenames, allow_agent, look_for_keys)
  File "/usr/lib/pymodules/python2.6/paramiko/client.py", line 481, in _auth
    raise saved_exception
paramiko.AuthenticationException: Authentication failed.
>>> 

12 ответов

Решение

Сервер ssh на удаленном устройстве отклонил вашу аутентификацию. Убедитесь, что вы используете правильный ключ, и устройство не имеет никаких других ограничений доступа. Трудно сказать, что происходит без логов с сервера.

[РЕДАКТИРОВАТЬ] Я только что посмотрел ваш вывод, вы аутентифицируете, используя None аутентификация. Обычно это никогда не разрешается и используется для определения того, какие методы авторизации разрешены сервером. Возможно, ваш сервер использует аутентификацию на основе хоста (или ее вообще нет).

поскольку auth_none() редко используется, это не доступно из SSHClient класс, так что вам нужно будет использовать Transport непосредственно.

transport.auth_none('root') 

Это действительно старая и удаленная проблема, но я только что получил ту же ошибку, и я думаю, что будет полезно перечислить следующую информацию:

  1. Я использую paramiko 2.9.1 и python>=3.6, убедитесь, что ваш paramiko>=2.9.0
  2. команда ssh <hostname>работает отлично
  3. Код ниже получает ошибку: AuthenticationException: Authentication failed.
      import paramiko
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
session = client.connect("<hostname>")

Отсюда https://github.com/paramiko/paramiko/issues/1984 , я знаю, что это ошибка, связанная с алгоритмами аутентификации.

Вам нужно будет добавить disabled_algorithmsparam в connect(), см. документацию здесь: https://www.paramiko.org/changelog.html#2.9.0

Но в журнале изменений 2.9.0 есть опечатка для disabled_algorithms, должно быть так:

      client.connect("<hostname>", disabled_algorithms={'pubkeys': ['rsa-sha2-256', 'rsa-sha2-512']})

вместо:

      client.connect("<hostname>", disabled_algorithms={'keys': ['rsa-sha2-256', 'rsa-sha2-512']})

Наконец, все идет хорошо.

P.s. только что вылезла ошибка Unable to agree on a pubkey algorithm for signing a 'ssh-rsa' key!для других хостов лучше понизить paramiko ниже 2.9.0.

В качестве очень позднего продолжения этого вопроса я считаю, что столкнулся с той же проблемой, что и вафля, в контексте ограниченной сети.

Подсказка об использовании auth_none на Transport Объект оказался весьма полезным, но я немного озадачился тем, как это реализовать. Дело в том, что по крайней мере сегодня я не могу получить Transport объект SSHClient объект, пока он не соединился; но это не будет подключаться в первую очередь...

Так что в случае, если это полезно для других, моя работа вокруг ниже. Я просто переопределить _auth метод.

Хорошо, это хрупкая, как _auth это личная вещь. Мои другие альтернативы были - на самом деле все еще есть - вручную создать Transport а также Channel объекты, но в настоящее время я чувствую, что мне намного лучше со всем этим все еще под капотом.

from paramiko import SSHClient

class SSHClient_noauth(SSHClient):

    def _auth(self, username, *args):
        self._transport.auth_none(username)
        return

Убедитесь, что права доступа к файлам открытого и закрытого ключей (и, возможно, содержащей их папки) установлены очень ограниченно (например, chmod 600 id_rsa). Оказывается, это требуется (операционная система?), Чтобы использовать файлы в качестве ключей SSH. Об этом узнал мой полезный коллега:) Также убедитесь, что вы используете правильное имя пользователя для данного ключа SSH.

На стороне сервера могут быть разные причины (sshd, к которому вы подключаетесь), поэтому отладка на стороне клиента может быть затруднена.

Например, tail -f /var/log/secure:

9 октября 15:50:26 pc1udatahgw04 sshd[27501]: Отказ в аутентификации: неправильное владение или режимы для каталога / home / testuser

Если вы бежите ls -lad /home/testuser чтобы увидеть разрешения, вы увидите, например, в нашем случае:

$ ls -lad /home/testuser
drwxrwxr-x 16 testuser  testgroup 57344 Oct  9 15:23 /home/testuser

Обратите внимание на второе w немного. Домашний каталог был открыт для групповой записи. sshd в этом случае отказывается от аутентификации на основе ключа.

Снова проверьте журнал sshd на стороне сервера. Могут быть и другие проблемы, такие как уже упоминавшиеся

  • /home/user/.ssh каталог слишком открыт
  • /home/user/.ssh/id_rsa файл слишком открыт
  • /home/user/.ssh/id_rsa.pub файл слишком открыт
  • /home/user/.ssh/id_ecdsa файл слишком открыт
  • /home/user/.ssh/id_ecdsa.pub файл слишком открыт

так далее..

Я получил эту ошибку:

paramiko.ssh_Exception.AuthenticationException: аутентификация не удалась: транспорт отключен или обнаружен EOF

но решите, когда я добавлю этот параметр Look_for_keys=False

ssh.connect(hostname='hostname',port=port,username='user',password='password',look_for_keys=False)

вам может потребоваться проверить сервер входа в систему, попробуйте выполнить tail -f /var/log/auth.logтогда вы можете найти причину, по которой сервер отказывается от вашего соединения. Если сервер показывает так userauth_pubkey: unsupported public key algorithm: rsa-sha2-512 [preauth], то можно добавить transport.server_extensions = {'server-sig-algs': 'ssh-rsa'}после инициализации вашего транспорта

Я получаю похожую ошибку, когда сервер использует аутентификацию AD. Я думаю, что это ошибка Paramiko. Я узнал, что я должен установить ключи SSH перед использованием Paramiko.

SSHClient Парамико имеет load_system_host_keys метод, который вы можете использовать для загрузки пользовательского набора ключей. Как показано в примере из документации, его необходимо запустить перед подключением к серверу.

Установка venv также создает глобальные файлы

Установка paramiko в venv устанавливает файлы как в venv, так и в глобальном окружении. Использование paramiko только в этом venv, похоже, не работает.

В codium/vscode находиться в папке не имеющей доступа к venv и потом использовать paramiko в базовом окружении. Если вы удалите его из venv, базовая среда больше не будет запускать paramiko.

Из всего этого кажется, что лучше всего установить paramiko только в базовой среде, чтобы она была доступна и для любого venv.

Подробности

установка в venv также приводит к глобальным файлам

В моем случае эта ошибка появлялась только тогда, когда я находился в виртуальной среде (venv) или когда я находился в папке, которая также содержала venv, но с активированным интерпретатором Python базовой среды:

      >>> ssh.connect(host, port=port, username=user, key_filename=key_filepath)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/MY_USER/Documents/MY_PROJECT/MY_VENV/lib/python3.8/site-packages/paramiko/client.py", line 435, in connect
    self._auth(
  File "/home/MY_USER/Documents/MY_PROJECT/MY_VENV/lib/python3.8/site-packages/paramiko/client.py", line 766, in _auth
    raise saved_exception
  File "/home/MY_USER/Documents/MY_PROJECT/MY_VENV/lib/python3.8/site-packages/paramiko/client.py", line 742, in _auth
    self._transport.auth_publickey(username, key)
  File "/home/MY_USER/Documents/MY_PROJECT/MY_VENV/lib/python3.8/site-packages/paramiko/transport.py", line 1634, in auth_publickey
    return self.auth_handler.wait_for_response(my_event)
  File "/home/MY_USER/Documents/MY_PROJECT/MY_VENV/lib/python3.8/site-packages/paramiko/auth_handler.py", line 258, in wait_for_response
    raise e
paramiko.ssh_exception.AuthenticationException: Authentication failed.

Приведенный ниже сценарий работал только тогда, когда я загружал любую папку в качестве папки проекта в своем редакторе кода, в которой не было venv с установленным Paramiko.

      from os import getenv
import paramiko
from dotenv import load_dotenv

load_dotenv(MY_FULL_PATH, override=True)

ssh = paramiko.SSHClient()
# ssh.load_host_keys(os.path.expanduser('~/.ssh/known_hosts'))
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
host = getenv("MY_HOST")
port = getenv("MY_PORT")
user = getenv("MY_USER")
key_filepath = getenv("MY_SSH_KEY_FILEPATH")
ssh.connect(host, port=port, username=user, key_filename=key_filepath)
sftp = ssh.open_sftp()
sftp.put(MY_FILEPATH1, MY_FILEPATH2)

Как только в папке проекта появляется venv с установленным Paramiko, Paramiko, кажется, использует venv по умолчанию, и эта ошибка появляется, даже если вместо этого вы выбираете базовую среду в качестве интерпретатора .

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

удалить из базовой среды

Когда я попытался удалить его из базовой среды, он не нашел никаких файлов:

      pip3 uninstall paramiko
Found existing installation: paramiko 2.6.0
Not uninstalling paramiko at /usr/lib/python3/dist-packages, outside environment /usr
Can't uninstall 'paramiko'. No files were found to uninstall.

Тем не менее, я нахожу это в при поиске . И он у меня тоже есть в двух венвах. Я предполагаю, что Paramiko не может справиться с установкой в ​​venv, поскольку он по-прежнему успешно используется, когда вы не находитесь в venv. Если вы находитесь в папке с доступом к venv, в котором он действительно установлен, он не будет работать, если вы не удалите его снова (проверено). venv, который вызывает ошибки, является совершенно новой установкой, потому что у меня были проблемы с установкой Paramiko в другой существующий venv. Решение состояло в том, чтобы удалить его из venv, тогда я могу использовать venv и получить Paramiko из глобальной установки, вероятно, потому, что в глобальной установке доминирует установка venv, которая затем снова ошибочно переплетается с глобальной установкой.

удалить из venv

Когда я удалил его из venv, paramiko больше не был найден в базовой среде.

Я также вижу, что использование Paramiko в venv требует некоторых дополнительных шагов, если вы хотите запустить команду в venv, возможно, это объясняет, что Paramiko обычно является глобальной установкой? См. Настройка virtualenv с помощью Paramiko SSH.

Любые дополнительные идеи приветствуются.

Помните, что RSA устарел в Ubuntu 22.04. вам следует изменить свой алгоритм на id_ed25519. Тогда, вероятно, вам нужно очистить список известных_хостов и еще раз скопировать открытый ключ на удаленный сервер.

Я попытался удалить папку ~./ Ssh, тогда она работает хорошо

Другие вопросы по тегам