如何在Linux上同步OneDrive Business / Office 365?

Microsoft OneDrive Business/Office 365 Pro提供1 TB的云存储空间,但遗憾的是,目前还没有一种方法可以在Linux上同步它。

2欢迎来到[ubuntu.se]!我们是一个问答网站,而不是一个论坛。目前您在指定的问题部分既有一个问题又有一个答案。请编辑您的帖子,将答案删除并在下面的答案部分发布(页面底部应该有一个按钮)。谢谢! - Seth
可能是如何同步OneDrive for Business?的重复问题。 - bmaupin
以下所有方法对我都没有起作用。有效的方法是使用ExpandDrive https://www.expandrive.com/,这是一种付费解决方案。警告:我曾尝试使用ExpandDrive与Box进行操作,但它非常不稳定:当我尝试实时编辑LaTeX文件时,它会不断崩溃。使用ExpandDrive与OneDrive for Business似乎不那么容易出错,但如果它对我来说仍然经常崩溃,我会重新发布的,就像ExpandDrive for Box曾经做过的那样。 - Jeffrey Rolland
如果你在虚拟机中运行Linux(Windows主机和Linux客户机),你可以与Linux主机共享OneDrive文件夹。这样Linux就可以立即访问OneDrive。 - undefined
4个回答

Ubuntu 18.04及更高版本

更新:

以下使用apt安装的指令是可行的,但是apt中的版本过于陈旧,无法解析授权URI。相反,按照INSTALL.md文档中的说明从源代码编译和安装是可行的:

https://github.com/abraunegg/onedrive/blob/master/docs/INSTALL.md

之前:

在Ubuntu 18.04及更高版本的默认软件源中有一个OneDrive客户端。OneDrive是微软的云存储系统。该软件包提供了专门与OneDrive云存储同步的命令行客户端。

安装方法如下:

sudo apt install onedrive

首次运行时,它会要求您通过链接进行身份验证。身份验证后,您可以使用systemctl --user enable onedrive启用守护进程,然后使用systemctl --user start onedrive启动它。
它将在~/OneDrive本地监视和同步OneDrive数据。 更多说明可以在手册页man onedrive中找到。 设置非常简单,只需大约五分钟即可完成。

8这对OneDrive for Business不起作用。 - tricasse
2@tricasse 它适用于Office 365专业版。 - Mattia_98
1onedrive软件包的manpage清楚地说明它不支持OneDrive for Business。 - Tobias
“OneDrive for Business”需要管理员验证吗?如果由管理员验证,它能正常工作吗?为什么答案中没有明确说明这一点? - MUY Belgium
如果在使用OneDrive for Business时使用https://github.com/abraunegg/onedrive,需要进行管理员验证。 - Shaun Dewberry
2实际上,我在授权方面遇到了问题。因此,我按照https://github.com/abraunegg/onedrive/blob/master/docs/INSTALL.md中的说明最终解决了这个问题。目前一切都正常运行。 - cheffo
是的,对于Ubuntu 18.x来说,apt版本太过时了,无法解析您提供的授权URI。正如@cheffo所说,从源代码编译和安装的INSTALL.md文档效果很好。 - CivMeierFan
第一次运行时需要什么样的“URL响应”? - Gordon

目前,实验性的onedrive-d是一个开源程序,只能同步个人OneDrive帐户,因为它不接受Microsoft Sharepoint链接。这里有一种方法可以使用GoodSync for Linux来同步OneDrive Business/Office 365,该软件在个人使用时是免费的。
  1. 在您的Linux机器上安装适合的版本,例如:

    ./goodsync-linux-x86_64-release.run
    

    对于GoodSync Connect设置和GsServer Web UI都选择“否”。

  2. 在Web浏览器中打开OneDrive,在右下角选择“返回经典版OneDrive”。
  3. 您的浏览器中的网址现在应该是: https://xxxxxxx.sharepoint.com/xxxxxxxxxxx/Documents/Forms/All.aspx,根据此网址获取您的同步链接,它将是office365://xxxxxxx.sharepoint.com/xxxxxxxxxxx/Documents
  4. 在您的主目录下的.goodsync子文件夹中创建一个新文件:

    gedit ~/.goodsync/jobs.tix
    
  5. 在文件中输入以下代码并保存:

    <Job>
    Name = "OneDrive_Sync"
    Side1 = <SideOptions>
    Dir = <Connect>
        Url = "put_your_syncing_link_here"
        UserID = "put_your_OneDrive/Office365_Bussiness_email_here"
    </Connect>
    </SideOptions>
    Side2 = <SideOptions>
    Dir = <Connect>
        Url = "file:///your_home_folder/one_drive_folder"
    </Connect>
    </SideOptions>
    Direction = 0
    ExcludeHidden = No
    ExcludeSystem = No
    DetectMovesAndRenames = Yes
    LinksOption = 1
    ExcludeEmptyFolders = No
    LimitChangesPercent = 100
    AutoResolveConflicts = 3
    DetectMovesAndRenames = Yes
    </Job>
    
  6. 开始同步过程:

    gsync sync "OneDrive_Sync"
    
  7. 在此步骤中,您的Web浏览器将打开OneDrive/Office 365页面,并要求您授权允许goodsync访问您的帐户。输入您的凭据后,同步将开始。

