Как включить клавиатурно-интерактивную аутентификацию в python с помощью pysftp / paramiko? - PullRequest
0 голосов
/ 14 марта 2019

Я могу использовать оба сервера SERVER1 и SERVER2 (указано выше). Я могу использовать командную строку для sftp в SERVER1 и SERVER2, без проблем.

Однако, когда я пытаюсь использовать python 3.7 (pysftp) для подключения к SERVER2, я возвращаюсь

ОТЛАДКА: paramiko.transport: Попытка аутентификации пароля ...

ОТЛАДКА: paramiko.transport: пользователь в порядке

ОТЛАДКА: paramiko.transport: тип аутентификации (пароль) не разрешен.

DEBUG: paramiko.transport: Разрешенные методы: ['publickey', 'клавиатура-интерактив']

ОТЛАДКА: paramiko.transport: пользователь в порядке

ИНФОРМАЦИЯ: paramiko.transport: Ошибка аутентификации (клавиатурно-интерактивная).

Вместо того, чтобы запускать извлечение с помощью командной строки и некоторых ETL-процессов на python, я хотел бы хранить все в одной программе - предпочтительно на python 3.7 и не использовать никаких открытых / закрытых ключей.

Какие-нибудь советы, чтобы paramiko / pysftp запускал интерактивную клавиатуру?

import pysftp
import getpass


question = input ("Do you want to: A) Connect to SERVER1  B) Connect to SERVER2. [A/B]? : ")
# Decide whether SERVER 1 or SERVER 2
if question == "A":
    hostname="SERVER1"
    username='TESTUSER'
elif question == "B": # STILL CANNOT FIGURE OUT HOW TO PROPERLY CONNECT TO SIS SFTP
    hostname="SERVER2"
    username='###USER'
else:
    print("Not permitted")

# Get security clearances, don't want to hardcode any passwords right now
tkpass = getpass.getpass("Password:")

# DEBUGGER HERE
import sys
import logging

logging.basicConfig(stream=sys.stderr, level=logging.DEBUG)

# Make the connection to the server
srv = pysftp.Connection(host=hostname, username=username,
password=tkpass)
# Get the directory and file listing
data = srv.listdir()

# Closes the connection
srv.close()

# Prints out the directories and files, line by line
for i in data:
    print(i)

1 Ответ

0 голосов
/ 14 марта 2019

Paramiko, начиная с версии 1.5, будет по умолчанию использовать интерактивный режим клавиатуры. Документация (http://docs.paramiko.org/en/2.4/api/transport.html#paramiko.transport.Transport.connect) состояния:

Начиная с версии 1.5, если событие не передается и резервное значение равно True (по умолчанию), если сервер не поддерживает аутентификацию по простому паролю, но поддерживает так называемый «клавиатурно-интерактивный» режим, будет предпринята попытка аутентификации. используя этот интерактивный режим.

Вы можете увидеть в выводе, что он фактически пытается в интерактивном режиме с клавиатурой и терпит неудачу:

ИНФОРМАЦИЯ: paramiko.transport: Ошибка аутентификации (клавиатурно-интерактивная).

Так что я подозреваю, что есть проблема с именем пользователя или паролем, передаваемым в pysftp.Connection. Это имя пользователя? Вы получили это значение ###USER на SERVER2.

...