4.1 FTP命令
4.1.1. 访问控制命令
以下命令用于指定访问控制标识符 (命令代码显示在括号中).
USER NAME (USER)
参数字段是标识用户的Telnet字符串. 用户标识是服务器访问其文件系统所要求的标识. 在控制连接建立之后, 该命令通常是用户传输的第一条命令 (某些服务器可能要求如此). 某些服务器还可能要求以密码和/或账户命令的形式提供附加的标识信息. 服务器可以允许在任何时候输入新的USER命令, 以更改访问控制和/或计费信息. 这样做的效果是清除已提供的任何用户、密码和账户信息, 并重新开始登录序列. 所有传输参数保持不变, 正在进行的任何文件传输将在旧的访问控制参数下完成.
PASSWORD (PASS)
参数字段是指定用户密码的Telnet字符串. 此命令必须紧跟在用户名命令之后, 并且对某些站点而言, 它完成用户用于访问控制的标识. 由于密码信息相当敏感, 通常希望将其"掩蔽"或禁止回显. 服务器似乎没有办法可靠地做到这一点. 因此, 隐藏敏感密码信息是用户FTP进程的责任.
ACCOUNT (ACCT)
参数字段是标识用户账户的Telnet字符串. 该命令不一定与USER命令相关, 因为某些站点可能要求账户才能登录, 而另一些站点只在特定访问 (例如存储文件) 时才要求账户. 在后一种情况下, 该命令可以在任何时候到达.
为了便于自动化处理, 有一些应答码用于区分这些情况: 当登录需要账户信息时, 对成功的PASSword命令的响应是应答码332. 另一方面, 如果登录不需要账户信息, 对成功的PASSword命令的应答是230; 而如果对话中稍后发出的命令需要账户信息, 服务器应返回332或532应答, 取决于它是保存 (等待接收ACCounT命令) 还是丢弃该命令.
CHANGE WORKING DIRECTORY (CWD)
此命令允许用户使用不同的目录或数据集进行文件存储或检索, 而不改变其登录或计费信息. 传输参数同样保持不变. 参数是一个路径名, 指定一个目录或其他依赖于系统的文件组标识符.
CHANGE TO PARENT DIRECTORY (CDUP)
此命令是CWD的一种特殊情况, 包含它是为了简化在父目录命名语法不同的操作系统之间传输目录树的程序的实现. 其应答码应与CWD的应答码相同. 更多细节见附录II.
STRUCTURE MOUNT (SMNT)
此命令允许用户挂载不同的文件系统数据结构, 而不改变其登录或计费信息. 传输参数同样保持不变. 参数是一个路径名, 指定一个目录或其他依赖于系统的文件组标识符.
REINITIALIZE (REIN)
此命令终止一个USER, 刷新所有I/O和账户信息, 但允许正在进行的任何传输完成. 所有参数被重置为默认设置, 控制连接保持打开. 这与用户在控制连接刚打开时所处状态完全相同. 随后可以预期会有一个USER命令.
LOGOUT (QUIT)
此命令终止一个USER, 如果没有文件传输正在进行, 服务器将关闭控制连接. 如果文件传输正在进行, 连接将保持打开以发送结果响应, 然后服务器将关闭它. 如果用户进程正在为多个USER传输文件, 但不希望为每个用户关闭再重新打开连接, 则应使用REIN命令而不是QUIT.
控制连接意外关闭将导致服务器执行中止 (ABOR) 和注销 (QUIT) 的等效动作.
4.1.2. 传输参数命令
所有数据传输参数都有默认值, 只有在要更改默认参数值时才需要使用指定数据传输参数的命令. 默认值是最后指定的值, 如果从未指定过任何值, 则采用此处所述的标准默认值. 这意味着服务器必须"记住"适用的默认值. 这些命令可以按任意顺序出现, 但必须位于FTP服务请求之前. 以下命令用于指定数据传输参数:
DATA PORT (PORT)
参数是数据连接所要使用的数据端口的主机-端口规范. 用户数据端口和服务器数据端口都有默认值, 在正常情况下不需要此命令及其应答. 如果使用此命令, 参数是一个32位互联网主机地址与一个16位TCP端口地址的拼接. 该地址信息被拆分为8位字段, 每个字段的值以十进制数 (字符串表示) 传输. 各字段之间用逗号分隔. 一条端口命令如下:
PORT h1,h2,h3,h4,p1,p2
其中h1是互联网主机地址的最高8位.
PASSIVE (PASV)
此命令请求服务器DTP在某个数据端口 (不是其默认数据端口) 上"监听", 并等待连接, 而不是在收到传输命令时主动发起连接. 对此命令的响应包括该服务器正在监听的主机和端口地址.
REPRESENTATION TYPE (TYPE)
参数指定表示类型, 如"数据表示与存储"一节所述. 有几种类型带有第二个参数. 第一个参数由单个Telnet字符表示, ASCII和EBCDIC的第二个Format参数同样如此; 本地字节的第二个参数是一个十进制整数, 指示字节大小. 参数之间用一个 <SP> (空格, ASCII码32) 分隔.
以下是为type分配的代码:
\ /
A - ASCII | | N - Non-print
|-><-| T - Telnet format effectors
E - EBCDIC| | C - Carriage Control (ASA)
/ \
I - Image
L <byte size> - Local byte Byte size
默认表示类型是ASCII Non-print. 如果Format参数被更改, 而之后仅更改了第一个参数, 则Format恢复为Non-print默认值.
FILE STRUCTURE (STRU)
参数是单个Telnet字符代码, 指定"数据表示与存储"一节所述的文件结构.
以下是为structure分配的代码:
- F - 文件 (无记录结构)
- R - 记录结构
- P - 页结构
默认结构是File.
TRANSFER MODE (MODE)
参数是单个Telnet字符代码, 指定"传输模式"一节所述的数据传输模式.
以下是为传输模式分配的代码:
- S - 流
- B - 块
- C - 压缩
默认传输模式是Stream.
4.1.3. FTP服务命令
FTP服务命令定义用户所请求的文件传输或文件系统功能. FTP服务命令的参数通常是一个路径名. 路径名的语法必须符合服务器站点的约定 (适用标准默认值) 以及控制连接的语言约定. 建议的默认处理方式是使用最后指定的设备、目录或文件名, 或者为本地用户定义的标准默认值. 这些命令可以按任意顺序出现, 但"rename from"命令之后必须跟随"rename to"命令, 且重启命令之后必须跟随被中断的服务命令 (例如STOR或RETR). 除某些信息性应答外, 为响应FTP服务命令而传输的数据始终应通过数据连接发送. 以下命令用于指定FTP服务请求:
RETRIEVE (RETR)
此命令使服务器DTP把路径名所指定文件的一个副本传输到数据连接另一端的服务器或用户DTP. 服务器站点上该文件的状态和内容不受影响.
STORE (STOR)
此命令使服务器DTP接受通过数据连接传输的数据, 并将这些数据作为文件存储在服务器站点. 如果路径名所指定的文件已存在于服务器站点, 则其内容将被正在传输的数据替换. 如果路径名所指定的文件尚不存在, 则在服务器站点创建一个新文件.
STORE UNIQUE (STOU)
此命令的行为与STOR类似, 不同之处在于结果文件将在当前目录下以该目录内唯一的名称创建. 250 Transfer Started响应必须包含所生成的名称.
APPEND (with create) (APPE)
此命令使服务器DTP接受通过数据连接传输的数据, 并将这些数据存储在服务器站点的一个文件中. 如果路径名所指定的文件已存在于服务器站点, 则数据应追加到该文件; 否则, 应在服务器站点创建路径名所指定的文件.
ALLOCATE (ALLO)
某些服务器可能需要此命令来预留足够的存储空间, 以容纳要传输的新文件. 参数应是一个十进制整数, 表示要为该文件预留的存储空间的字节数 (使用逻辑字节大小). 对于以记录或页结构发送的文件, 可能还需要最大记录或页大小 (以逻辑字节计); 这由命令第二个参数字段中的十进制整数指示. 第二个参数是可选的, 但如果存在, 应通过三个Telnet字符 <SP> R <SP> 与第一个参数分隔. 此命令之后应跟随一条STORe或APPeNd命令. 对于不要求事先声明文件最大大小的服务器, ALLO命令应被视为NOOP (无操作); 而仅关心最大记录或页大小的服务器应接受第一个参数中的占位值并忽略它.
RESTART (REST)
参数字段表示文件传输将要重启的服务器标记. 此命令不会引起文件传输, 而是跳过文件中指定的数据检查点. 此命令之后应立即跟随相应的FTP服务命令, 由该命令使文件传输恢复进行.
RENAME FROM (RNFR)
此命令指定要重命名的文件的旧路径名. 此命令之后必须立即跟随一条"rename to"命令, 指定新的文件路径名.
RENAME TO (RNTO)
此命令指定紧随其前的"rename from"命令中所指定文件的新路径名. 这两条命令共同完成文件的更名.
ABORT (ABOR)
此命令告诉服务器中止之前的FTP服务命令以及任何相关的数据传输. 如"FTP命令"一节所述, 中止命令可能需要"特殊动作"来强制服务器识别. 如果之前的命令已经完成 (包括数据传输), 则不采取任何动作. 服务器不应关闭控制连接, 但数据连接必须关闭.
服务器收到此命令时有两种情况: (1) FTP服务命令已经完成, 或者 (2) FTP服务命令仍在进行中.
-
在第一种情况下, 服务器关闭数据连接 (如果它处于打开状态) 并以226应答响应, 表明中止命令已被成功处理.
-
在第二种情况下, 服务器中止正在进行的FTP服务并关闭数据连接, 返回426应答以表明服务请求异常终止. 然后服务器发送226应答, 表明中止命令已被成功处理.
DELETE (DELE)
此命令使路径名所指定的文件在服务器站点被删除. 如果需要额外一层保护 (例如询问"你真的希望删除吗?"), 它应由用户FTP进程提供.
REMOVE DIRECTORY (RMD)
此命令使路径名所指定的目录被删除: 如果路径名是绝对的, 则作为一个目录删除; 如果路径名是相对的, 则作为当前工作目录的一个子目录删除. 见附录II.
MAKE DIRECTORY (MKD)
此命令使路径名所指定的目录被创建: 如果路径名是绝对的, 则作为一个目录创建; 如果路径名是相对的, 则作为当前工作目录的一个子目录创建. 见附录II.
PRINT WORKING DIRECTORY (PWD)
此命令使当前工作目录的名称在应答中返回. 见附录II.
LIST (LIST)
此命令使一个列表从服务器发送到被动DTP. 如果路径名指定一个目录或其他文件组, 服务器应传输该指定目录中的文件列表. 如果路径名指定一个文件, 则服务器应发送该文件的当前信息. 空参数意味着用户的当前工作目录或默认目录. 数据传输通过数据连接进行, 使用ASCII类型或EBCDIC类型. (用户必须确保TYPE适当地设置为ASCII或EBCDIC.) 由于文件信息在不同系统之间可能差异很大, 这些信息在程序中可能难以自动使用, 但对人类用户可能相当有用.
NAME LIST (NLST)
此命令使一个目录清单从服务器站点发送到用户站点. 路径名应指定一个目录或其他系统特定的文件组描述符; 空参数意味着当前目录. 服务器将返回一个文件名流, 不包含其他任何信息. 数据将以ASCII或EBCDIC类型通过数据连接传输, 作为由 <CRLF> 或 <NL> 分隔的有效路径名字符串. (同样, 用户必须确保TYPE是正确的.) 此命令旨在返回可被程序用于进一步自动处理文件的信息. 例如, 用于实现"多重获取"功能.
SITE PARAMETERS (SITE)
此命令由服务器用于提供其系统特定的服务, 这些服务对文件传输必不可少, 但又不够通用, 不足以作为命令纳入协议之中. 这些服务的性质及其语法的规范可以在对HELP SITE命令的应答中说明.
SYSTEM (SYST)
此命令用于查询服务器所在的操作系统的类型. 应答的第一个单词应是当前版本的Assigned Numbers文档 [4] 中列出的系统名称之一.
STATUS (STAT)
此命令应导致以应答的形式通过控制连接发送状态响应. 该命令可以在文件传输期间发送 (与Telnet IP和Synch信号一起--见"FTP命令"一节), 在这种情况下, 服务器将以正在进行操作的状态响应; 它也可以在文件传输之间发送. 在后一种情况下, 该命令可以带有参数字段. 如果参数是一个路径名, 该命令类似于"list"命令, 只是数据应通过控制连接传输. 如果给出的是部分路径名, 服务器可以以与该说明相关联的文件名或属性列表响应. 如果没有给出参数, 服务器应返回关于服务器FTP进程的一般状态信息. 这应包括所有传输参数的当前值以及连接的状态.
HELP (HELP)
此命令应导致服务器通过控制连接向用户发送关于其实现状态的有用信息. 该命令可以带一个参数 (例如任意命令名), 并作为响应返回更具体的信息. 应答类型为211或214. 建议允许在输入USER命令之前使用HELP. 服务器可以利用此应答来指定依赖于站点的参数, 例如在响应HELP SITE时.
NOOP (NOOP)
此命令不影响任何参数或之前输入的命令. 它除了要求服务器发送一个OK应答之外, 不指定任何动作.
命令语法说明
文件传输协议在控制连接上的所有通信均遵循Telnet协议的规范. 由于用于Telnet通信的语言可能是一种协商选项, 接下来两节中的所有引用都将针对"Telnet语言"及相应的"Telnet行结束代码". 目前, 可以将它们理解为NVT-ASCII和 <CRLF>. 除此之外不会再引用Telnet协议的其他规范.
FTP命令是由"Telnet行结束代码"终止的"Telnet字符串". 命令代码本身是字母字符, 如果后面有参数, 则由字符 <SP> (空格) 终止, 否则由Telnet-EOL终止. 命令代码及命令的语义在本节中描述; 命令的详细语法在"命令"一节中规定, 应答序列在"命令与应答的排序"一节中讨论, 说明命令用法的场景在"典型FTP场景"一节中提供.
FTP命令可以划分为: 指定访问控制标识符的命令、指定数据传输参数的命令, 或FTP服务请求. 某些命令 (例如ABOR、STAT、QUIT) 可以在数据传输进行期间通过控制连接发送. 某些服务器可能无法同时监视控制连接和数据连接, 在这种情况下, 需要采取某种特殊动作来引起服务器的注意. 暂且推荐以下有序格式:
-
用户系统在Telnet流中插入Telnet"中断进程" (IP) 信号.
-
用户系统发送Telnet"Synch"信号.
-
用户系统在Telnet流中插入该命令 (例如ABOR).
-
服务器PI在收到"IP"之后, 扫描Telnet流以寻找恰好一条FTP命令.
(对于其他服务器, 这可能不是必需的, 但上述动作不应产生异常效果.)