Вывести список файлов с поведением pyftp - proftpd и pyftpdlib

У меня есть тестовый код, который использует заглушку 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,

1 ответ

Решение

Я автор uftpd.

Я просто немного погуглил, оказалось, что DJB написал об этом некоторое время назад, и, к сожалению, кажется, что выходные данные отличаются между серверами.

Хотя моя интерпретация такова; Рекомендуется не ставить перед каждым выходным файлом в заданном каталоге имя каталога. Т.е., если клиент отправляет 'NLST dir', сервер не должен отвечать:

dir/a
dir/b

но вместо этого просто выведите файлы в каталог dir/ как это:

a
b
Другие вопросы по тегам