关于 FTP 命令,非常困惑

2019-09-10 10:49:22 +08:00
 piaochen0

因为要使用 python 写一个 FTP 的客户端,使用的 ftplib 库
也看了一些底层的代码。大部分都是通过调用 FTP 命令来操作 FTP 服务端的。

不过在做的过程中,发现对 FTP 命令的方式操作有很大的疑问。
FTP 命令是不是分层的?
例如我要在远程服务器移动某个文件:
在网上搜索的答案如下:

在 FTP 客户端中:
rename /public_html/upload/64/SomeMusic.mp3 /public_html/archive/2011/05/64/SomeMusic.mp3

使用 FTP 命令:
RNFR /public_html/upload/64/SomeMusic.mp3
RNTO /public_html/archive/2011/05/64/SomeMusic.mp3

我在命令行中,使用 ftp ip 登录 ftp 服务器后,使用 rename 命令可以移动,不过 RNFR 和 RNTO 两个命令提示无此命令。
不过使用 rename 命令的时候,还是有输出使用的 RETO。

又如 python 改变文件权限的 python 代码:
_connection.sendcmd('SITE CHMOD %s %s' % (permission, os.path.basename(file_item)))

这行代码的意思应该是使用的 SITE CHMOD 命令来修改权限。
不过在 ftp 命令行里使用 help 命令查看命令列表,却没有 SITE 命令。但这段代码在 python 总是运行成功,复制到命令行中执行,却提示不支持 SITE 命令。

这个我就不是太能理解了。难道 FTP 命令分层的?FTP 命令行包装了一层。底层又运行了一层?还是我理解出了岔子?这个问题太让我困惑了。

PS: 我想在 ftp 服务端实现复制文件,使用什么命令?搜了好久了,都没成功的。

2076 次点击
所在节点    Python
2 条回复
sujin190
2019-09-10 11:14:35 +08:00
你把 ftp 协议和 ftp 命令混淆了吧
msg7086
2019-09-10 11:20:24 +08:00
FTP 软件里运行的不是 FTP 指令。
你要原始 FTP 指令要用 RAW 功能。

比如你用 lftp 客户端的话,改名是
mv a b
但是你要是打 FTP 指令的话,需要
quote RNFR a
quote RNTO b

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/599546

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX