Я пытаюсь переместить файлы на 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.






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