itgoyo / 500Days-Of-Github

⭐ 瞎JB折腾Mac/Linux/Windows过程中遇到的所有问题和解决方式 ⭐
https://itgoyo.github.io/500Days-Of-Github
140 stars 14 forks source link

通过 webdav 协议挂载阿里云盘到本地 #311

Open itgoyo opened 1 year ago

itgoyo commented 1 year ago

通过 webdav 协议挂载阿里云盘到本地

什么是 webdav 协议

WebDAV 基于 HTTP 协议的通信协议,在 GET、POST、HEAD 等几个 HTTP 标准方法以外添加了一些新的方法,使应用程序可对 Web Server 直接读写,并支持写文件锁定 (Locking) 及解锁 (Unlock),还可以支持文件的版本控制。因为基于 HTTP,在广域网上共享文件有天然的优势,移动端文件管理 APP 也大多支持 WebDAV 协议。使用 HTTPS 还能保安全性。Apache 和 Nginx 支持 WebDAV,可作为 WebDAV 文件共享服务器软件。也可以使用专门的 WebDAV 软件部署。

可以认为通过 webdav,我们可以直接将云盘挂载到本地,不需要使用服务商提供的专门软件就能进行管理使用。目前国内支持的最好的就是坚果云了,自身就支持 webdav,但是坚果云免费的限制流量。阿里云盘明面上不支持,但是通过搭建 webdav-aliyundriver 项目,来代理转发请求,实现阿里云盘支持 webdav 协议。

流程梳理

本篇将会讲解如下

教程内容

搭建 webdav-aliyundriver

阿里云盘自身是不支持 webdav 协议的,所以我们需要一个中转,接收 webdav 协议,然后再将 webdav 协议转换为 HTTP 请求发送给阿里云盘,以此来模拟阿里云盘支持 webdav。而这个中转,就是 webdav-aliyundriver 。更多的介绍使用和搭建方式可以参考项目的 readme

启动

我们通过在 ubuntu20 (ip:192.168.137.200) 上使用 docker 快速启动一个 webdav-aliyundriver

docker run -d --name=webdav-aliyundriver --restart=always -p 9090:8080  -v /etc/localtime:/etc/localtime -v /etc/aliyun-driver/:/etc/aliyun-driver/ -e TZ="Asia/Shanghai" -e ALIYUNDRIVE_REFRESH_TOKEN="下面有获取方式"  -e ALIYUNDRIVE_AUTH_PASSWORD="admin" -e JAVA_OPTS="-Xmx1g" zx5253/webdav-aliyundriver

注意:我将宿主机端口映射为 9090,也就是后面的 client 想要连接该 server,端口修改为 9090

参数说明

--aliyundrive.refresh-token    阿里云盘的refreshToken,获取方式见下文--server.port    非必填,服务器端口号,默认为8080--aliyundrive.auth.enable=true    是否开启WebDav账户验证,默认开启--aliyundrive.auth.user-name=admin    WebDav账户,默认admin--aliyundrive.auth.password=admin    WebDav密码,默认admin--aliyundrive.work-dir=/etc/aliyun-driver/    token挂载路径(如果多开的话,需修改此配置)

浏览器获取 refreshToken 方式

  1. 先通过浏览器(建议 chrome)打开阿里云盘官网并登录:https://www.aliyundrive.com/drive/
  2. 登录成功后,按 F12 打开开发者工具,点击 Application,点击 Local Storage,点击 Local Storage 下的 https://www.aliyundrive.com/,点击右边的 token,此时可以看到里面的数据,其中就有 refresh_token,把其值复制出来即可。(格式为小写字母和数字,不要复制双引号。例子:ca6bf2175d73as2188efg81f87e55f11
  3. 第二步有点繁琐,大家结合下面的截图就看懂了

image

信息整理

容器正常跑起来后,意味着 webdav server 已经成功搭建了。连接 webdav server 的信息如下 (上面启动容器时的参数决定的)

ip 端口 账号 密码
192.168.137.200 9090 admin admin

请确认要连接 webdav server 的客户端所在主机能正常与 192.168.137.200 通信

连接 webdav server

现在我们可以先到阿里云盘的网页或者客户端上,在顶级目录下创建一个名为 webdav_test 的文件夹,作为接下来的讲解案例使用

image

windows 通过 Raidrive 挂载阿里云盘

webdav-aliyundriver 对 Windows 原生自带的添加网络设备兼容不够好,存在问题,所以需要安装第三方,也就是 Raidrive 作为客户端。下载地址:https://cloud.189.cn/t/fiy2immmIbIn(访问码:ypc2

Raidrive 安装完毕后,点击 Add,然后如下配置

image

这里的 path 如果不填写,则默认就是挂载阿里云盘的顶级目录。如果填写 /webdav_test , 则是挂载我们刚刚创建的 webdav_test 目录。点击 OK 后,如果挂成功,我的电脑里就会发现已经挂载了一块网盘,打开就可以看到阿里云盘的里保存的文件。

image

这样就可以不使用阿里云盘的客户端,直接对云盘里的文件进行操作了,也可以直接使用本地播放器在线播放里面的电影。

Linux 通过 Rclone 挂载阿里云盘

Rclone 的步骤比 Raidrive 略显复杂,它需要先配置连接信息,然后通过该配置信息再对网盘执行相关操作。

安装 RCLONE

