Microsoft OneDrive

Microsoft OneDrive

路径指定为 remote:path

路径可以按需设置深度,例如 remote:directory/subdirectory

配置

OneDrive 的初始设置需要从 Microsoft 获取一个令牌,你需要在浏览器中完成此操作。rclone config 会引导你完成整个过程。

以下是一个如何创建名为 remote 的远程存储的示例。首先运行:

 rclone config

这将引导你完成一个交互式的设置过程:

e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q> n
name> remote
Type of storage to configure.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
[snip]
XX / Microsoft OneDrive
   \ "onedrive"
[snip]
Storage> onedrive
Microsoft App Client Id
Leave blank normally.
Enter a string value. Press Enter for the default ("").
client_id>
Microsoft App Client Secret
Leave blank normally.
Enter a string value. Press Enter for the default ("").
client_secret>
Edit advanced config? (y/n)
y) Yes
n) No
y/n> n
Remote config
Use web browser to automatically authenticate rclone with remote?
 * Say Y if the machine running rclone has a web browser you can use
 * Say N if running rclone on a (remote) machine without web browser access
If not sure try Y. If Y failed, try N.
y) Yes
n) No
y/n> y
If your browser doesn't open automatically go to the following link: http://127.0.0.1:53682/auth
Log in and authorize rclone for access
Waiting for code...
Got code
Choose a number from below, or type in an existing value
 1 / OneDrive Personal or Business
   \ "onedrive"
 2 / Sharepoint site
   \ "sharepoint"
 3 / Type in driveID
   \ "driveid"
 4 / Type in SiteID
   \ "siteid"
 5 / Search a Sharepoint site
   \ "search"
Your choice> 1
Found 1 drives, please select the one you want to use:
0: OneDrive (business) id=b!Eqwertyuiopasdfghjklzxcvbnm-7mnbvcxzlkjhgfdsapoiuytrewqk
Chose drive to use:> 0
Found drive 'root' of type 'business', URL: https://org-my.sharepoint.com/personal/you/Documents
Is that okay?
y) Yes
n) No
y/n> y
Configuration complete.
Options:
- type: onedrive
- token: {"access_token":"youraccesstoken","token_type":"Bearer","refresh_token":"yourrefreshtoken","expiry":"2018-08-26T22:39:52.486512262+08:00"}
- drive_id: b!Eqwertyuiopasdfghjklzxcvbnm-7mnbvcxzlkjhgfdsapoiuytrewqk
- drive_type: business
Keep this "remote" remote?
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y

[]: # … existing code …

请参阅 远程设置文档,了解如何在没有互联网浏览器的机器上进行设置。

请注意,rclone 会在你的本地机器上运行一个 Web 服务器,用于收集 Microsoft 返回的令牌。这个服务器仅在打开浏览器到你获取验证码的这段时间内运行。它的地址是 http://127.0.0.1:53682/,如果你运行了主机防火墙,可能需要临时解除对该地址的封锁。

配置完成后,你可以像这样使用 rclone

列出 OneDrive 顶级目录

rclone lsd remote:

列出 OneDrive 中的所有文件

rclone ls remote:

将本地目录复制到 OneDrive 中名为 backup 的目录

rclone copy /home/source remote:backup

获取你自己的客户端 ID 和密钥

除非在配置中指定了自定义的 client_id,否则 rclone 在与 OneDrive 通信时会使用默认的客户端 ID。默认的客户端 ID 和密钥在所有 rclone 用户进行请求时是共享的。

如果默认的客户端 ID 对你来说效果不佳,你可以选择创建并使用自己的客户端 ID。例如,你可能会遇到限流问题。

为个人版 OneDrive 创建客户端 ID

要创建你自己的客户端 ID,请按照以下步骤操作:

  1. 打开 https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps/ApplicationsListBlade,然后点击 新建注册
  2. 为你的应用输入一个名称,选择账户类型 任何组织目录中的账户(任何 Azure AD 目录 - 多租户)和个人 Microsoft 账户(例如 Skype、Xbox),在 重定向 URI 中选择 Web,然后输入(不要复制粘贴)http://localhost:53682/,并点击 注册。复制并保存应用名称下的 应用程序(客户端)ID,以备后续使用。
  3. 管理 下选择 证书和密码,点击 新建客户端密码。输入一个描述(可以是任意内容),并将 过期时间 设置为 24 个月。复制并保存该密码的 ,以备后续使用(之后你将无法再次查看该值)。
  4. 管理 下选择 API 权限,点击 添加权限,选择 Microsoft Graph,然后选择 委托权限
  5. 搜索并选择以下权限:Files.ReadFiles.ReadWriteFiles.Read.AllFiles.ReadWrite.Alloffline_accessUser.ReadSites.Read.All(如果配置了自定义访问范围,请相应地选择权限)。选择完成后,点击底部的 添加权限

现在应用程序配置完成。运行 rclone config 来创建或编辑 OneDrive 远程存储。分别将应用 ID 和密码作为客户端 ID 和密钥提供。rclone 将引导你完成剩余的步骤。

access_scopes 选项允许你配置 rclone 请求的权限。有关不同范围的更多信息,请参阅 Microsoft 文档

如果你需要 在配置远程存储时搜索 SharePoint 网站,则需要 Sites.Read.All 权限。但是,如果未分配该权限,你需要从访问范围中排除 Sites.Read.All,或者在高级选项中将 disable_site_permission 选项设置为 true

