如何使用pysftp / paramiko在python中启用键盘交互身份验证?

时间:2019-03-13 23:15:29

标签: python sftp paramiko pysftp

我能够通过sftp进入SERVER1和SERVER2(上面已指定)。我可以使用命令行将ftp传输到SERVER1和SERVER2中,没问题。

但是,当我尝试使用python 3.7(pysftp)连接到SERVER2时,我又回来了

  

调试:paramiko.transport:正在尝试密码验证...

     

调试:paramiko.transport:userauth正常

     

DEBUG:paramiko.transport:不允许使用身份验证类型(密码)。

     

调试:paramiko.transport:允许的方法:['publickey','keyboard-interactive']

     

调试:paramiko.transport:userauth正常

     

INFO:paramiko.transport:身份验证(键盘交互)失败。

我不想使用命令行和python中的某些ETL进程运行提取,而是希望将所有内容保留在一个程序中-最好是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 :(得分:0)

自1.5版以来,Paramiko将默认尝试键盘交互模式。文档(CodePen demo)状态:

  

从1.5开始,如果未传递任何事件且故障预置为True(默认值),则如果服务器不支持纯密码身份验证,但确实支持所谓的“键盘交互”模式,则将尝试进行身份验证使用此交互模式。

您会在输出中看到它实际上正在尝试键盘交互模式并失败:

  

INFO:paramiko.transport:身份验证(键盘交互)失败。

因此,我怀疑将用户名或密码传递给pysftp.Connection时出现问题。是用户名吗?您已经在###USER上将其设置为SERVER2