使用 pyftp 列出文件 - proftpd 与 pyftpdlib 行为
List files with pyftp - proftpd vs. pyftpdlib behavior
我有一个测试代码,它使用带有 pyftpdlib 的 FTP 存根,令我惊讶的是它在生产中失败了。原因是proftpd returns响应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 命令,我需要了解什么吗?
更新
我刚刚测试了另一个名为 uftpd
的 ftp 服务器,它在发出 NLST
时表现得像 pyftpdlib
。
我是 uftpd 的作者。
我只是用谷歌搜索了一下,结果 DJB wrote aboute this 不久前,不幸的是服务器之间的输出似乎不同。
不过我的解释是;建议 不要 在给定目录中的每个输出文件前加上目录名。即,如果客户端发送 'NLST dir' 服务器应该 而不是 回复:
dir/a
dir/b
而是简单地输出目录 dir/
中的文件,如下所示:
a
b
我有一个测试代码,它使用带有 pyftpdlib 的 FTP 存根,令我惊讶的是它在生产中失败了。原因是proftpd returns响应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 命令,我需要了解什么吗?
更新
我刚刚测试了另一个名为 uftpd
的 ftp 服务器,它在发出 NLST
时表现得像 pyftpdlib
。
我是 uftpd 的作者。
我只是用谷歌搜索了一下,结果 DJB wrote aboute this 不久前,不幸的是服务器之间的输出似乎不同。
不过我的解释是;建议 不要 在给定目录中的每个输出文件前加上目录名。即,如果客户端发送 'NLST dir' 服务器应该 而不是 回复:
dir/a
dir/b
而是简单地输出目录 dir/
中的文件,如下所示:
a
b