为商业版 OneDrive 创建客户端 ID

个人版 OneDrive 的步骤可能适用于商业版 OneDrive,也可能不适用,这取决于组织的安全设置。常见的错误是应用的发布者未经过验证。

你可以尝试 验证你的账户,或者尝试将应用限制为仅在你的组织内使用,如下所示:

  1. 确保使用你的商业账户创建应用。
  2. 按照上述步骤创建应用。但是,这里需要不同的账户类型:仅在此组织目录中的账户(*** - 单租户)。请注意,你也可以在创建应用后更改账户类型。
  3. 查找你组织的 租户 ID
  4. 在 rclone 配置中,将 auth_url 设置为 https://login.microsoftonline.com/YOUR_TENANT_ID/oauth2/v2.0/authorize
  5. 在 rclone 配置中,将 token_url 设置为 https://login.microsoftonline.com/YOUR_TENANT_ID/oauth2/v2.0/token

注意:如果你所在的地区比较特殊,可能需要在步骤 4 和 5 中使用不同的主机。这里有 一些提示

使用 OAuth 客户端凭据流

OAuth 客户端凭据流允许 rclone 使用与 Azure AD 企业应用程序直接关联的权限,而不是采用 Azure AD 用户账户的上下文。

可以通过以下步骤启用此流程:

  1. 在 Azure AD 门户中创建企业应用注册,并按照上述说明获取客户端 ID 和客户端密钥。
  2. 确保应用程序具有适当的权限,并且这些权限被分配为 应用程序权限
  3. 配置远程存储,确保正确输入 客户端 ID客户端密钥
  4. 高级配置 部分,将 client_credentials 设置为 true,并在 tenant 部分输入租户 ID。

在选择与客户端凭据流一起使用的连接类型时,“onedrive” 选项不起作用。你可以使用 “sharepoint” 选项,如果该选项无法找到正确的驱动器 ID,可以使用 “driveid” 选项手动输入。

注意:直接将权限分配给应用程序意味着任何拥有 客户端 ID客户端密钥 的人都可以访问你的 OneDrive 文件。请妥善保管这些凭据。

修改时间和哈希值

OneDrive 允许将对象的修改时间设置为精确到 1 秒。这些修改时间将用于检测对象是否需要同步。

个人版 OneDrive、商业版 OneDrive 和 SharePoint 服务器支持 QuickXorHash

在 rclone 1.62 之前,个人版 OneDrive 的默认哈希值是 SHA1。从 rclone 1.62 及更高版本开始,所有 OneDrive 后端的默认哈希值是 QuickXorHash

从 2023 年 7 月开始,个人版 OneDrive 逐步淘汰 SHA1 支持,转而支持 QuickXorHash。如果这对你的工作流程很重要,可以在过渡期间使用 --onedrive-hash-type 标志(或 hash_type 配置选项)来选择 SHA1

对于所有类型的 OneDrive,你都可以使用 --checksum 标志。

–fast-list

此远程存储支持 --fast-list,它允许你以使用更多内存为代价来减少事务次数。有关更多详细信息,请参阅 rclone 文档

必须使用 --onedrive-delta 标志(或在配置文件中设置 delta = true)来启用此功能,因为它可能会导致性能下降。

它通过使用 OneDrive 的增量列表功能来实现这一点,该功能可以非常高效地返回远程存储中的所有文件。这比递归列出目录要高效得多,也是 Microsoft 推荐的从驱动器读取所有文件信息的方法。

这对于 rclone mountrclone rc vfs/refresh recursive=true 非常有用,可以快速将所有文件的信息填充到挂载点中。

用于递归列表的 API (ListR) 仅支持从驱动器的根目录开始列出。离根目录越远,效率就会越低,因为 rclone 必须丢弃你正在使用的目录之外的文件。

一些命令(如 rclone lsf -R)默认会使用 ListR - 如果你需要,可以使用 --disable ListR 关闭此功能。

受限文件名的字符

除了 默认的受限字符集 之外,以下字符也会被替换:

字符 编码值 替换字符
" 0x22
* 0x2A
: 0x3A
< 0x3C
> 0x3E
? 0x3F
\ 0x5C
| 0x7C

文件名也不能以以下字符结尾。只有当这些字符是文件名的最后一个字符时才会被替换:

字符 编码值 替换字符
SP 0x20
. 0x2E

文件名也不能以以下字符开头。只有当这些字符是文件名的第一个字符时才会被替换:

字符 编码值 替换字符
SP 0x20
~ 0x7E

无效的 UTF-8 字节也会被 替换,因为它们不能用于 JSON 字符串。

删除文件

使用 rclone 删除的任何文件都会进入回收站。Microsoft 没有提供永久删除文件或清空回收站的 API,因此你需要使用 Microsoft 的应用程序之一或通过 OneDrive 网站来完成这些操作。

标准选项

以下是 OneDrive(Microsoft OneDrive)特定的标准选项。

–onedrive-client-id

OAuth 客户端 ID。

通常留空。

属性:

  • 配置项:client_id
  • 环境变量:RCLONE_ONEDRIVE_CLIENT_ID
  • 类型:字符串
  • 是否必需:否

–onedrive-client-secret

OAuth 客户端密钥。

通常留空。

属性:

  • 配置项:client_secret
  • 环境变量:RCLONE_ONEDRIVE_CLIENT_SECRET
  • 类型:字符串
  • 是否必需:否

