OneDrive实现跨平台数据同步

需求分析

课题背景:有一台Parrot的PC,有两台Windows的PC,经常两台电脑需要传文件,但电脑放在不同的地点,一直以来用U盘和百度网盘解决。
课题目标:通过将网盘以本地磁盘的方式挂载到每一台PC上,直接以类似本地磁盘操作的方式实现多平台多PC的资料共享与同步
如果你的需求亦是如此,上车吧。

OneDrive

话说,OneDrive对网内用户并不友好,尤其是个人的网页版是无法在墙内访问的。
其次,个人版的OneDrive只有5G容量,白嫖的教育版5T起步,但教育邮箱是个门槛,而且理论上管理员是可以查看你存储的内容甚至删除,所以如果你的邮箱是临时申请的,请不要存储隐私内容,顺便一提,个人版是有专门的保密柜的,每次打开强制身份认证,20分钟不使用自动关闭。
不过即使是临时邮箱,只要管理员没有恶意,不用担心你的邮箱被别人申请操纵你的网盘,它只在申请时会用到,office账户的操作不再使用,所以管理员不存在恶意的情况下相对安全。

OneDrive实现跨平台数据同步_第1张图片
总结一下:

个人版:容量小,安全,墙内不支持网页版(所以某些认证会受限)
教育版:容量大,安全性相对低,支持网页版访问

你会做何选择呢?成年人表示全都要,2333333

OneDrive实现跨平台数据同步_第2张图片

Windows

Windows下的部署接近傻瓜式,得益于RaiDrive。

官网:https://www.raidrive.com/

这个安装和添加操作是在无脑,在此不做展开,官网没找到free download的点,在此分享自用的1.6版本。

https://pan.baidu.com/s/1sWBzh3qraE8_wjUCeC3aXQ

借助RaiDrive我们可以将OneDrive以磁盘的方式挂载到本地,最终效果图:

OneDrive实现跨平台数据同步_第3张图片

Linux

Linux平台首先说下我走过的坑。
开始为了偷懒选择的是onedrive-d,对个人版的认证需要访问网页,即onedrive.live.com,这就是我上面提到的认证受限,其次对教育版的认证是登录微软账户,然而,难道微软账户和office不是一个东西?

OneDrive实现跨平台数据同步_第4张图片

笔者最终选择放弃,选择rclone,以下内容请以root运行,笔者已建好rabbitmask,新建一个carrot举例。

rclone安装
wget https://www.moerats.com/usr/shell/rclone_debian.sh && bash rclone_debian.sh
rclone config
Current remotes:

Name                 Type
====                 ====
rabbitmask           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> n
name> carrot
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
 1 / 1Fichier
   \ "fichier"
 2 / Alias for an existing remote
   \ "alias"
 3 / Amazon Drive
   \ "amazon cloud drive"
 4 / Amazon S3 Compliant Storage Provider (AWS, Alibaba, Ceph, Digital Ocean, Dreamhost, IBM COS, Minio, etc)
   \ "s3"
 5 / Backblaze B2
   \ "b2"
 6 / Box
   \ "box"
 7 / Cache a remote
   \ "cache"
 8 / Citrix Sharefile
   \ "sharefile"
 9 / Dropbox
   \ "dropbox"
10 / Encrypt/Decrypt a remote
   \ "crypt"
11 / FTP Connection
   \ "ftp"
12 / Google Cloud Storage (this is not Google Drive)
   \ "google cloud storage"
13 / Google Drive
   \ "drive"
14 / Google Photos
   \ "google photos"
15 / Hubic
   \ "hubic"
16 / JottaCloud
   \ "jottacloud"
17 / Koofr
   \ "koofr"
18 / Local Disk
   \ "local"
19 / Mail.ru Cloud
   \ "mailru"
20 / Mega
   \ "mega"
21 / Microsoft Azure Blob Storage
   \ "azureblob"
22 / Microsoft OneDrive
   \ "onedrive"
23 / OpenDrive
   \ "opendrive"
24 / Openstack Swift (Rackspace Cloud Files, Memset Memstore, OVH)
   \ "swift"
25 / Pcloud
   \ "pcloud"
26 / Put.io
   \ "putio"
27 / QingCloud Object Storage
   \ "qingstor"
28 / SSH/SFTP Connection
   \ "sftp"
29 / Transparently chunk/split large files
   \ "chunker"
30 / Union merges the contents of several remotes
   \ "union"
31 / Webdav
   \ "webdav"
32 / Yandex Disk
   \ "yandex"
33 / http Connection
   \ "http"
34 / premiumize.me
   \ "premiumizeme"
Storage> 22
** 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?state=w-RJ_q2kZM-8ip50VOerAQ
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 1 drives, please select the one you want to use:
0:  (personal) id=8e5cb089c5445907
Chose drive to use:> 0
Found drive 'root' of type 'personal', URL: https://onedrive.live.com/?cid=8e5cb089c5445907
Is that okay?
y) Yes
n) No
y/n> y
2019/11/02 10:38:14 ERROR : Failed saving config "drive_id" = "8e5cb089c5445907" in section "carrot" of the config file: section 'carrot' not found
2019/11/02 10:38:14 ERROR : Failed saving config "drive_type" = "personal" in section "carrot" of the config file: section 'carrot' not found
--------------------
[carrot]
type = onedrive
token = {"access_token":"**************"}
drive_id = 8e5cb089c5445907
drive_type = personal
--------------------
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y
Current remotes:

Name                 Type
====                 ====
carrot               onedrive
rabbitmask           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

首先要说的就是没必要按照网上流传的那样一定要从Windows端将token生成,取消自认证然后手动粘贴,Linux平台的自认证完全可以。

挂载磁盘

自启动的原理其实就是自动挂载,但这里先手动挂载下梳理下流程。

mkdir /root/carrot
rclone mount carrot: /root/carrot --copy-links --no-gzip-encoding --no-check-certificate --allow-other --allow-non-empty --umask 000

emmm,5G的个人云盘用来做私密文件存储,5T的白嫖盘用来存放体积较大的公开性文件和临时文件。

OneDrive实现跨平台数据同步_第5张图片
#解除挂载
fusermount -qzu /root/carrot
rclone自启动
#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
NAME_BIN="reclone"
### BEGIN INIT INFO
# Provides:          rclone
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start rclone at boot time
# Description:       Enable rclone by daemon.
### END INIT INFO

NAME="" #rclone name名
REMOTE='' #远程文件夹
LOCAL='' #挂载地址

Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m"
Info="${Green_font_prefix}[信息]${Font_color_suffix}"
Error="${Red_font_prefix}[错误]${Font_color_suffix}"
RETVAL=0

check_running(){
    PID="$(ps -C $NAME_BIN -o pid= |head -n1 |grep -o '[0-9]\{1,\}')"
    if [[ ! -z ${PID} ]]; then
        return 0
    else
        return 1
    fi
}
do_start(){
    check_running
    if [[ $? -eq 0 ]]; then
        echo -e "${Info} $NAME_BIN (PID ${PID}) 正在运行..." && exit 0
    else
        fusermount -zuq $LOCAL >/dev/null 2>&1
        mkdir -p $LOCAL
        /usr/bin/rclone mount $NAME:$REMOTE $LOCAL --copy-links --no-gzip-encoding --no-check-certificate --allow-other --allow-non-empty --umask 000 >/dev/null 2>&1 &
        sleep 2s
        check_running
        if [[ $? -eq 0 ]]; then
            echo -e "${Info} $NAME_BIN 启动成功 !"
        else
            echo -e "${Error} $NAME_BIN 启动失败 !"
        fi
    fi
}
do_stop(){
    check_running
    if [[ $? -eq 0 ]]; then
        kill -9 ${PID}
        RETVAL=$?
        if [[ $RETVAL -eq 0 ]]; then
            echo -e "${Info} $NAME_BIN 停止成功 !"
        else
            echo -e "${Error} $NAME_BIN 停止失败 !"
        fi
    else
        echo -e "${Info} $NAME_BIN 未运行"
        RETVAL=1
    fi
    fusermount -zuq $LOCAL >/dev/null 2>&1
}
do_status(){
    check_running
    if [[ $? -eq 0 ]]; then
        echo -e "${Info} $NAME_BIN (PID $(echo ${PID})) 正在运行..."
    else
        echo -e "${Info} $NAME_BIN 未运行 !"
        RETVAL=1
    fi
}
do_restart(){
    do_stop
    do_start
}
case "$1" in
    start|stop|restart|status)
    do_$1
    ;;
    *)
    echo "使用方法: $0 { start | stop | restart | status }"
    RETVAL=1
    ;;
esac
exit $RETVAL

补充其中的三行,/代表的是OneDrive全盘。

NAME="carrot" #rclone name名
REMOTE='/' #远程文件夹
LOCAL='/root/carrot' #挂载地址
mv rcloned /etc/init.d/rcloned
chmod +x /etc/init.d/rcloned
update-rc.d -f rcloned defaults
bash /etc/init.d/rcloned start
移除开机脚本:
update-rc.d -f rcloned remove

假装END

