Я пытаюсь подключиться к сайту SFTP в моем скрипте Python, используя pysftp
.
Так как у меня нет файла hostkey, я создал его как предложено здесь , "hostkey", и я пытаюсь загрузить этот файл, но pysftp
не не подключаться к сайту sftp.
Код python очень прост:
cnopts = pysftp.CnOpts()
cnopts.hostkeys.load(pathToTheFile)
with pysftp.Connection(host, username=username, private_key=pathToPKey, cnopts=cnopts) as sftp:
#do things
Сначала я попытался добавить в файл hostkey следующее:
host.com ssh-ed25519 256 AZFsh0........Qy0=
Но это приводит к InvalidHostKey
ошибка с ошибкой Incorrect padding
. Я предполагаю, что это не требует 256 для ключа. Итак, я удалил 256.
Когда я пытаюсь без 256:
host.com ssh-ed25519 256 AZFsh0........Qy0=
Затем он распознает ключ, но появляется ошибка 'utf-8' codec can't decode byte 0x90 in position 11: invalid start byte
.
Итак, вместо загрузки файла hostkey, я попытался добавить хост-ключ со следующими кодами, как предложено в здесь :
keydata = b"""AZFsh0........Qy0="""
key1 = paramiko.ed25519key.Ed25519Key(data=keydata)
key2 = paramiko.ed25519key.Ed25519Key(data=base64.b64decode(keydata))
key3 = paramiko.ed25519key.Ed25519Key(data=base64.b64decode(keydata).hex())
key4 = paramiko.ed25519key.Ed25519Key(data=decodebytes(keydata))
key5 = paramiko.ed25519key.Ed25519Key(data=decodebytes(keydata).hex())
cnopts.hostkeys.add("host.com", "ssh-ed25519", key1)
Я пытался со всеми вышеупомянутые ключи, но я все еще получаю ошибки как Incorrect padding
,
Я вижу, что кто-то упомянул, что это может быть ошибка , но сообщение от 2018. Кто-нибудь знает, если это не так выполнимо или я что-то упустил?
РЕДАКТИРОВАТЬ (Это сработало)
Решение опубликовано в Подключение к SFTP-серверу с использованием pysftp и Python 3 только с отпечатком пальца сервера , который был указан в ссылке в ответе Martin Prikryl .
Это то, что я использовал (я убрал некоторые, чтобы удалить неиспользуемые функции).
import hashlib as hl
#Removed trim_fingerprint() and clean_fingerprint() because it wasn't necessary in my case
class FingerprintKey:
def __init__(self, fingerprint):
self.fingerprint = fingerprint
def compare(self, other):
if callable(getattr(other, "get_fingerprint", None)):
return other.get_fingerprint() == self.fingerprint
elif other == self.get_fingerprint():
return True
elif hl.md5(other).hexdigest() == self.fingerprint:
return True
else:
return False
def __cmp__(self, other):
return self.compare(other)
def __contains__(self, other):
return self.compare(other)
def __eq__(self, other):
return self.compare(other)
def __ne__(self, other):
return not self.compare(other)
def get_fingerprint(self):
return self.fingerprint
def get_name(self):
return u'ssh-ed25519' # Including "256" errors out.
def asbytes(self):
return self
И это было использовано следующим образом:
cnopts = pysftp.CnOpts()
cnopts.hostkeys.add('host.com', u'ssh-ed25519 256', FingerprintKey("e2d1............c957")) # Removed ":" from the MD5 value
Главное, с чем я боролся, было то, что я не был уверен, какое значение следует включить для cnopts.hostkeys.add
, et c, поэтому я добавлю эти подробности на случай, если есть люди, которые плохо знакомы с этим.
В моем случае я использовал WinSCP, чтобы получить отпечаток ключа хоста.
- Открыть WinSCP
- Введите имя хоста, имя пользователя и укажите путь к закрытому ключу для подключения
- Нажмите Сеанс
- Нажмите Сервер / Информация протокола
- Использовать значение в алгоритме для второго параметра (
keytype
) cnopts.hostkeys.add
- Использовать значение в MD5 для третьего параметра (
key
) cnopts.hostkeys.add
. Фактическое значение дано для двоеточий (например, e2: d1: ...... c9: 57), но как автор Подключение к SFTP-серверу с использованием pysftp и Python 3 только с отпечатком пальца сервера упомянуто, я должен был также удалить толстые кишки вручную.