–onedrive-region

选择 OneDrive 的国家云区域。

属性:

  • 配置项:region
  • 环境变量:RCLONE_ONEDRIVE_REGION
  • 类型:字符串
  • 默认值:“global”
  • 示例:
    • “global”
      • 微软全球云
    • “us”
      • 美国政府版微软云
    • “de”
      • 德国版微软云
    • “cn”
      • 由世纪互联运营的 Azure 和 Office 365

–onedrive-tenant

服务主体的租户 ID,也称为目录 ID。

在以下情况下设置此项:

  • 使用客户端凭据流

属性:

  • 配置项:tenant
  • 环境变量:RCLONE_ONEDRIVE_TENANT
  • 类型:字符串
  • 是否必需:否

高级选项

以下是 OneDrive(Microsoft OneDrive)特定的高级选项。

–onedrive-token

OAuth 访问令牌,以 JSON 格式存储。

属性:

  • 配置项:token
  • 环境变量:RCLONE_ONEDRIVE_TOKEN
  • 类型:字符串
  • 是否必需:否

–onedrive-auth-url

认证服务器 URL。

留空以使用提供商的默认值。

属性:

  • 配置项:auth_url
  • 环境变量:RCLONE_ONEDRIVE_AUTH_URL
  • 类型:字符串
  • 是否必需:否

–onedrive-token-url

令牌服务器 URL。

留空以使用提供商的默认值。

属性:

  • 配置项:token_url
  • 环境变量:RCLONE_ONEDRIVE_TOKEN_URL
  • 类型:字符串
  • 是否必需:否

–onedrive-client-credentials

使用客户端凭据 OAuth 流。

这将使用 RFC 6749 中描述的 OAUTH2 客户端凭据流。

属性:

  • 配置项:client_credentials
  • 环境变量:RCLONE_ONEDRIVE_CLIENT_CREDENTIALS
  • 类型:布尔值
  • 默认值:false

–onedrive-chunk-size

上传文件时的块大小 - 必须是 320k(327,680 字节)的倍数。

超过此大小的文件将被分块 - 必须是 320k(327,680 字节)的倍数,并且不应超过 250M(262,144,000 字节),否则你可能会遇到 “Microsoft.SharePoint.Client.InvalidClientQueryException: 请求消息太大。” 错误。请注意,这些块将被缓冲到内存中。

属性:

  • 配置项:chunk_size
  • 环境变量:RCLONE_ONEDRIVE_CHUNK_SIZE
  • 类型:SizeSuffix
  • 默认值:10Mi

–onedrive-drive-id

要使用的驱动器的 ID。

属性:

  • 配置项:drive_id
  • 环境变量:RCLONE_ONEDRIVE_DRIVE_ID
  • 类型:字符串
  • 是否必需:否

–onedrive-drive-type

驱动器的类型(个人 | 商业 | 文档库)。

属性:

  • 配置项:drive_type
  • 环境变量:RCLONE_ONEDRIVE_DRIVE_TYPE
  • 类型:字符串
  • 是否必需:否

–onedrive-root-folder-id

根文件夹的 ID。

通常不需要此选项,但在特殊情况下,你可能知道要访问的文件夹 ID,但无法通过路径遍历到达该文件夹。

属性:

  • 配置项:root_folder_id
  • 环境变量:RCLONE_ONEDRIVE_ROOT_FOLDER_ID
  • 类型:字符串
  • 是否必需:否

–onedrive-access-scopes

设置 rclone 请求的权限范围。

选择或手动输入一个以空格分隔的自定义列表,包含 rclone 应请求的所有权限范围。

属性:

  • 配置项:access_scopes
  • 环境变量:RCLONE_ONEDRIVE_ACCESS_SCOPES
  • 类型:SpaceSepList
  • 默认值:Files.Read Files.ReadWrite Files.Read.All Files.ReadWrite.All Sites.Read.All offline_access
  • 示例:
    • “Files.Read Files.ReadWrite Files.Read.All Files.ReadWrite.All Sites.Read.All offline_access”
      • 对所有资源具有读写访问权限
    • “Files.Read Files.Read.All Sites.Read.All offline_access”
      • 对所有资源具有只读访问权限
    • “Files.Read Files.ReadWrite Files.Read.All Files.ReadWrite.All offline_access”
      • 对所有资源具有读写访问权限,但无法浏览 SharePoint 网站。
      • 等同于将 disable_site_permission 设置为 true

–onedrive-disable-site-permission

禁用对 Sites.Read.All 权限的请求。

如果设置为 true,在配置驱动器 ID 时将无法搜索 SharePoint 网站,因为 rclone 不会请求 Sites.Read.All 权限。如果你的组织未将 Sites.Read.All 权限分配给应用程序,并且你的组织不允许用户自行同意应用程序权限请求,请将其设置为 true。

属性:

  • 配置项:disable_site_permission
  • 环境变量:RCLONE_ONEDRIVE_DISABLE_SITE_PERMISSION
  • 类型:布尔值
  • 默认值:false

–onedrive-expose-onenote-files

设置此项以使 OneNote 文件在目录列表中显示。

默认情况下,rclone 会在目录列表中隐藏 OneNote 文件,因为 “打开” 和 “更新” 等操作对它们不起作用。但这种行为也可能会阻止你删除它们。如果你想删除 OneNote 文件或希望它们在目录列表中显示,请设置此选项。

属性:

  • 配置项:expose_onenote_files
  • 环境变量:RCLONE_ONEDRIVE_EXPOSE_ONENOTE_FILES
  • 类型:布尔值
  • 默认值:false

–onedrive-server-side-across-configs

已弃用:请使用 –server-side-across-configs 代替。

允许跨不同 OneDrive 配置进行服务器端操作(例如复制)。

如果你在两个个人版 OneDrive 驱动器之间复制文件,并且要复制的文件已经在它们之间共享,那么此选项将起作用。此外,对于在同一租户下同时拥有商业版 OneDrive 和 SharePoint 访问权限的用户,以及在同一租户下的两个 SharePoint 之间,此选项也应该可以正常工作。在其他情况下,rclone 将回退到正常复制(这会稍微慢一些)。

属性:

  • 配置项:server_side_across_configs
  • 环境变量:RCLONE_ONEDRIVE_SERVER_SIDE_ACROSS_CONFIGS
  • 类型:布尔值
  • 默认值:false

–onedrive-list-chunk

列表块的大小。

属性:

  • 配置项:list_chunk
  • 环境变量:RCLONE_ONEDRIVE_LIST_CHUNK
  • 类型:整数
  • 默认值:1000

–onedrive-no-versions

在修改操作时删除所有版本。

当 rclone 上传新文件覆盖现有文件或设置修改时间时,商业版 OneDrive 会创建文件版本。

这些版本会占用配额空间。

此标志会在文件上传和设置修改时间后检查版本,并删除除最后一个版本之外的所有版本。

注意:目前个人版 OneDrive 无法删除版本,因此请勿在此处使用此标志。

属性:

  • 配置项:no_versions
  • 环境变量:RCLONE_ONEDRIVE_NO_VERSIONS
  • 类型:布尔值
  • 默认值:false

–onedrive-hard-delete

删除文件时永久删除。

通常,删除文件时会将其发送到回收站。设置此标志会导致文件被永久删除。请谨慎使用。

个人版 OneDrive 账户不支持永久删除 API,此选项仅适用于商业版 OneDrive 和 SharePoint 文档库。

属性:

  • 配置项:hard_delete
  • 环境变量:RCLONE_ONEDRIVE_HARD_DELETE
  • 类型:布尔值
  • 默认值:false

–onedrive-link-scope

设置 link 命令创建的链接的范围。

属性:

  • 配置项:link_scope
  • 环境变量:RCLONE_ONEDRIVE_LINK_SCOPE
  • 类型:字符串
  • 默认值:“anonymous”
  • 示例:
    • “anonymous”
      • 任何拥有链接的人都可以访问,无需登录。
      • 这可能包括你组织外部的人员。
      • 管理员可能会禁用匿名链接支持。
    • “organization”
      • 任何登录到你组织(租户)的人都可以使用该链接进行访问。
      • 仅适用于商业版 OneDrive 和 SharePoint。

–onedrive-link-type

设置 link 命令创建的链接的类型。

属性:

  • 配置项:link_type
  • 环境变量:RCLONE_ONEDRIVE_LINK_TYPE
  • 类型:字符串
  • 默认值:“view”
  • 示例:
    • “view”
      • 创建一个指向项目的只读链接。
    • “edit”
      • 创建一个指向项目的读写链接。
    • “embed”
      • 创建一个可嵌入的指向项目的链接。

–onedrive-link-password

设置 link 命令创建的链接的密码。

截至编写本文时,此选项仅适用于付费的个人版 OneDrive 账户。

属性:

  • 配置项:link_password
  • 环境变量:RCLONE_ONEDRIVE_LINK_PASSWORD
  • 类型:字符串
  • 是否必需:否

–onedrive-hash-type

指定后端使用的哈希类型。

这指定了使用的哈希类型。如果设置为 “auto”,则将使用默认哈希 QuickXorHash。

在 rclone 1.62 之前,个人版 OneDrive 默认使用 SHA1 哈希。从 1.62 及更高版本开始,所有 OneDrive 类型的默认哈希是 QuickXorHash。如果需要 SHA1 哈希,请相应地设置此选项。

从 2023 年 7 月开始,QuickXorHash 将是商业版 OneDrive 和个人版 OneDrive 唯一可用的哈希类型。

可以将其设置为 “none” 以不使用任何哈希。

如果对象上不存在请求的哈希,则将其作为空字符串返回,rclone 将其视为缺少哈希。

属性:

  • 配置项:hash_type
  • 环境变量:RCLONE_ONEDRIVE_HASH_TYPE
  • 类型:字符串
  • 默认值:“auto”
  • 示例:
    • “auto”
      • rclone 选择最佳哈希
    • “quickxor”
      • QuickXor
    • “sha1”
      • SHA1
    • “sha256”
      • SHA256
    • “crc32”
      • CRC32
    • “none”
      • 不使用任何哈希

–onedrive-av-override

允许下载服务器认为有病毒的文件。

OneDrive/SharePoint 服务器可能会使用防病毒检查器检查上传的文件。如果检测到任何潜在的病毒或恶意软件,它将阻止文件下载。

在这种情况下,你会看到类似以下的消息:

服务器报告此文件感染了病毒 - 使用 --onedrive-av-override 仍可下载:感染(病毒名称):403 禁止访问: 

如果你 100% 确定要下载此文件,请使用 –onedrive-av-override 标志,或在配置文件中设置 av_override = true。

