ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

curl 命令 `--xattr` 选项详解:将下载元数据写入扩展文件属性(含 Windows Zone.Identifier)

curl 命令 `--xattr` 选项详解:将下载元数据写入扩展文件属性(含 Windows Zone.Identifier) curl 命令--xattr选项详解将下载元数据写入扩展文件属性含 Windows Zone.Identifier【免费下载链接】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--xattr是 curl 命令行工具当前仓库 src/tool_operate.c 及 src/tool_xattr.c 中的核心实现提供的一个输出类output选项当使用-o/-O将响应保存为本地文件时它会把本次请求的元数据创建者、来源 URL、MIME 类型、Referrer 等写入文件系统的扩展文件属性Extended File Attributesxattr中在 Linux/Unix 与 Windows 上采用完全不同的落盘机制。读完本文你将掌握--xattr的完整用法、各个属性名与取值来源、底层实现原理、测试验证方式以及文件系统不支持 xattr 时的行为与排查方法。选项速览该选项在 docs/cmdline-opts/xattr.md 中的元数据定义如下项值长选项--xattr短选项无Help 文本Store metadata in extended file attributes分类output输出类引入版本curl 7.21.3取值类型boolean布尔开关--xattr/--no-xattr相关选项--remote-time、--write-out、--verbose选项表中将其声明为ARG_BOOL见 src/tool_getparam.c解析时通过C_XATTR分支直接写入config-xattr布尔字段src/tool_getparam.c。说明本文基于当前仓库快照撰写。文档中记载“自 curl 8.22.0 起该选项在 Windows 上受支持”具体版本能力请以你使用的发布版为准。基本用法与元数据写入内容--xattr只有在将输出保存到文件时才生效因此必须与-o file或-O远程文件名配合使用curl --xattr -o storage $URL下载完成后curl 会尝试在目标文件上写入如下元数据属性名取值来源说明user.creator固定值curl标识该文件的创建者user.xdg.origin.url请求 URL原始下载地址已去除 URL 中的用户名与密码见下文“凭据剥离”user.mime_typeCURLINFO_CONTENT_TYPEHTTP 响应头Content-Type仅 HTTP 请求有值user.xdg.referrer.urlCURLINFO_REFERER若设置了 Referrer如--referer则写入否则不写入注意user.xdg.origin.url与user.xdg.referrer.url的属性名采用了 freedesktop.org 的 CommonExtendedAttributes 规范命名便于桌面环境与文件管理器读取。凭据剥离stripcredentials出于安全考虑写入文件的user.xdg.origin.url不会保留 URL 中的用户凭据。实现位于 src/tool_xattr.c通过curl_url()解析原始 URL依次清除CURLUPART_USER与CURLUPART_PASSWORD后再取回 URL。例如https://user:passexample.com/file写入文件时会被记录为https://example.com/file避免明文凭据残留在本地文件属性中。底层实现原理--xattr的调用链如下命令行解析--xattr→config-xattr truesrc/tool_getparam.c传输结束后在 src/tool_operate.c 的post_output_handling()中判断若传输成功!result、开启了config-xattr、且输出文件确实已打开outs-fopened outs-stream则调用fwrite_xattr()fwrite_xattr()src/tool_xattr.c在 Unix 与 Windows 分支分别执行写属性操作若写入失败通过warnf()输出Error setting extended attributes on file: errno警告但不会让整个命令失败。平台分支一Linux/Unix 的 xattr 映射在非 Windows 平台src/tool_xattr.h 依据编译期检测决定是否启用USE_XATTR存在HAVE_FSETXATTR时包含sys/xattr.hlibc 自带而非 libattrFreeBSD版本 500000与 MidnightBSD 使用sys/extattr.h。写属性时按映射表逐个写入src/tool_xattr.cstatic const struct xattr_mapping { const char *attr; /* name of the xattr */ CURLINFO info; } mappings[] { { user.xdg.referrer.url, CURLINFO_REFERER }, { user.mime_type, CURLINFO_CONTENT_TYPE }, { NULL, CURLINFO_NONE } /* last element, abort here */ };写入顺序为先写user.creator固定值curl再遍历映射表通过curl_easy_getinfo()取出对应CURLINFO_*值仅当值存在时才写入对应属性。之后剥离凭据写user.xdg.origin.url。底层调用因平台而异src/tool_xattr.c6 参数版本fsetxattr(fd, attr, value, strlen(value), 0, 0)HAVE_FSETXATTR_65 参数版本fsetxattr(fd, attr, value, strlen(value), 0)HAVE_FSETXATTR_5FreeBSD/MidnightBSDextattr_set_fd(fd, EXTATTR_NAMESPACE_USER, attr, value, strlen(value))。平台分支二Windows 的 Zone.Identifier 数据流自 curl 8.22.0 起Windows 上--xattr不再依赖 NTFS 扩展属性而是创建名为Zone.Identifier的NTFS 备用数据流Alternate Data Stream, ADS内容为 INI 格式的[ZoneTransfer]段src/tool_xattr.c[ZoneTransfer] ReferrerUrlhttps://referrer.invalid/ HostUrlhttp://%HOSTIP:%HTTPPORT/%TESTNUMBER实现要点_fullpath()将文件名转为绝对路径防止 Windows 将X:stream形式的文件名误解析为“盘符:文件名”通过curlx_fopen(绝对路径:Zone.Identifier, w)写入 ADSHostUrl使用剥离凭据后的 URLReferrerUrl仅在设置了 Referrer 时写入curl_easy_getinfo(curl, CURLINFO_REFERER, ...)取值。这是 Windows 系统“来自 Internet 的文件”安全标记的通用机制写入该数据流后资源管理器会显示“此文件来自其他计算机”的安全提示帮助用户在本地双击下载文件前识别其网络来源。文件系统不支持时的行为如果目标文件系统不支持扩展文件属性例如 FAT32、部分网络挂载、tmpfs 配置等fsetxattr()/extattr_set_fd()会返回错误此时 curl 会输出一条警告curl: Warning: Error setting extended attributes on storage: Operation not supported该警告由 src/tool_operate.c 中的warnf()产生它读取errno并借助curlx_strerror()给出可读信息。需要注意这只影响元数据写入不影响文件本身——文件已正常下载完成命令退出码也保持不变。对元数据要求严格的脚本可在执行后自行用getfattr/attr等工具校验。验证属性是否写入以 Linux 为例下载后可用以下命令查看curl --xattr -o storage https://example.com/index.html getfattr -d storage预期输出类似user.creatorcurl user.mime_typetext/html user.xdg.origin.urlhttps://example.com/index.html若请求时携带了--referercurl --xattr --referer https://example.com/ref -o storage https://example.com/index.html则会额外出现user.xdg.referrer.urlhttps://example.com/ref。Windows 上则用more storage:Zone.Identifier或记事本打开该 ADS 查看。测试与调试仓库为--xattr准备了专门的集成测试位于 tests/data/与单元测试测试内容tests/data/test687基础--xattr -o用法tests/data/test644--xattr配合-L重定向follow redirecttests/data/test688大写-O--output-dir--referer组合tests/tunit/tool1621.cstripcredentials()凭据剥离单元测试这些测试依赖 Debug 构建featuresDebug xattr/features并通过环境变量CURL_FAKE_XATTR1模拟xattr 写入在该变量存在时xattr()与win32_file_stream()不真正落盘而是把attr value打印到标准输出src/tool_xattr.c。例如 tests/data/test688 的期望输出为user.creator curl user.xdg.referrer.url https://referrer.invalid/ user.mime_type fake/data user.xdg.origin.url http://%HOSTIP:%HTTPPORT/%TESTNUMBERWindows 分支则期望[ZoneTransfer]段文本。这种设计让 CI 无需真实文件系统支持即可覆盖属性名与取值逻辑。日常调试时你可以对 Debug 构建的 curl 设置CURL_FAKE_XATTR1直接看到本次会写入哪些属性及对应值无需依赖真实 xattr 文件系统。与其他选项的配合--xattr属于“输出类”选项常见配合如下-o file/-O必选--xattr只在落盘时生效输出到标准输出管道、终端时不写属性--referer url为user.xdg.referrer.url/ReferrerUrl提供数据源--remote-time同时把远程文件的修改时间写到本地文件与 xattr 互补见 docs/cmdline-opts/remote-time.md--verbose观察 HTTP 响应头确认Content-Type与 Referrer 实际值便于与写入结果对照。注意--xattr是布尔开关可用--no-xattr显式关闭例如配置文件全局开启后针对单次调用关闭。小结--xattr用一行参数让 curl 在保存文件时附带完整的“溯源信息”Unix 上通过user.*扩展属性记录创建者、来源 URL、MIME 类型与 Referrer且 URL 凭据被自动剥离Windows 上则写出标准的Zone.Identifier备用数据流。其实现src/tool_xattr.c、src/tool_operate.c与测试tests/data/test644、tests/data/test687、tests/data/test688、tests/tunit/tool1621.c结构清晰适合作为研究 curl 输出处理管线与跨平台文件元数据机制的入门案例。【免费下载链接】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),仅供参考
返回列表