限制:微软不允许超过270个字符长度的URL请求,因此GoodSync无法同步具有较长路径名的文件。
祝您愉快!

3我的网络浏览器在第7步无法打开授权页面。有没有办法手动操作呢? - pat-s
3我的网页浏览器无法打开登录页面。 - Haha TTpro
2办公室365的文件系统已被新的OneDrive V2 API取代。点击浏览按钮重新浏览到您的OneDrive同步文件夹,因为新的OneDrive需要基于浏览器的身份验证(OAuth2)。 - Ferroao

rclone 支持 OneDrive for Business。 请参阅文章 How To Mount OneDrive In Linux Using Rclone (Supports Business And Personal Accounts) - Linux Uprising Blog 了解用法。

以下是我在 Fedora 30 上使用 rclone 1.48.0 设置新的远程 onedrive1 的示例:

$ rclone config
2019/10/10 06:35:56 NOTICE: Config file ".config/rclone/rclone.conf" not found - using defaults
No remotes found - make a new one
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
name> onedrive1
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
⋮
19 / Microsoft OneDrive
   \ "onedrive"
⋮
Storage> 19      
** See help for onedrive backend at: https://rclone.org/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 auto config?
 * Say Y if not sure
 * Say N if you are working on a remote or headless machine
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 / Root Sharepoint site
   \ "sharepoint"
 3 / Type in driveID
   \ "driveid"
 4 / Type in SiteID
   \ "siteid"
 5 / Search a Sharepoint site
   \ "search"
Your choice> 1
Found 2 drives, please select the one you want to use:
0: OneDrive - Example Inc (business) id=b!gFLg-RRe****-T9B****
1: OneDrive - Example Inc (business) id=b!gFLg-RRe****-T-H****
Chose drive to use:> 1
Found drive 'root' of type 'business', URL: https://example-my.sharepoint.com/personal/myname_example_com/Documents
Is that okay?
y) Yes
n) No
y/n> y
Current remotes:

Name                 Type
====                 ====
onedrive1            onedrive

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> q

驱动器0的URL以/ElementinnerHTML结尾,在我的情况下不包含文件。
然后通过命令行、rclone-browser或者自v1.49起的Web GUI将其挂载到本地目录。

虽然原始和通常使用的onedrived工具由xybu仍不支持OneDrive for Business,但仅适用于个人OneDrives。 但是,GitHub上derrix060的这个项目的分叉却有一个某种程度上可以工作(但仍有错误)的商业客户端实现。
警告:当您使用此方法时,我强烈建议始终通过在https://www.office.com上在线检查文件来验证它们是否正确同步,并/或者使用本页末尾显示的包装脚本至少通过桌面通知了解任何错误!
有时候,onedrived似乎无法获取某些更改或正确上传它们,导致您的OneDrive处于(部分)未同步状态。也可能发生由于某种原因它与自身生成合并冲突,并在本地重命名您的文件,括号中附加您的主机名和可选的数字。不幸的是,没有关于错误的通知,但您可以在日志文件中看到这些条目。
如果发生这种情况,您可以通过触摸文件、重命名文件或所在文件夹来尝试再次同步相应的文件。
提示:看起来onedrived库经常出现问题,特别是对于直接保存在OneDrive根目录中的文件。最好将所有文件放在子目录中,而不是直接倾倒到OneDrive文件夹中。
虽然听起来很愚蠢,但我也注意到,通过OneDrive Web客户端上传文件并等待它们同步回本地文件夹(可能需要几分钟)似乎会导致较少的问题,而不是在本地创建、复制/移动文件。这是否实用或完全违背了OneDrive的目的,取决于您自己的决定...
有关完整的安装说明,请参阅项目的自述文件,但以下是简要摘要:
安装
确保您没有安装其他版本的onedrived(或onedrive-d)。
安装依赖包: ``` sudo apt install build-essential python3-dev libssl-dev inotify-tools python3-dbus libdbus-1-dev libdbus-glib-1-dev ```
从官方网站https://ngrok.com/download下载最新的Linux版ngrok客户端。Ubuntu软件仓库中的ngrok-client包版本过旧,不符合要求。 解压下载的ngrok-stable-linux-amd64.zip压缩包。其中包含一个ngrok二进制文件,将其放置在$PATH路径下,例如/usr/local/bin/。 可能无需注册ngrok账号。
使用pip3从GitHub安装onedrived Python3应用程序: ``` sudo -H pip3 install git+https://github.com/derrix060/onedriveClient.git ```
可选择为onedrived配置日志文件位置,以便在出现问题时进行检查,例如: ``` onedrived-pref config set logfile_path ~/.config/onedrived/onedrived.log ```

