Не удалось выполнить согласование при попытке подключения к SFTP-серверу с помощью Paramiko, но SFTP из командной строки работает правильно. Та же ошибка с js ssh2-sftp-client

Я пытаюсь переместить файлы на SFTP-сервер через порт 8001, используя код, а не только инструменты графического интерфейса и командной строки. FileZilla, sftp CLI в Windows и Linux работает нормально. Но почему-то код Python или код Java Script, который я пишу, не может подключиться.

paramiko — SSHException: согласование не удалось.

Когда я посмотрел файл known_hosts в Windows, сохраняющий открытый ключ хоста во время первоначального входа в систему с помощью FileZilla, я увидел, что создается ключ ecdsa-sha2-nistp384 и для хоста [xxx.xxxxxxx.com]:8001. Также существует ключ ssh-rsa для того же хоста.

Я пробовал различные способы устранения неполадок с переполнением стека. добавил ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

У меня нет доступа к SFTP-серверу. Они просто дали мне имя пользователя, пароль, хост и порт.

Должен ли я попросить их внести мой IP-адрес в белый список, как предложено здесь?
«Не удалось пройти аутентификацию с использованием имени пользователя и пароля» при попытке подключения по SFTP

Потому что это похоже на ситуацию, когда я могу подключиться к FileZilla и всем другим инструментам, но не с помощью кода или скрипта.

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

Код Парамико ==>

import paramiko
from paramiko import client, sftp_client

host = "xxx.xxxxxx.com"
port = 8001
user = "xxxx"
password = "xxxxxxxx"

class SFTP:
    sftp: sftp_client.SFTPClient
    ssh: client.SSHClient
    host: str
    user: str
    password: str

    def __init__(self, host: str, user: str, password: str):
        self.host = host
        self.user = user
        self.password = password

    def __enter__(self) -> sftp_client.SFTPClient:
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        
        ssh.connect(self.host,8001, username=self.user, password=self.password)
        self.ssh = ssh

        sftp = ssh.open_sftp()
        self.sftp = sftp
        return sftp

    def __exit__(self, exc, _, __) -> bool:
        if exc is None:
            self.sftp.close()
            self.ssh.close()
            return True

        raise exc

with SFTP(host, user, password) as sftp:
    print("Connected to SFTP")

Выход :

SSHException                              Traceback (most recent call last)
Cell In[5], line 1
----> 1 with SFTP(host, user, password) as sftp:
      2     print("Connected to SFTP")

Cell In[4], line 24, in SFTP.__enter__(self)
     22 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
     23 # print(ssh.load_host_keys().keys())
---> 24 ssh.connect(self.host,8001, username=self.user, password=self.password)
     25 self.ssh = ssh
     27 sftp = ssh.open_sftp()

File ~\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\paramiko\client.py:451, in SSHClient.connect(self, hostname, port, username, password, pkey, key_filename, timeout, allow_agent, look_for_keys, compress, sock, gss_auth, gss_kex, gss_deleg_creds, gss_host, banner_timeout, auth_timeout, channel_timeout, gss_trust_dns, passphrase, disabled_algorithms, transport_factory, auth_strategy)
    448     other_types = [x for x in sec_opts.key_types if x != keytype]
    449     sec_opts.key_types = [keytype] + other_types
--> 451 t.start_client(timeout=timeout)
    453 # If GSS-API Key Exchange is performed we are not required to check the
    454 # host key, because the host is authenticated via GSS-API / SSPI as
    455 # well as our client.
    456 if not self._transport.gss_kex_used:

File ~\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\paramiko\transport.py:723, in Transport.start_client(self, event, timeout)
    721     if e is not None:
    722         raise e
...
    725     timeout is not None and time.time() >= max_time
    726 ):
    727     break

SSHException: Negotiation failed.

Я попробовал код pysftp из
Соединение Paramiko/pysftp завершается с ошибкой «Ошибка согласования/недопустимое значение DH», однако графический интерфейс пользователя и sftp подключаются

Чтобы получить то же самое согласование с выводом журнала pysftp.CnOpts, как

DEB [20230914-09:57:50.277] thr=1   paramiko.transport: starting thread (client mode): 0x10143f70
DEB [20230914-09:57:50.281] thr=1   paramiko.transport: Local version/idstring: SSH-2.0-paramiko_3.3.1
DEB [20230914-09:57:50.290] thr=1   paramiko.transport: Remote version/idstring: SSH-2.0-8.43 FlowSsh: Bitvise SSH Server (WinSSHD) 8.43
INF [20230914-09:57:50.290] thr=1   paramiko.transport: Connected (version 2.0, client 8.43)
INF [20230914-09:57:50.293] thr=1   paramiko.transport: Disconnect (code 11): Client software or version not permitted.
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это приходит с сервера:

Клиентское программное обеспечение или его версия не разрешены

Мы не можем вам в этом помочь. Вам необходимо попросить администратора сервера разрешить вашему клиенту (Парамико).

Вы, конечно, можете подделать другую «строку версии», используя Transport.local_version (по умолчанию SSH-2.0-paramiko_<version>).

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