我目前不得不使用功能非常有限的 FTP 客户端/适配器将一些文件上传到远程服务器。我说功能有限,是因为生成的文件最终以权限 000 上传到远程服务器,而且似乎没有办法配置权限,这与其他一些客户端不同。(我知道 WinSCP 可以做到这一点。)
一位同事告诉我,FTP 完全不关心文件权限,只是传输文件数据。假设这是正确的,那么 WinSCP 等客户端如何设置远程服务器上文件的权限?有人告诉我,客户端很可能通过 SSH 执行 chmod,即事后设置权限。
答案1
你的同事说得对,1985 年 10 月的RFC 959似乎没有提供专门用于权限更改的命令。RFC 959 确实提供了用于上传文件的命令规范(RFC 959 第 30 页有“STOR”命令来存储文件)、下载文件(第 30 页有“RETR”命令来检索文件),以及可选扩展,如 MKD(创建目录)和 RMD(删除目录)。RFC 指出,“调用访问”控制是服务器 FTP 进程的特权。(但是,从我对 RFC 的阅读来看,我认为所提到的“访问控制”更多的是支持使用用户名登录的能力,而不是指使用 FTP 更改文件权限的想法。)
RFC 959 第 47 页包含 RFC 959 FTP 规范中内置的命令列表。有一段时间,我一直在考虑为特定平台制作 FTP 服务器,我读过每个命令。我还浏览过IANA“FTP 命令和扩展”注册表,这是 2010 年 3 月提到的RFC 5797我不记得有任何命令提供了更改权限的方法,除了一个:
RFC 959 第 33 页有“SITE”命令。(某些 FTP 客户端有一个名为“QUOT”或“quote”的本地命令,最终会向 FTP 服务器发送 SITE 命令。)基本上,SITE 命令的标准是将文本发送到 FTP 服务器,然后 FTP 服务器决定如何处理它。使用此命令可以执行诸如更改文件权限、在站点中搜索文件或重新启动 FTP 服务器等操作。理论上,发送命令“HELP SITE”将显示通过 site 命令提供的某些功能的详细信息。RFC 959 第 33 页甚至指定了这一点:
“这些服务的性质及其语法规范可以在对 HELP SITE 命令
的回复中说明。”
这个理论的挑战在于“HELP SITE”命令实际上会导致显示来自 FTP 服务器的文本,而不完整的文档可能实际上并没有记录所有可用的可能性。
基于Jonathan Leffler 对 knoti99 关于“FTP 中的 chmod 语法”的问题的回答,我们可以看到经典的“ncftp”程序确实使用“SITE CHMOD”命令来实现ncftp的“chmod”命令,并且该功能并不是所有的FTP服务器都支持。
在完成本回答的 FTP 部分时,我还有一点补充说明:FTP 很容易被嗅探。基本上,我的意思是 FTP 使用“明文”执行操作。如果您使用“数据包嗅探”(“数据包捕获”)软件,如 tcpdump 或 Wireshark,您可以看到 FTP 发生了什么。如果您尝试传输一个小文本文件,并查看发生了什么网络流量,结果可能非常容易理解。使用这种方法,您可以更改权限并查看软件实际使用的命令。我知道设置起来可能有点耗时,这就是为什么这个答案提供了许多更容易获得的详细信息,但是如果您开始想知道 FTP 通信期间发生的任何其他细节,了解这个过程可能会有所帮助。
(我已编辑此答案以添加对问题另一部分的答复。)
有人向我建议,客户端可能通过 SSH 执行 chmod,即事后设置权限。
我认为这是一个很好的猜测,尽管我认为在 FTP 方面这并不准确。实际上,这个猜测可能准确地描述了使用 SFTP 和 SCP 协议时所使用的确切过程。由于这两种协议都基于 SSH,因此可以使用与其余加密连接相同的 SSH 连接发送“chmod”命令。从我对这些协议的阅读来看,我确实相信这实际上正是使用 SFTP(和 SCP,如果它也支持设置文件权限)时通常设置文件权限的方式。
但是,正如我之前所述,使用 FTP 协议处理这种情况的方式则完全不同。如果您使用的是纯文本的 FTP 协议,那么从技术上讲,使用 SSH 进行跟进是可行的,但可能性不大。(如果软件足以支持 SSH,那么它通常也支持 SFTP 或 SCP 或两者。因此,对旧 FTP 协议的支持通常设计为不会将加密通信的复杂性用作流程的一部分。)