Question

I am trying to use ftps to upload file to our FTP server. Login is trivial and works:

from M2Crypto import ftpslib
ftp = ftpslib.FTP_TLS()
ftp.connect(host)
ftp.login(username, password)

as well as descending into directory

for dir in directory:
    ftp.cwd(dir)

However, when trying to retrieve directory content:

if directory_name not in ftp.nlst():
    ftp.mkd(directory_name)

I get 522 error:

File "/usr/lib/python2.5/ftplib.py", line 459, in nlst
  self.retrlines(cmd, files.append)
File "/usr/lib/python2.5/ftplib.py", line 407, in retrlines
  conn = self.transfercmd(cmd)
File "/usr/lib/python2.5/ftplib.py", line 356, in transfercmd
  return self.ntransfercmd(cmd, rest)[0]
File "/var/lib/python-support/python2.5/M2Crypto/ftpslib.py", line 86, in ntransfercmd
  conn, size = FTP.ntransfercmd(self, cmd, rest)
File "/usr/lib/python2.5/ftplib.py", line 327, in ntransfercmd
  resp = self.sendcmd(cmd)
File "/usr/lib/python2.5/ftplib.py", line 241, in sendcmd
  return self.getresp()
File "/usr/lib/python2.5/ftplib.py", line 216, in getresp
  raise error_perm, resp
ftplib.error_perm: 522 Data connections must be encrypted.

It seems TLS is used only for handshake, not for transfers.

It there a way to secure the transfer (I'd like to upload files using storbinary()) using M2Crypto? If not, what are other alternatives?

Was it helpful?

Solution

Solution is to explicitly call for protected transfer after login():

ftp.prot_p()
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top