如果你使用的是root登录的vps,以上操作到这里就结束了,可能涉及到rclone服务问题,不支持同时定义两个,所以需要手动切换自动挂载脚本。
但如果你使用的和我一样是parrot等高端血统的Linux,emmmm,可能要翻车了,普通用户登录并不会成功启动,因为其中的挂载命令需要root权限。
接下来,你可以在登录成功的情况下手动启动脚本,不支持交互式sudo,必须先切到su root,然后手动启动:

/etc/init.d/rcloned start

同样多个挂载切换需要先停掉这个,再切:

/etc/init.d/rcloned stop
/etc/init.d/rclonedtmp start
OneDrive实现跨平台数据同步_第6张图片
我:???

唉,虽说parrot一族贵在折腾,这也忒low了。。。。

后来,通过修改 /etc/profile 测试,emmm,目测会翻车,因为命令会卡死!笔者物理机,方案果断pass。

最终!!还是自己写个脚本手动拉起吧,关键就是在parrot上,这玩意儿有毒吧,挂载命令会卡住!导致sudo交互式都有问题,所以我们还是借助已创建的脚本,创建onedrive.sh,切记切记,su root后再运行:

#!/bin/bash
/etc/init.d/rcloned start && /etc/init.d/rclonedtmp start 

脚本的逻辑是如果进程中存在rclone,则不执行命令,返回rclone正在运行,所以对于多项挂载我们需要调整下逻辑,改动下第二个脚本:

#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
NAME_BIN="reclone"
### BEGIN INIT INFO
# Provides:          rclone
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start rclone at boot time
# Description:       Enable rclone by daemon.
### END INIT INFO

NAME="rabbitmask" #rclone name名
REMOTE='/' #远程文件夹
LOCAL='/root/rabbitmask' #挂载地址

Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m"
Info="${Green_font_prefix}[信息]${Font_color_suffix}"
Error="${Red_font_prefix}[错误]${Font_color_suffix}"
RETVAL=0

check_running(){
    PID="$(ps -C $NAME_BIN -o pid= |tail -n1 |grep -o '[0-9]\{1,\}')"
    if [[ ! -z ${PID} ]]; then
        return 0
    else
        return 1
    fi
}
do_start(){
        fusermount -zuq $LOCAL >/dev/null 2>&1
        mkdir -p $LOCAL
        /usr/bin/rclone mount $NAME:$REMOTE $LOCAL --copy-links --no-gzip-encoding --no-check-certificate --allow-other --allow-non-empty --umask 000 >/dev/null 2>&1 &
        sleep 2s
        check_running
        if [[ $? -eq 0 ]]; then
            echo -e "${Info} $NAME_BIN 启动成功 !"
        else
            echo -e "${Error} $NAME_BIN 启动失败 !"
        fi
}
do_stop(){
    check_running
    if [[ $? -eq 0 ]]; then
        kill -9 ${PID}
        RETVAL=$?
        if [[ $RETVAL -eq 0 ]]; then
            echo -e "${Info} $NAME_BIN 停止成功 !"
        else
            echo -e "${Error} $NAME_BIN 停止失败 !"
        fi
    else
        echo -e "${Info} $NAME_BIN 未运行"
        RETVAL=1
    fi
    fusermount -zuq $LOCAL >/dev/null 2>&1
}
do_status(){
    check_running
    if [[ $? -eq 0 ]]; then
        echo -e "${Info} $NAME_BIN (PID $(echo ${PID})) 正在运行..."
    else
        echo -e "${Info} $NAME_BIN 未运行 !"
        RETVAL=1
    fi
}
do_restart(){
    do_stop
    do_start
}
case "$1" in
    start|stop|restart|status)
    do_$1
    ;;
    *)
    echo "使用方法: $0 { start | stop | restart | status }"
    RETVAL=1
    ;;
esac
exit $RETVAL

最终效果:

OneDrive实现跨平台数据同步_第7张图片

emmm,说实话,自启动处理我想了好多策略,依然不是很完美,细品还有很多不严谨的地方,确切的说依然没有绕过验证,对于普通用户来讲仍为手动启动,嘤嘤嘤,欢迎感兴趣的小伙伴参与交流。

真·END

最终我们实现的效果就是以挂载到本地的方式,实现了跨平台的数据同步:

OneDrive实现跨平台数据同步_第8张图片
OneDrive实现跨平台数据同步_第9张图片

顺便一提,OneDrive和OneNote均支持安装和iOS,笔者也自然也启用了,基本实现个人的所有电子设备数据同步,吹爆Microsoft,棒呆!

你可能感兴趣的:(OneDrive实现跨平台数据同步)