属性:

  • 配置项:av_override
  • 环境变量:RCLONE_ONEDRIVE_AV_OVERRIDE
  • 类型:布尔值
  • 默认值:false

–onedrive-delta

如果设置,rclone 将使用增量列表来实现递归列表。

如果设置了此标志,OneDrive 后端将声明支持 ListR 进行递归列表。

设置此标志将大大加快以下操作的速度:

rclone lsf -R onedrive:
rclone size onedrive:
rclone rc vfs/refresh recursive=true

但是,增量列表 API 在驱动器的根目录下工作。如果你不在根目录下使用它,它将从根目录递归并丢弃你请求的目录之外的所有数据。因此,结果将是正确的,但可能效率不高。

这就是为什么此标志不是默认设置的原因。

一般来说,如果你的大部分数据都在 rclone 的根目录下(即 onedrive:root/directory 中的 root/directory),那么使用此标志将大大提高性能。如果你的数据大部分不在根目录下,使用此标志将导致性能大幅下降。

如果你将 OneDrive 挂载在根目录(或在使用 crypt 时接近根目录)并使用 rclone rc vfs/refresh,建议使用此标志。

属性:

  • 配置项:delta
  • 环境变量:RCLONE_ONEDRIVE_DELTA
  • 类型:布尔值
  • 默认值:false

–onedrive-metadata-permissions

控制是否应在元数据中读取或写入权限。

从文件中读取权限元数据可以快速完成,但并不总是希望从元数据中设置权限。

属性:

  • 配置项:metadata_permissions
  • 环境变量:RCLONE_ONEDRIVE_METADATA_PERMISSIONS
  • 类型:Bits
  • 默认值:off
  • 示例:
    • “off”
      • 不读取或写入该值
    • “read”
      • 仅读取该值
    • “write”
      • 仅写入该值
    • “read,write”
      • 读取和写入该值。
    • “failok”
      • 如果写入失败,仅记录错误,不使传输失败

–onedrive-encoding

后端的编码方式。

有关更多信息,请参阅 概述中的编码部分

属性:

  • 配置项:encoding
  • 环境变量:RCLONE_ONEDRIVE_ENCODING
  • 类型:Encoding
  • 默认值:Slash,LtGt,DoubleQuote,Colon,Question,Asterisk,Pipe,BackSlash,Del,Ctl,LeftSpace,LeftTilde,RightSpace,RightPeriod,InvalidUtf8,Dot

–onedrive-description

远程存储的描述。

属性:

  • 配置项:description
  • 环境变量:RCLONE_ONEDRIVE_DESCRIPTION
  • 类型:字符串
  • 是否必需:否

元数据

OneDrive 支持文件和目录的系统元数据(截至编写本文时,不支持用户元数据)。大部分元数据是只读的,个人版 OneDrive 和商业版 OneDrive 之间存在一些差异(详见下表)。

如果设置了 --onedrive-metadata-permissions,还支持权限。--onedrive-metadata-permissions 的可接受值为 “read”、“write”、“read,write” 和 “off”(默认值)。“write” 支持添加新权限、更新现有权限的 “角色” 以及删除权限。更新和删除权限需要知道权限 ID,因此如果你希望更新/删除权限,建议使用 “read,write” 而不是 “write”。

权限以 JSON 格式读取/写入,使用与 OneDrive API 相同的架构,个人版 OneDrive 和商业版 OneDrive 之间略有不同。

Example for OneDrive Personal:

[
	{
		"id": "1234567890ABC!123",
		"grantedTo": {
			"user": {
				"id": "[email protected]"
			},
			"application": {},
			"device": {}
		},
		"invitation": {
			"email": "[email protected]"
		},
		"link": {
			"webUrl": "https://1drv.ms/t/s!1234567890ABC"
		},
		"roles": [
			"read"
		],
		"shareId": "s!1234567890ABC"
	}
]

Example for OneDrive Business:

[
	{
		"id": "48d31887-5fad-4d73-a9f5-3c356e68a038",
		"grantedToIdentities": [
			{
				"user": {
					"displayName": "[email protected]"
				},
				"application": {},
				"device": {}
			}
		],
		"link": {
			"type": "view",
			"scope": "users",
			"webUrl": "https://contoso.sharepoint.com/:w:/t/design/a577ghg9hgh737613bmbjf839026561fmzhsr85ng9f3hjck2t5s"
		},
		"roles": [
			"read"
		],
		"shareId": "u!LKj1lkdlals90j1nlkascl"
	},
	{
		"id": "5D33DD65C6932946",
		"grantedTo": {
			"user": {
				"displayName": "John Doe",
				"id": "efee1b77-fb3b-4f65-99d6-274c11914d12"
			},
			"application": {},
			"device": {}
		},
		"roles": [
			"owner"
		],
		"shareId": "FWxc1lasfdbEAGM5fI7B67aB5ZMPDMmQ11U"
	}
]

若要写入权限,请使用相同的格式传入一个 “permissions” 元数据键。--metadata-mapper 工具对此非常有用。

在添加权限时,可以在 grantedTograntedToIdentitiesUser.IDDisplayName 属性中提供电子邮件地址。或者,也可以在 User.ID 中提供对象 ID。为用户添加权限时,必须至少提供一个有效的接收者。如果将 Link.Scope 设置为 "anonymous",也支持创建公共链接。

使用 --metadata-mapper 添加 “read” 权限的示例请求:

