使用pyftp列出文件 - proftpd与pyftpdlib行为

Oz1*_*123 10 python ftp proftpd pyftpdlib

我有一个使用带有pyftpdlib的FTP存根的测试代码,令我惊讶的是在生产中失败了.原因是proftpd返回目录名以响应NLST.以下是pyftpdlibFTP存根的响应:

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']
Run Code Online (Sandbox Code Playgroud)

以下是来自的回复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', 
  ...]
Run Code Online (Sandbox Code Playgroud)

删除这些目录名称很容易:

    # 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]
Run Code Online (Sandbox Code Playgroud)

但我想了解这是否是pyftpdlib做错的事情?
这是可以配置的东西ProFTPD吗?
有关FTP协议和NLST命令需要了解的内容吗?

更新

我刚刚测试了另一个叫做uftpd它的ftp服务器,就像pyftpdlib发布一样NLST.

tro*_*bit 2

我是uftpd的作者。

我只是用 google 搜索了一下,发现DJB不久前写过有关此内容的文章,不幸的是,服务器之间的输出似乎有所不同。

但我的解释是;建议不要为定目录中的每个输出文件添加目录名前缀。即,如果客户端发送“NLST dir”,服务器不应回复

dir/a
dir/b
Run Code Online (Sandbox Code Playgroud)

但只是简单地输出目录中的文件,dir/如下所示:

a
b
Run Code Online (Sandbox Code Playgroud)