ftp – STOR命令的正确用户

我需要从ftp服务器获取响应消息我正在对连接进行故障排除,所以我使用PHP的ftp_raw函数,它允许我将原始ftp命令发送到远程服务器,并获取响应字符串. (内置的PHP ftp命令不返回响应:(

this接受回答后,我发送的命令是

PASV
STOR /local/path/to/file.txt

服务器响应是

500 /local/path/to/file.txt: The system cannot find the path specified.

我在想自己“当然,远程主机不知道我的本地文件系统.”我的预感是我正在打开一个套接字,指定一个远程文件名,我仍然需要管理数据.但我在搜索中没有找到任何结论性的文件.

上传文件的完整原始ftp命令是什么?在什么时候,以及如何实际开始向远程服务器发送数据?我可以使用ftp_connect()设置的连接作为套接字吗?

最佳答案
免责声明:你应该知道的第一件事是RFC959在FTP变得流行之后写了一段时间,并且仍然有一些基于RFC959发布之前(以及之后的一段时间)缺乏规范的软件.许多较旧(且更稳定)的FTP库对某些服务器有一些特殊处理,以确保它以99.9%的时间以您想要的方式工作.这在处理FTP协议的扩展时尤其常见.

我的其余部分假设服务器符合RFC959.

另请注意,绕过FTP客户端库的更高级别请求/响应管理意味着您需要自己重新实现此库的一部分.这意味着您应该熟悉规范,因为您需要参考它.在可能的情况下,我会参考相应的部分,以便您可以到处走走.

在一个案例中,我强烈建议您通过使用PHP的FTP客户端库调试您的问题,而不是自己实现所有这些.它是可能的,你应该真的要求库输出它正在使用的所有命令.尽管如此,我仍然会指导您完成帮助诊断问题的程序.

管理FTP数据连接有点痛苦.如果您想支持规范的所有可选部分,它并不像第一眼看上去那么容易.您传输文件的具体方式主要取决于以下选项的当前状态:

>数据类型(第3.1.1节):使用图像/二进制数据类型传输文件通常是最安全和最有效的.这不是默认设置,某些FTP命令(例如目录列表)需要将其设置为ASCII,因此请确保始终在传输之前进行设置.
>数据结构(第3.1.2节):文件结构通常是您想要的,但某些较旧的计算机和大型机可能必须转换为此模式.
>传输模式(3.4节):流模式最常用,但块模式支持恢复中断传输,压缩模式不太重要.
>连接模式(第3.2和3.3节):客户端或服务器可以通过连接到其对等方来建立数据连接.这必须使用以下两种方式协商:

>默认:客户端侦听端口20;要么
>自定义端口:客户端告诉服务器它在另一个端口上列出;要么
>被动模式:客户端询问服务器将侦听哪个端口.

请注意规范,因为某些配置允许您保持数据连接打开而其他配置可能需要您关闭它(例如流模式).如果数据连接已打开,则无需在每次传输时重新连接到服务器.

所有这一切看起来都非常复杂,但它只是提供了丰富的信息.在调试时它可能会派上用场.实际上只有两种流行的方法可以使用FTP传输文件:

>服务器在第二个端口上连接到客户端,并使用文件数据结构以图像(二进制)数据类型发送文件.

>配置数据类型(必需):

TYPE I

>配置数据结构(可选,默认):

STRU F

>配置传输模式(可选,默认):

MODE S

>选择一个可用的端口(这可能比你想象的更微妙)并开始聆听.如果选择默认端口(20),请跳过下一步.

choose port, create socket, listen on selected port.

>告诉服务器我们将在给定端口上监听(如果选择了默认端口,则可选,但是不小心小心):

PORT your-public-ip-address, selected-port

>告诉服务器期望文件传输:

STOR remote-file-name

>等待来自服务器的传入连接.
>发送文件内容

open file, send contents, close file

>关闭数据连接

close socket.

>客户端在第二个端口上连接到服务器,并使用文件数据结构以图像(二进制)数据类型发送文件.

>配置数据类型(必需):

TYPE I

>配置数据结构(可选,默认):

STRU F

>配置传输模式(可选,默认):

MODE S

>告诉服务器我们将在给定端口上监听(必需):

PASV

>读取包含服务器正在侦听的IP地址和端口号的PASV命令响应.
>告诉服务器期望文件传输:

STOR remote-file-name

>建立联系:

connect to server on IP address and port number from PASV response

>发送文件内容

open file, send contents, close file

>关闭数据连接

close socket.

第一种方法存在一些不方便的问题,因为选择端口有点棘手(在使用端口之后,您需要等待一段时间才能再次使用它)并且您的防火墙或ISP可能会阻止某些端口上的传入连接等第二种方法最简单,除非服务器拒绝它,否则应该是首选方法.

转载注明原文:ftp – STOR命令的正确用户 - 代码日志