需求分析
课题背景:有一台Parrot的PC,有两台Windows的PC,经常两台电脑需要传文件,但电脑放在不同的地点,一直以来用U盘和百度网盘解决。
课题目标:通过将网盘以本地磁盘的方式挂载到每一台PC上,直接以类似本地磁盘操作的方式实现多平台多PC的资料共享与同步
如果你的需求亦是如此,上车吧。
OneDrive
话说,OneDrive对网内用户并不友好,尤其是个人的网页版是无法在墙内访问的。
其次,个人版的OneDrive只有5G容量,白嫖的教育版5T起步,但教育邮箱是个门槛,而且理论上管理员是可以查看你存储的内容甚至删除,所以如果你的邮箱是临时申请的,请不要存储隐私内容,顺便一提,个人版是有专门的保密柜的,每次打开强制身份认证,20分钟不使用自动关闭。
不过即使是临时邮箱,只要管理员没有恶意,不用担心你的邮箱被别人申请操纵你的网盘,它只在申请时会用到,office账户的操作不再使用,所以管理员不存在恶意的情况下相对安全。
总结一下:
个人版:容量小,安全,墙内不支持网页版(所以某些认证会受限)
教育版:容量大,安全性相对低,支持网页版访问
你会做何选择呢?成年人表示全都要,2333333
Windows
Windows下的部署接近傻瓜式,得益于RaiDrive。
官网:https://www.raidrive.com/
这个安装和添加操作是在无脑,在此不做展开,官网没找到free download的点,在此分享自用的1.6版本。
https://pan.baidu.com/s/1sWBzh3qraE8_wjUCeC3aXQ
借助RaiDrive我们可以将OneDrive以磁盘的方式挂载到本地,最终效果图:
Linux
Linux平台首先说下我走过的坑。
开始为了偷懒选择的是onedrive-d
,对个人版的认证需要访问网页,即onedrive.live.com
,这就是我上面提到的认证受限,其次对教育版的认证是登录微软账户,然而,难道微软账户和office不是一个东西?
笔者最终选择放弃,选择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的白嫖盘用来存放体积较大的公开性文件和临时文件。
#解除挂载
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
我:???
唉,虽说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
最终效果:
emmm,说实话,自启动处理我想了好多策略,依然不是很完美,细品还有很多不严谨的地方,确切的说依然没有绕过验证,对于普通用户来讲仍为手动启动,嘤嘤嘤,欢迎感兴趣的小伙伴参与交流。
真·END
最终我们实现的效果就是以挂载到本地的方式,实现了跨平台的数据同步:
顺便一提,OneDrive和OneNote均支持安装和iOS,笔者也自然也启用了,基本实现个人的所有电子设备数据同步,吹爆Microsoft,棒呆!