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

标签 python ftp proftpd pyftpdlib

我有一个测试代码,它使用带有 pyftpdlib 的 FTP stub ,令我惊讶的是它在生产中失败了。这样做的原因是 proftpd 返回目录名称以响应 NLST。这是来自 pyftpdlib FTP stub 的响应:

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 协议(protocol)和 NLST 命令,我需要了解什么吗?

更新

我刚刚测试了另一个名为 uftpd 的 ftp 服务器它在发出 NLST 时表现得像 pyftpdlib

最佳答案

我是 uftpd 的作者.

我只是用谷歌搜索了一下,结果是 DJB wrote aboute this不久前,不幸的是,服务器之间的输出似乎不同。

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

dir/a
dir/b

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

a
b

关于python - 使用 pyftp 列出文件 - proftpd 与 pyftpdlib 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31291617/

相关文章:

python - 使用 Virtualenv、Circus 和 Chaussette 部署 Django

asp.net - 上传到 ftp asp.net

linux - 如何使用 cronolog 或rotatelogs 在 ProFTPd 中轮换日志

linux - proftpd sftp CentOS 权限被拒绝

python - 拟合模型时出现 ValueError

python - Django/Dajaxice 和国际字符的问题

html - FTP 到服务器后,index.html 无法从 CSS 读取

linux - 如何通过ftp部署nginx?

python - 使用 rdflib 时如何指定 HTTP 身份验证 header ?