{
    "Metadata": {
        "permissions": "[{\"grantedToIdentities\":[{\"user\":{\"id\":\"[email protected]\"}}],\"roles\":[\"read\"]}]"
    }
}

请注意,如果文件/文件夹已经存在冲突的权限,添加权限可能会失败。

要更新现有权限,请同时包含权限 ID 和要分配的新 rolesroles 是唯一可以更改的属性。

要删除权限,请传入一个仅包含你希望保留的权限的内容(可以为空,以删除所有权限)。请注意,owner 角色将被忽略,因为它无法被删除。

请注意,读取和写入权限都需要额外的 API 调用,因此如果你不需要读取或写入权限,建议省略 --onedrive-metadata-permissions

元数据和权限支持文件夹(目录)以及文件。请注意,仅在 OneDrive 商业版上,设置文件夹的 mtimebtime 需要额外的一次 API 调用。

OneDrive 目前不支持用户元数据。写入元数据时,只会写入可写的系统属性 —— 传入的任何只读或无法识别的键都将被忽略。

提示:要查看任何文件或文件夹的元数据和权限,请运行:

rclone lsjson remote:path --stat -M --onedrive-metadata-permissions read

以下是 OneDrive 后端可能的系统元数据项。

名称 说明 类型 示例 只读
btime 文件创建时间,精确到秒(个人版 OneDrive 精确到毫秒)。 RFC 3339 2006-01-02T15:04:05Z
content-type 文件的 MIME 类型。 字符串 text/plain
created-by-display-name 创建该项目的用户显示名称。 字符串 John Doe
created-by-id 创建该项目的用户 ID。 字符串 48d31887-5fad-4d73-a9f5-3c356e68a038
description 文件的简短描述,最多 1024 个字符,仅个人版 OneDrive 支持。 字符串 待签署的合同
id 项目在 OneDrive 内的唯一标识符。 字符串 01BYE5RZ6QN3ZWBTUFOFD3GSPGOHDJD36K
last-modified-by-display-name 最后修改该项目的用户显示名称。 字符串 John Doe
last-modified-by-id 最后修改该项目的用户 ID。 字符串 48d31887-5fad-4d73-a9f5-3c356e68a038
malware-detected OneDrive 是否检测到项目包含恶意软件。 布尔值 true
mtime 最后修改时间,精确到秒(个人版 OneDrive 精确到毫秒)。 RFC 3339 2006-01-02T15:04:05Z
package-type 如果存在,表明该项目是一个包,而非文件夹或文件。包在某些上下文中被视为文件,在其他上下文中被视为文件夹。 字符串 oneNote
permissions OneDrive 格式的 JSON 权限信息。使用 --onedrive-metadata-permissions 启用。属性:id、grantedTo、grantedToIdentities、invitation、inheritedFrom、link、roles、shareId JSON {}
shared-by-id 共享该项目的用户 ID(如果已共享)。 字符串 48d31887-5fad-4d73-a9f5-3c356e68a038
shared-owner-id 共享项目的所有者 ID(如果已共享)。 字符串 48d31887-5fad-4d73-a9f5-3c356e68a038
shared-scope 如果已共享,表明项目的共享范围:匿名、组织或用户。 字符串 users
shared-time 项目共享时间,精确到秒(个人版 OneDrive 精确到毫秒)。 RFC 3339 2006-01-02T15:04:05Z
utime 上传时间,精确到秒(个人版 OneDrive 精确到毫秒)。 RFC 3339 2006-01-02T15:04:05Z

更多信息请参阅 元数据 文档。

以管理员身份模拟其他用户

与 Google Drive 通过服务账户模拟任何域用户不同,OneDrive 要求你以管理员账户进行身份验证,并为每个你希望模拟的用户手动设置一个远程存储。

  1. Microsoft 365 管理中心 中,打开每个你需要“模拟”的用户,然后转到 OneDrive 部分。有一个名为“获取文件访问权限”的标题,你需要点击它来创建链接,这将创建格式为 https://{租户}-my.sharepoint.com/personal/{用户名_域名_顶级域名}/ 的链接,同时更改权限,使你的管理员用户可以访问。
  2. 然后在 PowerShell 中运行以下命令:
Install-Module Microsoft.Graph -Scope CurrentUser -Repository PSGallery -Force
Import-Module Microsoft.Graph.Files
Connect-MgGraph -Scopes "Files.ReadWrite.All"
# Follow the steps to allow access to your admin user
# Then run this for each user you want to impersonate to get the Drive ID
Get-MgUserDefaultDrive -UserId '{emailaddress}'
# This will give you output of the format:
# Name     Id                                                                 DriveType CreatedDateTime
# ----     --                                                                 --------- ---------------
# OneDrive b!XYZ123                                                           business  14/10/2023 1:00:58 pm
  1. 然后在 rclone 中添加一个 OneDrive 远程存储类型,并使用上一步中获取的驱动器 ID 选择 “输入驱动器 ID”。每个用户对应一个远程存储。之后它会确认驱动器 ID,并有望显示一条消息 找到类型为 "business" 的驱动器 "root",然后会包含格式为 https://{租户}-my.sharepoint.com/personal/{用户名_域名_顶级域名}/Documents 的 URL。

限制

如果您连续 90 天不使用 rclone,刷新令牌将会过期。这将导致授权问题。解决此问题很简单,只需运行 rclone config reconnect remote: 命令来获取新的令牌和刷新令牌。

