У меня есть тестовый код, который использует FTP-заглушку с pyftpdlib, что, к моему удивлению, не удалось в производстве. Причина этого в том, что proftpd возвращает имя каталога в ответ на NLST
. Вот ответ от pyftpdlib
FTP-заглушки:
In [10]: local_conn.login('user', '12345')
Out[10]: '230 Login successful.'
In [11]: import ftplib
In [12]: local_conn = ftplib.FTP()
In [13]: local_conn.connect('localhost', 2121)
Out[13]: '220 pyftpdlib 1.4.0 ready.'
In [14]: local_conn.login('user', '12345')
Out[14]: '230 Login successful.'
In [15]: local_conn.nlst('structuredata_advanced')
Out[15]:
['Report_20150618.csv',
'Report_20150618.fin',
'Report_20150619.csv',
'Report_20150619.fin',
'Report_20150620.csv',
'Report_20150620.fin']
Вот ответ от proftpd
:
In [16]: remote_conn = ftplib.FTP()
In [17]: remote_conn.connect('A1B.7Y.XX.XX', 21)
Out[17]: '220 ProFTPD 1.3.4a Server (vztd3.company.com) [A1B.7Y.XX.XX]'
In [18]: remote_conn.login('remoteuser', 'verysecret')
Out[18]: '230 User yougov logged in'
In [19]: remote_conn.nlst('structuredata_advanced')
Out[19]:
['structuredata_advanced/Report_20150624.csv',
'structuredata_advanced/Report_20150629.csv',
'structuredata_advanced/Report_20150625.fin',
'structuredata_advanced/Report_20150628.fin',
'structuredata_advanced/Report_20150627.fin',
'structuredata_advanced/Report_20150620.fin',
'structuredata_advanced/Report_20150619.csv',
...]
Легко удалить эти имена каталогов:
# this code works both in production and testing
files = conn.nlst(basedir)
# proftd is weired it returns the basedir name too
files = [f.split('/')[-1] for f in files]
но я хотел бы понять, если это то, что pyftpdlib делает неправильно?
Это что-то, что можно настроить в proftpd
?
Есть ли что-то, что мне нужно знать о протоколе FTP и команде NLST?
Обновление
Я только что протестировал другой ftp-сервер под названием uftpd
, он ведет себя как pyftpdlib
при выпуске NLST
.