解决Linux下使用davfs2挂载坚果云的问题

坚果云算是现在国内云存储提供商里比较另类的一个了,没有提供巨大的容量空间,也没有非常多的人使用他的分享功能,但好在基本功能非常全面,桌面同步客户端做的比较清爽,各种类型的客户端基本都能支持,特别像多个用户协作修改文件的同步、文件版本历史这些我比较看重的功能做的还不错。坚果云也有一定的付费用户,稍微坑一点的就是坚果云免费用户的初始容量只有 1GB,之后每个月免费用户可以再上传 1GB 的数据(免费用户同时限制每个月下行流量 3GB)。

坚果云虽然没有提供 API 功能,但好在其算是国内唯一提供 WebDAV 方式访问的网盘(国外的类似网盘也比较少,免费的像 Box.com 就算一个了),这样基本就可以在各种不同类型的客户端中不依靠其同步客户端就能读写云中的数据。之前我在 Windows 上使用自带的资源管理器以 WebDAV 方式访问坚果云看起来没什么问题,但到 Linux 下使用最流行的 davfs2 软件挂载坚果云 WebDAV 的时候却直接报错无法访问(WebDAV 功能需要在坚果云账户设置中的 “第三方应用管理” 里开启)。

Linux 终端下 davfs2 挂载坚果云的报错信息如下:

(trusty)root@localhost:~# mount -t davfs https://dav.jianguoyun.com/dav /mnt
Please enter the username to authenticate with server
https://dav.jianguoyun.com/dav or hit enter for none.
  Username: xxx@qq.com
Please enter the password to authenticate user xxx@qq.com with server
https://dav.jianguoyun.com/dav or hit enter for none.
  Password:
/sbin/mount.davfs: mounting failed; the server does not support WebDAV

直接提示服务器不支持 WebDAV 这就比较奇怪的,在网上没找到解决办法,因此决定直接下载 davfs2 源代码进行分析,davfs2 现在的项目主页已从 SourceForge 迁移到:

http://savannah.nongnu.org/projects/davfs2

使用 cvs 检出源代码之后(还用这么古老的版本管理软件值得吐槽哈),需要先安装 WebDAV 支持库 libneon 才能正常编译。

很快就能找到出错的地方 webdav.c:

int
dav_init_connection(const char *path)
{
    char *spath = ne_path_escape(path);
    ne_server_capabilities caps = {0, 0, 0};
    int ret = ne_options(session, spath, &caps);

    if (!ret) {
        initialized = 1;
        if (!caps.dav_class1 && !ignore_dav_header) {
            if (have_terminal) {
                error(EXIT_FAILURE, 0,
                      _("mounting failed; the server does not support WebDAV"));
            } else {
                syslog(LOG_MAKEPRI(LOG_DAEMON, LOG_ERR),
                       _("mounting failed; the server does not support WebDAV"));
                ret = EINVAL;
            }
        }

简单分析上面的源代码可知 mount.davfs 命令在挂载时和 WebDAV 服务器建立连接,并通过 libneon 库的 ne_options 函数发送 HTTP OPTIONS 请求获取 WebDAV 服务器能力,虽然返回成功但判断坚果云 WebDAV 服务器不支持 Class 1 WebDAV,因此直接报错挂载失败。

看到这里解决办法也就简单了,davfs2 提供了通过配置文件禁用 WebDAV 头检测的功能,直接修改 /etc/davfs2/davfs2.conf 配置文件注释并改为:

ignore_dav_header 1

然后再重新使用 mount 或者 mount.davfs 命令挂载坚果云就可以成功了,后续拷贝文件之类的看起来也算正常,不过运行 df 命令看到 WebDAV 返回的容量信息还是不对:

(trusty)zzm@localhost:~$ df -h /mnt
文件系统                        容量  已用  可用 已用% 挂载点
https://dav.jianguoyun.com/dav   26G   13G   13G   50% /mnt

不过这个就不用计较咯,祝玩的开心~~~

解决Linux下使用davfs2挂载坚果云的问题》上的评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注


*