命名规则

请注意,OneDrive 不区分大小写,因此您不能同时拥有名为 “Hello.doc” 和 “hello.doc” 的文件。

OneDrive 文件名中不能包含很多字符。这些字符在 Windows 平台上是不允许的,但在非 Windows 平台上很常见。rclone 会将这些文件名映射为外观相同的 Unicode 等效字符。例如,如果文件名称中包含 ?,它将被映射为

文件大小

个人版 OneDrive 和商业版 OneDrive 允许的最大文件大小均为 250 GiB (2021 年 1 月 13 日更新)

路径长度

对于 OneDrive、商业版 OneDrive 和 SharePoint Online,包括文件名在内的整个路径长度必须少于 400 个字符。如果您使用 rclone 对文件和文件夹名称进行加密,可能需要注意此限制,因为加密后的名称通常比原始名称更长。

文件数量

OneDrive 似乎可以正常处理文件夹中至少 50,000 个文件,但当文件数量达到 100,000 个时,rclone 在列出目录时会出现错误,如 无法列出文件:UnknownError:。更多信息请参阅 #2707

有关不同类型 OneDrive 限制的官方文档可在 此处 找到。

版本管理

OneDrive 中文件的每次更改都会导致服务为该文件创建一个新版本。这会占用用户的配额空间。例如,更改文件的修改时间会创建第二个版本,因此该文件显然会占用两倍的空间。

例如,copy 命令会受到此影响,因为 rclone 复制文件后会将修改时间设置为与源文件匹配,这会使用另一个版本。

您可以使用 rclone cleanup 命令(见下文)来删除所有旧版本。

或者,您可以将 no_versions 参数设置为 true,rclone 会在创建新版本的操作后删除这些版本。这会增加额外的事务,因此仅在需要时启用此功能。

注意:在撰写本文时,个人版 OneDrive 会创建版本(但更改修改时间时不会),但删除版本的 API 会返回 “未找到 API” 错误,因此个人版 OneDrive 不应使用清理和 no_versions 功能。

禁用版本控制

从 2018 年 10 月开始,用户默认将无法再禁用版本控制。这是因为 Microsoft 对该机制进行了更新。要更改此新默认设置,SharePoint 管理员需要在 PowerShell 中运行命令。如果您是管理员,可以在 PowerShell 中运行以下命令来更改该设置:

  1. Install-Module -Name Microsoft.Online.SharePoint.PowerShell(如果您尚未安装此模块)
  2. Import-Module Microsoft.Online.SharePoint.PowerShell -DisableNameChecking
  3. Connect-SPOService -Url https://YOURSITE-admin.sharepoint.com -Credential [email protected](将 YOURSITEYOUYOURSITE.COM 替换为实际值;这将提示您输入凭据)
  4. Set-SPOTenant -EnableMinimumVersionRequirement $False
  5. Disconnect-SPOService(断开与服务器的连接)

以下是普通用户禁用版本控制的步骤。如果您没有看到 “无版本控制” 选项,请确保满足上述要求。

用户 Weropol 找到了一种在 OneDrive 上禁用版本控制的方法:

  1. 点击商业版 OneDrive 页面顶部的齿轮图标,打开设置菜单。
  2. 点击 “网站设置”。
  3. 在 “网站设置” 页面上,导航到 “网站管理” > “网站库和列表”。
  4. 点击 “自定义” “文档”。
  5. 点击 “常规设置” > “版本控制设置”。
  6. 在 “文档版本历史记录” 下,选择 “无版本控制” 选项。 注意:这将禁用新文件版本的创建,但不会删除任何以前的版本。您的文档是安全的。
  7. 点击 “确定” 应用更改。
  8. 使用 rclone 上传或修改文件。(我还使用了 --no-update-modtime 标志)
  9. 使用 rclone 后恢复版本控制设置。(可选)

清理

OneDrive 支持 rclone cleanup 命令,该命令会使 rclone 遍历指定路径下的每个文件,并删除除当前版本之外的所有版本。由于这涉及遍历所有文件,然后查询每个文件的版本,因此可能会比较慢。rclone 会并行执行 --checkers 个测试。该命令还支持 --interactive/i--dry-run,这是查看其操作的好方法。

rclone cleanup --interactive remote:path/subdir # 交互式删除 path/subdir 下的所有旧版本
rclone cleanup remote:path/subdir               # 无条件删除 path/subdir 下的所有旧版本

注意:目前个人版 OneDrive 无法删除版本

故障排除

SharePoint 上的过度限流或阻止

如果您在 SharePoint 上遇到过度限流或被阻止的情况,可以通过设置如下标志来显式设置用户代理:--user-agent "ISV|rclone.org|rclone/v1.55.1"

具体细节可在 Microsoft 文档中找到:避免在 SharePoint Online 中被限流或阻止

SharePoint 上意外的文件大小/哈希差异

这是一个已知问题,SharePoint(而非 OneDrive 或商业版 OneDrive)会悄悄修改上传的文件,主要是 Office 文件(.docx、.xlsx 等),导致文件大小和哈希检查失败。还有其他情况也会导致 OneDrive 报告不一致的文件大小。要在 SharePoint 上使用 rclone 处理受影响的文件,您可以使用以下命令行参数禁用这些检查:

--ignore-checksum --ignore-size

