簡體   English   中英

Python FTP 無法連接,但使用具有相同憑據的 FileZilla 等客戶端工作

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM