背景#
很久之前就想有一個網路共享文件夾,即一個既能在本地當做普通文件夾使用,也能通過互聯網訪問到的文件夾。
大致對比了一下這些可能能夠用於實現該功能的服務:
服務 | 優點 | 缺點 |
---|---|---|
以百度雲為代表的國內網盤 | 存儲空間大 | 對linux 支持差,訪問速度慢 |
google drive/mega 等國外網盤 | linux 客戶端支持 | 存儲空間較小,國內速度慢甚至無法連通 |
各類oss 服務(例:阿里雲oss ) | 官方掛載支持,速度無限制 | 存儲費用、流量費用、請求費用累計,代價昂貴 |
伺服器空閒存儲空間 | 可通過sftp 訪問 | 受伺服器帶寬限制,使用效果並不理想 |
可以看到各個服務各有優缺點。但最近,我發現了另一款產品:世紀互聯版onedrive
。它是微軟委託國內的世紀互聯運營的,對比onedrive
國際版,一方面其數據中心位於北京 / 上海,極大地優化了國內用戶的訪問速度;另一方面,淘寶有大量低價號販售,五六十塊即可買到 “永久” 的5T
存儲空間(此處存疑)。上網查詢,發現這個世紀互聯版onedrive
在本地可以通過魔改rclone
實現掛載,在雲端可以使用魔改oneindex
、zfile
等開源項目實現瀏覽器訪問(不走伺服器流量,無限速),完美滿足我的需求,於是入了個,準備開搞。
需要#
- 一台自己的電腦
- 一台伺服器
- 開放 api的
世紀互聯版onedrive
帳號(一定要是開放 api的!)
雲端#
先說簡單的雲端訪問,我使用的是zfile
(因為它配置簡單,原生支持世紀互聯onedrive
)。
接下來操作以
ubuntu
為例,centos
請移步官方文檔。
ssh
到伺服器,首先安裝依賴:
sudo apt install -y openjdk-8-jre-headless unzip
下載項目,解壓並給予可執行權限:
cd ~
wget https://c.jun6.net/ZFILE/zfile-release.war
mkdir zfile && unzip zfile-release.war -d zfile && rm -rf zfile-release.war
chmod +x zfile/bin/*.sh
啟動項目:
~/zfile/bin/start.sh
接下來訪問http://你的公網ip:8080/#/install
進行配置。其中的訪問令牌和刷新令牌需要訪問這個網址登錄帳號後獲取,填寫成功之後點擊確認即配置完成,可以在網頁訪問到你的onedrive
雲盤了!
本地#
接下來配置稍微複雜點兒的本地掛載。
以下內容轉載自znov 的博客,因為他是在伺服器掛載,而我是在本機,所以做了少量修改。(windows 只需要進行前三步,未經過實測)。
-
世紀互聯 OneDrive
獲取CLIENT_ID
及CLIENT_SECRET
- 打開該網頁登錄帳號。
- 左側找到
Azure Active Directory
點擊
左側找到應用註冊
點擊
上方找到新註冊
點擊
名稱:onedrive
受支持的帳戶類型:任何組織目錄
(第二個)
重定向 URL:http://localhost:53682
點擊註冊
找到應用程序(客戶端) ID
複製保存
左側找到證書和密碼
點擊
下方 客戶端密碼 -新建客戶端密碼
說明:onedrive
截止期限:默認一年內
點擊 添加,值
複製保存
左側找到API 權限
點擊
添加權限:Microsoft Graph
-委託的權限
:全部勾選(這裡經我測試只勾選File
欄即可)
-
安裝配置
rclone
-
此處下載
rclone
世紀互聯版該文件來源於全球主機論壇愛純粹大佬,因為原博客的下載鏈接速度很慢,所以另存了一份。希望大家下載的同時可以順便去原博客評論支持一下!
-
linux
在當前目錄打開terminal
,執行sudo mv ./rclone的文件名 /usr/bin/rclone sudo chmod +x /usr/bin/rclone
windows
請自行查閱如何將文件添加到環境變量中。注:此步驟非必須,如未執行則將以下語句的
rclone
改為rclone
的路徑形式。 -
輸入
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>onedrive 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>輸入上面“應用程序(客戶端)id” Microsoft App Client Secret Leave blank normally. Enter a string value. Press Enter for the default (""). client_secret>輸入上面申請到的“值” OneDrive operated by 21Vianet (世紀互聯). Enter a boolean value (true or false). Press Enter for the default ("false"). is_21vianet_version>true Edit advanced config? (y/n) y) Yes n) No y/n>n 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 之後會自動打開一個網頁,在這個網頁裡進行登錄,然後繼續.. 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: OneDrive (business) id=****** Chose drive to use:>0 Found drive 'root' of type 'business', URL: https://alphaone-my.sharepoint.cn/personal/*** Is that okay? y) Yes n) No y/n>y y q
-
進行掛載
linux
需要安裝fuse
,各大發行版不一樣就不詳述了,我的manjaro
自帶。命令如下:(其中的 / 表示需要掛載到本地的
onedrive
路徑,/mnt/
表示本機的掛載路徑,可對應修改)掛載命令:rclone mount onedrive:/ /mnt/ --copy-links --no-gzip-encoding --no-check-certificate --allow-other --allow-non-empty --umask 000 後台掛載命令:nohup rclone mount onedrive:/ /mnt --copy-links --no-gzip-encoding --no-check-certificate --allow-other --allow-non-empty --umask 000 >/dev/null 2>&1 & 卸載命令:fusermount -qzu LocalFolder onedrive
-
使用掛載腳本
這個掛載腳本能夠實現基本的掛載、卸載和重新掛載功能,之後使用的話就沒有必要輸入那麼長的命令了。腳本如下:
#!/bin/bash # ------------------------------------------ PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH ### 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_BIN="rclone" NAME="onedrive" REMOTE='/' #需要掛載到本地的onedrive路徑,可修改 LOCAL='/mnt/' #掛載到本地的哪個文件夾,可修改 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 & 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 fusermount -zuq $LOCAL1 >/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
假設該腳本被保存為
rcloned
,首先給予可執行權限:chmod +x rcloned的路徑
之後可以選擇將其移動到環境變量中,使用的時候手動執行
rcloned start
:sudo mv rcloned的路徑 /usr/bin/rcloned # 每次使用時 rcloned start
也可以選擇像原文那樣設置為開機自動運行(可能不支持所有發行版):
sudo mv rcloned的路徑 /etc/init.d/rcloned sudo /etc/init.d/rcloned start
截圖#
碎碎念#
本來打算稍微寫寫水一篇文章的,沒想到一不小心寫了這麼多...
中間某些步驟寫的過分詳細了,希望大家閱讀的時候不要嫌我囉嗦 orz
參考#
-
Zephyr 雜貨鋪(我購買帳號的地方)