我们直接使用官网的安装脚本进行安装,更多安装方式可以查看 官网说明

curl https://rclone.org/install.sh | sudo bash

配置 RCLONE

安装完成后,配置一个专门连接 webdav-server 的配置,详细步骤如下:

输入 rclone config ,开始进行配置 (注意看注释说明)

root@guaosi:~# rclone configCurrent remotes: e) Edit existing remoten) New remoted) Delete remoter) Rename remotec) Copy remotes) Set configuration passwordq) Quit config e/n/d/r/c/s/q> n # 创建一个新的配置项,回车 name> aliyunwebdav # 给新的配置项取个名字,后面使用时都会通过这个名称来区分是使用哪个配置,个人喜好,回车 ...39 / Uptobox   \ "uptobox"40 / Webdav   \ "webdav"41 / Yandex Disk   \ "yandex"... Storage> 40 # 使用webdav(这里是不是40取决于rclone版本,反正是使用webdav就对了) Enter a string value. Press Enter for the default ("").url> http://192.168.137.200:9090 # 填写 webdav server 的地址信息 ... 4 / Sharepoint with NTLM authentication, usually self-hosted or on-premises   \ "sharepoint-ntlm" 5 / Other site/service or software   \ "other"vendor> 5 # 没有阿里云盘,选个其他即可 Enter a string value. Press Enter for the default ("").user> admin # 输入连接 webdav server 的账号 Choose an alternative below. Press Enter for the default (n).y) Yes type in my own passwordg) Generate random passwordn) No leave this optional password blank (default)y/g/n> y # 使用设定的密码 Enter the password:password: admin # 输入连接 webdav server 的密码 Confirm the password:password: admin # 再一次确认输入连接 webdav server 的密码 Enter a string value. Press Enter for the default ("").bearer_token> # 没有,直接回车 Edit advanced config?y) Yesn) No (default)y/n> # 以上这些信息够了。直接回车 --------------------[aliyunwebdav]type = webdavurl = http://192.168.137.200:9090vendor = otheruser = adminpass = *** ENCRYPTED ***--------------------y) Yes this is OK (default)e) Edit this remoted) Delete this remotey/e/d> # 确认无误,直接回车 Current remotes: Name                 Type====                 ====aliyunwebdav         webdav e) Edit existing remoten) New remoted) Delete remoter) Rename remotec) Copy remotes) Set configuration passwordq) Quit confige/n/d/r/c/s/q> q # 配置完成,退出

输入命令

rclone ls aliyunwebdav:/

查看是否会列出网盘下的文件列表,会则表示配置无误了。

RCLONE 常用命令

文件上传
# 将本地的 /home/file 文件上传到阿里云盘的 webdav_test 目录下rclone copy /home/file aliyunwebdav:/webdav_test
文件下载
# 将阿里云盘的 webdav_test 目录加的file文件下载到本地 /home/test/ 目录下rclone copy aliyunwebdav:/webdav_test/file /home/test/ #
列表
# 展示顶级目录下的所有文件rclone ls aliyunwebdav:/ # 比上面多一个显示上传时间rclone lsl aliyunwebdav:/  # 只显示文件夹rclone lsd aliyunwebdav:/

挂载阿里云盘

上面只是在发送命令来与 webdav server 进行交互,如果我们想像在 windows 上一样像挂载一块盘进来,可以使用 cp ,mv 之类的命令直接进行操作,那应该如何设置呢?

实际上很简单,我们通过 rclone 自带命令就可以实现盘的挂载

# 创建目录来给阿里云盘挂载mkdir -p /usr/local/webdav_test # 挂载命令(将云盘挂载到本地指定目录)rclone mount aliyunwebdav:/webdav_test /usr/local/webdav_test --cache-dir /tmp --allow-other --vfs-cache-mode writes --allow-non-empty

上面命令会将阿里云盘的 webdav_test (也可以挂载顶级目录,也就是 /) 目录挂载到本地的 /usr/local/webdav_test 目录下。

另外,该命令会阻塞命令窗口,所以另外启动一个窗口进入 /usr/local/webdav_test 查看是否能看到云盘里的文件。此外,如果我们关闭了先前执行挂载命令的窗口,那么挂载就会自动解挂退出,并且如果我们想开机时自动进行云盘挂载,也需要重新手动跑命令,不够方便。所以,我们可以借助 Linux 的 systemd 将命令服务化来进行管理。

挂载报错处理:解决方法:rclone mount报错 报错内容如下:Fatal error: failed to mount FUSE fs: fusermount: exec: "fusermount": executable file not found in $PATH Centos解决办法:yum install fuse Debian/Ubuntu解决办法:apt-get install fuse安装完fuse后,再次执行挂载命令进行挂载

服务化

创建 system 的 service

vim /etc/systemd/system/rclone.service

内容如下

[Unit]Description=RcloneAfter=network-online.target[Service]Type=simpleExecStart=rclone mount aliyunwebdav:/webdav_test /usr/local/webdav_test --cache-dir /tmp --allow-other --vfs-cache-mode writes --allow-non-emptyRestart=on-abortUser=root[Install]WantedBy=default.target

保存退出后,启动服务

systemctl start rclone

设置开机自启

systemctl enable rclone

其它操作命令

# 重启systemctl restart rclone # 停止systemctl stop rclone # 状态systemctl status rclone

好啦,这样就可以安心的跟小姐姐们玩耍啦~