另外,如果你对 OneDrive 文件有写入权限,也可以尝试按以下步骤解决某些文件的问题。 打开 OneDrive 的网页界面,找到受影响的文件(这些文件会在 rclone 的错误消息或日志中显示)。只需依次点击这些文件,OneDrive 会在网页上打开它们。这会使每个文件在原地转换为功能等效但不再引发大小差异问题的格式。所有有问题的文件转换完成后,你就不再需要上述的忽略选项了。

在 SharePoint 上替换/删除现有文件时出现“未找到项目”错误

这是一个已知问题,即当用户尝试替换或删除已上传的文件时,SharePoint(而非 OneDrive 或 OneDrive for Business)可能会返回“未找到项目”错误;这似乎主要影响 Office 文件(如 .docx、.xlsx 等)和网页文件(如 .html、.aspx 等)。作为一种解决方法,你可以使用 --backup-dir <备份目录> 命令行参数,让 rclone 将需要替换/删除的文件移动到指定的备份目录中(而不是直接替换/删除它们)。例如,要指示 rclone 将文件移动到后端 mysharepoint 上的 rclone-backup-dir 目录中,你可以使用:

--backup-dir mysharepoint:rclone-backup-dir

access_denied (AADSTS65005)

Error: access_denied
Code: AADSTS65005
Description: Using application 'rclone' is currently not supported for your organization [YOUR_ORGANIZATION] because it is in an unmanaged state. An administrator needs to claim ownership of the company by DNS validation of [YOUR_ORGANIZATION] before the application rclone can be provisioned.

This means that rclone can’t use the OneDrive for Business API with your account. You can’t do much about it, maybe write an email to your admins.

However, there are other ways to interact with your OneDrive account. Have a look at the WebDAV backend: https://rclone.cn/webdav/#sharepoint

invalid_grant (AADSTS50076)

Error: invalid_grant
Code: AADSTS50076
Description: Due to a configuration change made by your administrator, or because you moved to a new location, you must use multi-factor authentication to access '...'.

如果你在为账户启用多因素认证后看到上述错误,可以通过刷新 OAuth 刷新令牌来解决。要做到这一点,请运行 rclone config,并选择编辑你的 OneDrive 后端。然后,在遇到问题 Already have a token - refresh? 之前,你实际上不需要进行任何更改。对于这个问题,回答 y 并按照流程刷新令牌,就像第一次配置后端时一样。之后,rclone 应该可以再次用于此后端。

创建公共链接时请求无效

在 SharePoint 和 OneDrive for Business 上,rclone link 可能会返回 “请求无效” 错误。一个可能的原因是组织管理员不允许为组织/SharePoint 库创建公共链接。要作为管理员修复权限,请查看文档: 12

无法访问与我共享的文件

目前,rclone 不支持 访问与我共享的文件,但有一个解决方法:

  1. 访问 https://onedrive.live.com
  2. 右键单击 共享 中的某个项目,然后在上下文菜单中点击 添加到我的文件的快捷方式
    make_shortcut
    截图 (与我共享)
  3. 快捷方式将出现在 我的文件 中,你可以使用 rclone 访问它,它的行为就像一个普通的文件夹/文件。
    in_my_files
    截图 (我的文件)
    rclone_mount
    截图 (rclone 挂载)

从 iOS 上传的动态照片(.heic 文件中的小视频片段)

2020 年,iOS OneDrive 应用引入了 动态照片上传和存储 功能。遗憾的是,这些上传的动态照片的使用和下载仍在开发中,这在复制、同步和挂载时会引发一些问题 —— 在 rclone 和 Windows 原生 OneDrive 客户端中都是如此。

如果你在 OneDrive 网页界面中找到一张动态照片,就可以很容易地看到问题的根源。然后从网页界面下载这张照片。你会发现下载的 .heic 文件的大小比网页界面中显示的大小要小。下载的文件较小是因为它只包含从存储在 OneDrive 中的动态照片(视频)中提取的单帧(静态照片)。

不同的大小会导致 rclone copy/sync 反复重新复制未修改的照片,如下所示:

DEBUG : 20230203_123826234_iOS.heic: 大小不同 (源 4470314 字节,目标 1298667 字节)
DEBUG : 20230203_123826234_iOS.heic: sha1 = fc2edde7863b7a7c93ca6771498ac797f8460750 正常
INFO  : 20230203_123826234_iOS.heic: 已复制 (替换现有文件)

可以通过添加 --ignore-size 来解决这些重复复制的问题。请注意,此解决方法仅同步静态图片,而不同步视频片段,并且依赖于所有情况下所有文件的修改日期都能正确更新。

不同的大小还会导致 rclone check 报告大小错误,如下所示:

ERROR : 20230203_123826234_iOS.heic: 大小不同

可以通过添加 --ignore-size 来抑制这些检查错误。

不同的大小还会导致 rclone mount 在下载时失败,并出现类似以下的错误:

ERROR : 20230203_123826234_iOS.heic: ReadFileHandle.Read 错误: 底层重试 1/10: 意外的文件结束

或者在使用 --cache-mode=full 时出现类似以下的错误:

INFO  : 20230203_123826234_iOS.heic: vfs 缓存: 下载器: 错误计数现在为 1: vfs 读取器: 无法写入缓存文件: 416 请求范围不满足:
ERROR : 20230203_123826234_iOS.heic: vfs 缓存: 下载失败: vfs 读取器: 无法写入缓存文件: 416 请求范围不满足: