2017-10-08 10 views
0

Python 3.6.3を使用しています。PythonでftpディレクトリをリストするときにOSErrorを取得する

FTP_TLS経由でftplibを使用するようにFTPに接続しています。

ftps = ftplib.FTP_TLS('example.com', timeout=5) 

# TLS is more secure than SSL 
ftps.ssl_version = ssl.PROTOCOL_TLS 

# login before securing control channel 
ftps.login('[email protected]', 'password') 

# switch to secure data connection 
ftps.prot_p() 

# Explicitly set Passive mode 
ftps.set_pasv(True) 

これはすべて動作します。私はftps.mkd('mydir')(ディレクトリを作る)とftps.cwd('mydir')(作業ディレクトリを変更する)を送ることができ、両方とも正常に動作します。

しかし、私は(彼らは私の知る限り、すべての基本的同義語です)これらの任意のを送信する場合:

 ftps.dir() 
     ftps.nlst() 
     ftps.retrlines('LIST') 
     ftps.retrlines('MLSD') 

それから私はまた、すべてのftplibのデバッグ情報が含まれて(下のバック例外を取得よく、FileZillaが示しているものとよく一致します):

*cmd* 'AUTH TLS' 
*put* 'AUTH TLS\r\n' 
*get* '234 AUTH TLS OK.\n' 
*resp* '234 AUTH TLS OK.' 
*cmd* 'USER [email protected]' 
*put* 'USER [email protected]\r\n' 
*get* '331 User [email protected] OK. Password required\n' 
*resp* '331 User [email protected] OK. Password required' 
*cmd* 'PASS ******************************' 
*put* 'PASS ******************************\r\n' 
*get* '230 OK. Current restricted directory is /\n' 
*resp* '230 OK. Current restricted directory is /' 
*cmd* 'PBSZ 0' 
*put* 'PBSZ 0\r\n' 
*get* '200 PBSZ=0\n' 
*resp* '200 PBSZ=0' 
*cmd* 'PROT P' 
*put* 'PROT P\r\n' 
*get* '200 Data protection level set to "private"\n' 
*resp* '200 Data protection level set to "private"' 
*cmd* 'MKD mydir' 
*put* 'MKD mydir\r\n' 
*get* '257 "mydir" : The directory was successfully created\n' 
*resp* '257 "mydir" : The directory was successfully created' 
*cmd* 'CWD mydir' 
*put* 'CWD mydir\r\n' 
*get* '250 OK. Current directory is /mydir\n' 
*resp* '250 OK. Current directory is /mydir' 
*cmd* 'TYPE A' 
*put* 'TYPE A\r\n' 
*get* '200 TYPE is now ASCII\n' 
*resp* '200 TYPE is now ASCII' 
*cmd* 'PASV' 
*put* 'PASV\r\n' 
*get* '227 Entering Passive Mode (8,8,8,8,8,8)\n' 
*resp* '227 Entering Passive Mode (8,8,8,8,8,8)' 
*cmd* 'MLSD' 
*put* 'MLSD\r\n' 
*get* '150 Accepted data connection\n' 
*resp* '150 Accepted data connection' 
Traceback (most recent call last): 
    File "c:\my_script.py", line 384, in run_ftps 
    ftps.retrlines('MLSD') 
    File "c:\libs\Python36\lib\ftplib.py", line 485, in retrlines 
    conn.unwrap() 
    File "C:\libs\Python36\lib\ssl.py", line 1051, in unwrap 
    s = self._sslobj.unwrap() 
    File "C:\libs\Python36\lib\ssl.py", line 698, in unwrap 
    return self._sslobj.shutdown() 
OSError: [Errno 0] Error 

同じFTPコマンド(LIST)は、filezillaでうまく動作します。

私がグーグルで見つけた最も近いことは、https://bugs.python.org/msg253161です。関連性があるか関連性があるかどうかはわかりません。

ショートバージョン:「OSError:[Errno 0] Error」は実際には何を意味し、どのように私のディレクトリの内容を一覧表示しますか?

編集:この問題は、FTP_TLSでのみ発生するようです。普通のFTP接続でうまく動作しますが、FTP_TLSが必要です。

答えて

1
s = self._sslobj.unwrap() 
    File "E:\Software\_libs\Python36\lib\ssl.py", line 698, in unwrap 
    return self._sslobj.shutdown() 
OSError: [Errno 0] Error 

このエラーは、サーバーが適切なTLSシャットダウンを行わずにTCP接続を閉じるだけである場合に発生します。 OSError: [Errno 0]は、基礎となるTCPソケットで実際にエラーが全く発生しなかったことを意味します。つまり、サーバーはTCPソケットを正常にシャットダウンしました。ただし、サーバーはそれ以前に必要なTLSレベルのシャットダウンを実行しませんでした。

これは、私がサーバー実装のバグのように思っていますが、これはこれを引き起こす設定オプションかもしれません。そして、python ftplibは、このような不正なプロトコルの実装から他のクライアントに直面してもあまり寛容ではないようです。しかし、"Server did not properly shut down TLS connection"を検索することで、他のクライアントと同様のレポートを見つけることができます。

ftplib.py内のconn.unwrap()retrlinesretrbinaryに入れてtry ... except文に入れると、エラーが無視されることがあります。

関連する問題