ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

curl `--ftp-account` 完全指南:登录后按需用 ACCT 命令补交 FTP 账号数据

curl `--ftp-account` 完全指南:登录后按需用 ACCT 命令补交 FTP 账号数据 curl--ftp-account完全指南登录后按需用 ACCT 命令补交 FTP 账号数据【免费下载链接】curlA command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, MQTTS, POP3, POP3S, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS. libcurl offers a myriad of powerful features项目地址: https://gitcode.com/GitHub_Trending/cu/curl--ftp-account是 curl 命令行为 FTP 登录准备的扩展认证选项当 FTP 服务器在用户与口令校验之后仍然要求提供 account data账号数据 时用它指定的字符串会通过 FTPACCT命令发给服务器从而完成整个登录流程。本文以 docs/cmdline-opts/ftp-account.md 为主干结合 lib/ftp.c、lib/setopt.c、lib/urldata.h 以及测试用例讲清它的命令行用法、触发机制、底层状态机与出错处理读完即可在真实 FTP 服务器上正确配置并排查 ACCT 登录问题。选项概览元信息一览该选项的官方定义集中在 docs/cmdline-opts/ftp-account.md 的文件头元信息中整理如下字段值说明Long--ftp-account长选项名没有短选项必须写全Argdata需要一个字符串参数即要发送的账号数据HelpAccount data string帮助文本见 src/tool_listhelp.c分类为CURLHELP_FTP \| CURLHELP_AUTHProtocolsFTP仅对 FTP 协议生效Added7.13.0curl 7.13.0 起提供Categoryftp auth属于 FTP 认证类选项Multisingle单值选项多次指定时后一次覆盖前一次Example--ftp-account mr.robot ftp://example.com/官方示例该选项与对应的 libcurl 编程接口CURLOPT_FTP_ACCOUNT同日7.13.0加入两者语义完全一致详见 docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.md。何时需要它理解服务器的 ACCT 要求标准 FTP 登录一般只有两步USER 用户名与PASS 口令。但某些 FTP 服务器常见于按项目、按部门计费或做资源隔离的主机在收到用户名口令后还会额外要求用户提交一个账号数据account data例如计费账号、项目代号或成本中心编号。此时服务器会返回332应答语义即需要账号才能登录RFC 959 中 332 Need account for login。curl 一旦收到 332就要求客户端侧提供账号字符串并通过 FTP 控制通道发送ACCT命令USER anonymous PASS ftpexample.com ACCT one count - 服务器要求账号时curl 自动补发这层登录后才补交数据的机制正是--ftp-account存在的唯一目的。文档原文的表述为When an FTP server asks for account data after username and password has been provided, this data is sent off using the ACCT command.当 FTP 服务器在用户名与口令之后询问账号数据时此数据通过 ACCT 命令发送。命令行用法基本形式curl --ftp-account mr.robot ftp://example.com/解析规则如下--ftp-account后必须紧跟一个非空的data字符串参数解析代码使用getstr(config-ftp_account, nextarg, DENY_BLANK)读取该值见 src/tool_getparam.c空白的参数会被拒绝。账号字符串会作为ACCT命令参数原样发送因此可以包含空格例如--ftp-account one count实际发出ACCT one count。选项与用户名口令相互独立用户名、口令仍通过--user/-u、--password或 URL 中的user:password提供--ftp-account只在服务器额外索取时才被使用。与登录选项配合的完整示例curl --user alice:secret \ --ftp-account project-x \ ftp://ftp.example.com/pub/file.bin命令行工具内部的取值流程为--ftp-account参数在 src/tool_getparam.c 注册并被解析写入config-ftp_account字段定义见 src/tool_cfgable.h注释即 for ACCT随后在 src/config2setopts.c 中被映射为等价的 libcurl 选项CURLOPT_FTP_ACCOUNT从而进入底层库执行。源码级原理USER/PASS 之后的状态机--ftp-account的实现位于 FTP 状态机 lib/ftp.c。FTP 登录流程相关的状态在命令列表中已列出USER、PASS、ACCT等见 lib/ftp.c其控制逻辑如下1. 收到 332 后触发 ACCTFTP_USER与FTP_PASS两个状态共用应答处理函数ftp_state_user_resp()见 lib/ftp.c收到331需要口令且当前处于 USER 阶段 → 发送PASS收到2xx已登录→ 直接进入已登录态收到332→ 说明服务器要求 account data代码在 lib/ftp.c 中处理else if(ftpcode 332) { const char *account CURL_EASY_STR(data, STRING_FTP_ACCOUNT); if(!account) { failf(data, ACCT requested but none available); result CURLE_LOGIN_DENIED; } else if(ftp_has_ctrl(account)) { failf(data, Control byte in FTP account); result CURLE_BAD_FUNCTION_ARGUMENT; } else { result Curl_pp_sendf(data, ftpc-pp, ACCT %s, account); if(!result) ftp_state(data, ftpc, FTP_ACCT); } }三种分支对应三种情况情形行为未设置账号字符串报错ACCT requested but none available返回CURLE_LOGIN_DENIED错误码 67账号字符串含控制字符报错Control byte in FTP account返回CURLE_BAD_FUNCTION_ARGUMENT错误码 43账号字符串合法通过控制连接发送ACCT data转入FTP_ACCT状态等待服务器应答2. 账号数据必须干净为什么账号数据里不允许出现控制字节原因写在 lib/ftp.c 的注释里任何会进入 FTP 控制命令的值都不能携带控制字节——一个 CR 或 LF 会提前终结当前命令行从而允许把第二条命令走私进控制连接即 FTP 命令注入 / CRLF 注入。ftp_has_ctrl()会逐字节检查字符串只要出现 0x20的字符即拒绝发送。因此即便账号数据理论上是自由文本也应避免换行、回车等控制字符。3. 对 ACCT 应答的处理发送ACCT后进入FTP_ACCT状态由ftp_state_acct_resp()见 lib/ftp.c处理if(ftpcode ! 230) { failf(data, ACCT rejected by server: %03d, ftpcode); result CURLE_FTP_WEIRD_PASS_REPLY; /* FIX */ } else result ftp_state_loggedin(data, ftpc);即服务器返回230User logged in则视为登录成功并进入后续正常 FTP 操作返回其它应答如532Need account for storing files 等拒绝语义则报ACCT rejected by server: code并返回CURLE_FTP_WEIRD_PASS_REPLY错误码 11。整个流程的状态转移可概括为USER - 331 - PASS - 332 - ACCT - 230 - 登录完成ftp_state_loggedin | - 其它 - CURLE_FTP_WEIRD_PASS_REPLY (11) - 未配置账号 - CURLE_LOGIN_DENIED (67)4. 编译期开关该功能受 FTP 功能开关保护字符串索引STRING_FTP_ACCOUNT被定义在#ifndef CURL_DISABLE_FTP之内见 lib/urldata.h。也就是说在以CURL_DISABLE_FTP编译、不含 FTP 支持的 curl 构建中--ftp-account与CURLOPT_FTP_ACCOUNT相关代码不会编入使用会报不支持类错误。相关选项的 setopt 入口同样位于 lib/setopt.ccase CURLOPT_FTP_ACCOUNT: return Curl_setstropt(data, STRING_FTP_ACCOUNT, ptr);它把用户字符串拷贝到 libcurl 内部存储字符串在curl_easy_setopt调用之后不必由调用方继续保留见 docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.md。libcurl 编程接口对照命令行选项在 libcurl 中的同名编程接口为CURLOPT_FTP_ACCOUNT#include curl/curl.h CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_ACCOUNT, char *account);官方示例取自 docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.mdint main(void) { CURL *curl curl_easy_init(); if(curl) { CURLcode result; curl_easy_setopt(curl, CURLOPT_URL, ftp://example.com/foo.bin); curl_easy_setopt(curl, CURLOPT_FTP_ACCOUNT, human-resources); result curl_easy_perform(curl); curl_easy_cleanup(curl); } }接口行为要点传入 NULL 即表示禁用该功能默认值就是 NULL多次调用时最后一次设置的字符串覆盖前一次传 NULL 可重新禁用失败时curl_easy_setopt返回非零CURLcode成功返回CURLE_OK (0)。测试用例佐证服务器应答驱动的完整会话仓库的 FTP 测试直接验证了 332 触发 ACCT 的行为。以 tests/data/test229 为例其服务端指令与客户端命令如下服务端REPLY PASS 332 please provide account name REPLY ACCT 532 bluah! 客户端ftp://%HOSTIP:%FTPPORT/%TESTNUMBER --ftp-account one countprotocol校验段记录了 curl 实际发出的完整控制流见 tests/data/test229USER anonymous PASS ftpexample.com ACCT one count也就是说curl 先匿名登录USER anonymous/PASS ftpexample.com服务器对 PASS 应答332curl 随即自动补发ACCT one count账号字符串来自--ftp-account one count原样包含空格服务器对 ACCT 应答532表示拒绝curl 认定登录失败测试断言errorcode 11即CURLE_FTP_WEIRD_PASS_REPLY。由此可以反推成功场景的期望行为只要服务器对 ACCT 返回230curl 就会经ftp_state_loggedin()进入正常登录后阶段。此外仓库中另有 tests/data/test228、tests/data/test294、tests/data/test295、tests/data/test698、tests/data/test2115 等用例涉及ACCT会话可作为深入研读该选项行为的参考样本。注意事项与实践建议仅在服务器明确要求时才有效若服务器在USER/PASS后直接返回230curl 根本不会发送ACCT设置该选项不会产生额外网络流量。不要省略用户名口令ACCT发生在用户名与口令提交之后纯 ACCT 无法独立完成登录。避免控制字符账号数据中出现 CR/LF 会被拒绝并报CURLE_BAD_FUNCTION_ARGUMENT这是防 FTP 命令注入的安全设计。值是单值覆盖语义同一命令行里重复给出多个--ftp-account只有最后一个生效。URL 之外的明文安全账号数据出现在进程命令行中可能被同机其他用户短暂窥探对敏感场景应配合.netrc或配置文件方式管理凭据命令行明文只是约定俗成的简单做法。登录选项细节可对照 docs/cmdline-opts/user.md 中的安全提示。FTP over TLS 同样适用ACCT属于 FTP 控制通道命令在--ssl/--ssl-reqd启用保护后控制通道上的一切命令含 ACCT 及其参数都随加密连接传输从而避免账号数据以明文在网络上暴露。进一步阅读命令行选项权威定义docs/cmdline-opts/ftp-account.md同名 libcurl 选项docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.md底层状态机与 332/ACCT 应答处理lib/ftp.c控制字符防护实现lib/ftp.c内部字符串索引与编译开关lib/urldata.hsetopt 入口lib/setopt.c命令行参数注册与解析src/tool_getparam.c、src/tool_getparam.c选项与 setopt 的桥接src/config2setopts.c会话级测试样本tests/data/test229、tests/data/test228、tests/data/test2115【免费下载链接】curlA command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, MQTTS, POP3, POP3S, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS. libcurl offers a myriad of powerful features项目地址: https://gitcode.com/GitHub_Trending/cu/curl创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表