账户设置和驱动器配置

安装成功后,您需要配置您的账户和驱动器:

  1. 使用交互模式添加您的 OneDrive for Business 帐户,运行以下命令:

    onedrived-pref account add -b
    

    交互向导会要求您两次在浏览器中打开一个链接,在该链接中,您需要使用您的 Microsoft Business 帐户授权应用程序。
    它会要求您将确认授权后重定向到的 URL 粘贴回交互向导中。请按照指示操作并遵循命令给出的指示。

  2. 通过检查以下命令的输出来验证帐户是否成功添加。输出应该类似,并列出您登录的帐户:

    $ onedrived-pref account list
    
    与用户“YOUR_UBUNTU_USERNAME”关联的所有 OneDrive 帐户:
    
      #  帐户 ID                    拥有者姓名      电子邮件地址           配置文件类型
    ---  -------------------------  -------------  --------------------  --------------
      0  YOUR_PERSONAL_ACCOUNT_ID   YOUR_NAME      YOUR_BUSINESS_EMAIL   Business
    
  3. 通过运行以下命令,在交互命令模式下配置您的驱动器:

    onedrived-pref drive set
    

    您将看到所有驱动器的列表,并被要求输入您想要添加到本地配置的驱动器的行号。
    然后,您需要指定一个本地目录,用作与驱动器同步的根文件夹。您可以直接按 Enter 键,它将使用默认值 ~/OneDrive。如果路径不存在,它将被创建。 对于要使用的忽略文件的路径,您也可以直接按 Enter 键,它将使用默认值 ~/.config/onedrived/ignore_v2.txt 并在必要时创建。

  4. 检查以下命令的输出,以显示有关所有可用和已配置驱动器的信息。它应该在标题为 已设置的驱动器 下显示您刚刚设置的驱动器及其正确的设置:

    onedrived-pref drive list
    

启动守护进程

现在您的驱动器已配置完成,需要尝试启动 onedrived 守护进程。我建议首先以调试模式启动它,以防错过任何问题。这将在前台启动 onedrived

onedrived start --debug

如果一切正常,命令没有崩溃退出的话,试着将一些文件放在你的本地OneDrive文件夹中,看看是否同步。你可以通过访问OneDrive网页应用程序https://www.office.com并检查你在本地添加的文件是否出现在那里来验证这一点。
你可以通过在终端中按下Ctrl+C来退出onedrived进程。
要正常启动onedrived,作为后台守护进程运行它。请使用以下命令:
onedrived start

你应该将这个命令添加到启动应用程序中,这样每次登录时它都会自动启动。请参考如何在登录时自动启动应用程序?

错误通知的包装器

如果你想在onedrived记录错误(例如文件同步失败)时收到桌面通知,这里有一个包装脚本,它实时解析日志文件并使用notify-send将其显示给你。

你可以启动这个包装脚本而不带参数(或将其放入自动启动应用程序),而不是使用onedrived start命令。

#!/bin/bash
LOGFILE=~/.config/onedrived/onedrived.log
ICON_START=weather-overcast
ICON_STOP=weather-few-clouds
ICON_ERROR=weather-severe-alert

onexit () {
    onedrived stop
    notify-send -i "$ICON_STOP" "OneDrive" "Wrapper stopped"
    echo "onedrived-wrapper stopped"
}

trap onexit EXIT

onedrived stop
echo "---" >> "$LOGFILE"

onedrived start || {
    echo "Failed to start onedrived!"
    exit 1
}
notify-send -i "$ICON_START" "OneDrive" "Wrapper started"

echo "Monitoring onedrived.log for error messages..."
tail -n 1 -F --pid="$(pgrep -f "onedrived start")" "$LOGFILE" |
    while read LINE ; do
        echo "$LINE"
        if MESSAGE="$(grep -Pio '(?<=ERROR: ).*' <<< "$LINE")" ; then
            notify-send -i "$ICON_ERROR" "OneDrive Error" "$MESSAGE"
        fi
    done

我在输入第二个链接进行ODfB账户认证后,仍然收到“Failed to authorize onedrived: interaction_required.”的错误信息。你有什么想法,为什么会出现这种情况? - Jimakos
@Jimakos 抱歉,我从未遇到过那条消息。很遗憾,我不知道。 - Byte Commander