[英]Cannot list FTP directory using ftplib – but FTP client works
[英]Python FTP cannot connect, but using client like FileZilla with same credentials works
我正在嘗試使用ftplib
連接到 FTP 服務器以下載一組文件。 當我嘗試創建連接時,我不斷收到530 User cannot log in
錯誤(即使使用相同的憑據成功地使用 FileZilla 登錄)。
代碼:
from ftplib import FTP_TLS
import pandas
ftp = FTP_TLS(host="ftp._____.com", user="____", passwd="____")
ftp.login(user="______", passwd="______")
ftp.cwd("DIR/")
ftp.dir()
錯誤日志:
*cmd* 'USER ********'
*put* 'USER ********\r\n'
*get* '331 Password required\n'
*resp* '331 Password required'
*cmd* 'PASS ********'
*put* 'PASS ********\r\n'
*get* '230 User logged in.\n'
*resp* '230 User logged in.'
*cmd* 'CWD ______/'
*put* 'CWD ______/\r\n'
*get* '250 CWD command successful.\n'
*resp* '250 CWD command successful.'
*cmd* 'TYPE A'
*put* 'TYPE A\r\n'
*get* '200 Type set to A.\n'
*resp* '200 Type set to A.'
*cmd* 'PASV'
*put* 'PASV\r\n'
*get* '227 Entering Passive Mode (13,64,237,64,19,157).\n'
*resp* '227 Entering Passive Mode (13,64,237,64,19,157).'
*cmd* 'LIST'
*put* 'LIST\r\n'
*get* '534 Policy requires SSL.\n'
*resp* '534 Policy requires SSL.'
Traceback (most recent call last):
File "xb_shipped.py", line 20, in <module>
ftp.dir()
File "C:\Users\main\AppData\Local\Programs\Python\Python38-32\lib\ftplib.py", line 558, in dir
self.retrlines(cmd, func)
File "C:\Users\main\AppData\Local\Programs\Python\Python38-32\lib\ftplib.py", line 451, in retrlines
with self.transfercmd(cmd) as conn, \
File "C:\Users\main\AppData\Local\Programs\Python\Python38-32\lib\ftplib.py", line 382, in transfercmd
return self.ntransfercmd(cmd, rest)[0]
File "C:\Users\main\AppData\Local\Programs\Python\Python38-32\lib\ftplib.py", line 781, in ntransfercmd
conn, size = FTP.ntransfercmd(self, cmd, rest)
File "C:\Users\main\AppData\Local\Programs\Python\Python38-32\lib\ftplib.py", line 348, in ntransfercmd
resp = self.sendcmd(cmd)
File "C:\Users\main\AppData\Local\Programs\Python\Python38-32\lib\ftplib.py", line 275, in sendcmd
return self.getresp()
File "C:\Users\main\AppData\Local\Programs\Python\Python38-32\lib\ftplib.py", line 248, in getresp
raise error_perm(resp)
ftplib.error_perm: 534 Policy requires SSL.
我也嘗試使用這里找到的解決方案: https : //stackoverflow.com/questions/55814722/cannot-list-ftp-directory-using-ftplib-but-ftp-client-works/55874794#55874794
但是由於未使用 SSL,此解決方案給了我一個錯誤:
代碼:
from ftplib import FTP_TLS
import pandas
class SmartFTP(FTP_TLS):
def makepasv(self):
invalidhost, port = super(SmartFTP, self).makepasv()
return self.host, port
ftp_server = 'ftp.____.com'
ftp = SmartFTP(ftp_server)
ftp.login(user="____", passwd="____")
ftp.cwd("DIR/")
ftp.dir()
錯誤:
*cmd* 'AUTH TLS'
*put* 'AUTH TLS\r\n'
*get* '234 AUTH command ok. Expecting TLS Negotiation.\n'
*resp* '234 AUTH command ok. Expecting TLS Negotiation.'
*cmd* 'USER ********'
*put* 'USER ********\r\n'
*get* '331 Password required\n'
*resp* '331 Password required'
*cmd* 'PASS ********'
*put* 'PASS ********\r\n'
*get* '230 User logged in.\n'
*resp* '230 User logged in.'
*cmd* 'CWD ______/'
*put* 'CWD ______/\r\n'
*get* '250 CWD command successful.\n'
*resp* '250 CWD command successful.'
*cmd* 'TYPE A'
*put* 'TYPE A\r\n'
*get* '200 Type set to A.\n'
*resp* '200 Type set to A.'
*cmd* 'PASV'
*put* 'PASV\r\n'
*get* '227 Entering Passive Mode (13,64,237,64,19,176).\n'
*resp* '227 Entering Passive Mode (13,64,237,64,19,176).'
*cmd* 'LIST'
*put* 'LIST\r\n'
*get* '534 Policy requires SSL.\n'
*resp* '534 Policy requires SSL.'
Traceback (most recent call last):
File "xb_shipped.py", line 20, in <module>
ftp.dir()
File "C:\Users\main\AppData\Local\Programs\Python\Python38-32\lib\ftplib.py", line 558, in dir
self.retrlines(cmd, func)
File "C:\Users\main\AppData\Local\Programs\Python\Python38-32\lib\ftplib.py", line 451, in retrlines
with self.transfercmd(cmd) as conn, \
File "C:\Users\main\AppData\Local\Programs\Python\Python38-32\lib\ftplib.py", line 382, in transfercmd
return self.ntransfercmd(cmd, rest)[0]
File "C:\Users\main\AppData\Local\Programs\Python\Python38-32\lib\ftplib.py", line 781, in ntransfercmd
conn, size = FTP.ntransfercmd(self, cmd, rest)
File "C:\Users\main\AppData\Local\Programs\Python\Python38-32\lib\ftplib.py", line 348, in ntransfercmd
resp = self.sendcmd(cmd)
File "C:\Users\main\AppData\Local\Programs\Python\Python38-32\lib\ftplib.py", line 275, in sendcmd
return self.getresp()
File "C:\Users\main\AppData\Local\Programs\Python\Python38-32\lib\ftplib.py", line 248, in getresp
raise error_perm(resp)
ftplib.error_perm: 534 Policy requires SSL.
FileZilla 日志:
Status: Resolving address of ftp.xbfulfillment.com
Status: Connecting to 13.64.237.64:21...
Status: Connection established, waiting for welcome message...
Response: 220 Microsoft FTP Service
Command: AUTH TLS
Response: 234 AUTH command ok. Expecting TLS Negotiation.
Status: Initializing TLS...
Status: Verifying certificate...
Status: TLS connection established.
Command: USER ********
Response: 331 Password required
Command: PASS ********
Response: 230 User logged in.
Command: SYST
Response: 215 Windows_NT
Command: FEAT
Response: 211-Extended features supported:
Response: LANG EN*
Response: UTF8
Response: AUTH TLS;TLS-C;SSL;TLS-P;
Response: PBSZ
Response: PROT C;P;
Response: CCC
Response: HOST
Response: SIZE
Response: MDTM
Response: REST STREAM
Response: 211 END
Command: OPTS UTF8 ON
Response: 200 OPTS UTF8 command successful - UTF8 encoding now ON.
Command: PBSZ 0
Response: 200 PBSZ command successful.
Command: PROT P
Response: 200 PROT command successful.
Status: Logged in
Status: Retrieving directory listing of "/"...
Command: CWD /
Response: 250 CWD command successful.
Command: PWD
Response: 257 "/" is current directory.
Command: TYPE I
Response: 200 Type set to I.
Command: PASV
Response: 227 Entering Passive Mode (13,64,237,64,19,146).
Command: LIST
Response: 150 Opening BINARY mode data connection.
Response: 226 Transfer complete.
Status: Calculating timezone offset of server...
Command: MDTM 021220 merch pag 2.csv
Response: 213 20201202203930
Status: Timezone offset of server is -25200 seconds.
Status: Directory listing of "/" successful
您必須調用FTP_TLS.prot_p
以在數據通道上啟用 TLS/SSL 加密:
ftp = FTP_TLS(ftp_server)
ftp.login(user=...user, passwd=passwd)
ftp.prot_p()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.