如何用WGET/CURL从OneDrive下载受保护文件至Unix服务器
嘿,我来帮你搞定这个用wget/curl下载受保护OneDrive文件的事儿!首先得掰扯清楚:wget的--password选项为啥没用——这个选项是给HTTP基本认证(Basic Auth)设计的,但OneDrive的密码保护/组织内访问都是基于网页会话或OAuth令牌的验证逻辑,完全不是一个路子,所以直接加这个参数肯定不管用。下面分两种保护场景给你具体方案:
场景1:密码保护的OneDrive共享链接
这种是你给共享链接设了密码,别人得输入密码才能访问。我们需要先通过curl提交密码获取会话cookie,再用这个cookie去下载文件:
第一步:获取验证后的会话cookie
先找到密码验证页面的提交地址(可以用浏览器打开共享链接,打开开发者工具看Network标签,输入密码提交后查看POST请求的目标地址),然后用curl提交密码并保存cookie:# 替换成你的共享密码和验证页面URL curl -c onedrive_cookies.txt -d "password=你的共享密码" "https://onedrive.live.com/.../verify"要是不确定验证页面地址,也可以让curl自动跟踪重定向,直接访问共享链接并提交密码:
curl -c onedrive_cookies.txt -L -d "password=你的共享密码" "https://onedrive.live.com/...你的共享链接"第二步:用cookie下载目标文件
拿到cookie后,不管用wget还是curl都能顺利下载了:- wget版本:
wget --load-cookies onedrive_cookies.txt -O 你的文件名.xlsx "https://...&download=1" - curl版本:
curl -b onedrive_cookies.txt -L -o 你的文件名.xlsx "https://...&download=1"
- wget版本:
场景2:仅限公司内部人员访问的链接(组织权限)
这种是基于公司Azure AD身份验证的,只有公司账号能访问。需要借助Microsoft Graph API获取访问令牌,再带着令牌去下载文件:
前提准备
得先让公司IT帮你在Azure AD注册一个应用,拿到三个关键信息:租户ID、客户端ID、客户端密钥,还要给这个应用授权OneDrive文件的读取权限。
第一步:获取访问令牌
用curl请求微软的令牌端点,拿到返回JSON里的access_token:curl -X POST \ -d "grant_type=client_credentials&client_id=你的客户端ID&client_secret=你的客户端密钥&resource=https://graph.microsoft.com" \ "https://login.microsoftonline.com/你的租户ID/oauth2/token"第二步:解析共享链接获取文件ID
把你的OneDrive共享链接编码后,用Graph API的/shares端点解析出文件的Graph ID:# 替换成你的共享链接和刚拿到的access_token curl -H "Authorization: Bearer 你的access_token" \ "https://graph.microsoft.com/v1.0/shares/u!$(echo -n "https://...你的共享链接" | base64 | tr '+/' '-_' | tr -d '=')"返回的JSON里会有
id字段,这就是我们需要的文件ID。第三步:用令牌下载文件
用拿到的文件ID和access_token发起下载请求:curl -H "Authorization: Bearer 你的access_token" \ -L -o 你的文件名.xlsx \ "https://graph.microsoft.com/v1.0/drives/你的DriveID/items/你的文件ID/content"(注:Drive ID也可以从第二步的JSON返回结果里找到)
几个实用小提醒
- 密码保护场景里,要是验证页面的表单参数不是
password,可以用浏览器开发者工具查看表单的name属性,替换-d里的参数名 - 组织权限场景里,要是想自动化脚本,可以用
jq工具自动提取JSON里的access_token,不用手动复制 - 下载完成后记得删除cookie文件(
rm onedrive_cookies.txt),避免会话信息泄露
内容的提问来源于stack exchange,提问作者Marek Mezei




