您现在的位置是:首页 > 技术教程 正文

macOS上基于httpd-dav搭建WebDav服务

admin 阅读: 2024-03-29
后台-插件-广告管理-内容页头部广告(手机)

文章目录

    • 配置 Apache httpd
      • 修改 ServerName
      • 启动验证 httpd 服务
      • 启用 Dav 扩展服务配置
    • 配置 httpd 扩展 Dav 服务
      • 设置共享目录文件夹
      • 配置 DavLockDB 目录
      • 创建 WebDAV 访客用户
    • httpd-dav.conf 主要改动部分
      • Basic
      • Digest
      • 共享多个目录
    • 授予 httpd 完全磁盘访问权限
    • 验证更新配置重启Apache Httpd
    • 局域网连接验证WebDAV服务
      • 本地无法修改共享目录问题探讨
        • 现有 umask 下的方案探索
        • 尝试将 umask 修改为 002?
      • Finder 挂载 WebDAV 卡死问题
    • curl 命令行访问操作 WebDAV
    • linux 挂载 WebDAV 云盘
    • 参考

在局域网中,要想共享或访问 macOS 机器上的文件,可以通过文件共享、屏幕共享或 远程登录 这几种方式:

  1. FS(SMB): Set up file sharing on Mac,Control access to your Public folder on Mac。
  2. SSH+SFTP: Allow a remote computer to access your Mac
  3. Screen Sharing(VNC): Turn Mac screen sharing on or off,Share the screen of another Mac。
  4. RD: Enable remote management for Remote Desktop

FS 模式一般默认开放给 everyone 只读,可以以 Guest User 身份免登录访问,但是一旦涉及到要开放写权限,会涉及到系统账户分级分组管理和ACL权限控制和分配粒度问题。局域网内怎么样部署简易轻量的共享同步存储系统呢?

在多终端设备时代,很多人都购买了在线网络云盘服务,或者自己动手DIY搭建部署家庭局域网NAS私有云服务器,作为家里的数据和影音中心,方便文件共享和存储备份同步。另一个日益增长的需求就是分布式协作,Google文档、腾讯文档等产品就是解决这类问题的在线协同编辑的办公软件。

早在1996年,加州大学尔湾分校博士毕业生Jim Whitehead就与W3C共同主办了两场会议讨论了万维网上的分布式创作问题,并成立了WebDAV工作小组。

WebDAV 是 Web-based Distributed Authoring and Versioning 的缩写,即基于Web的分布式编写和版本控制。它是对 HTTP 的扩展,为用户在服务器上创建、更改和移动文档提供了一个框架,方便用户间协同编辑和管理存储在万维网服务器上的文档。

因为基于HTTP,WebDAV 在广域网上共享文件有天然的优势,移动端文件管理APP大多都支持WebDAV协议,使用HTTPS还能保安全性。微软的Office和自家Sharepoint服务器通信,苹果的iWork套件也是基于WebDAV。Apache和Nginx都扩展支持WebDAV,可作为WebDAV文件共享服务器软件。

本文记录了在 macOS 上基于内置的 Apache Httpd 搭建 WebDAV 服务的步骤流程,以供备忘和参考。

配置 Apache httpd

Apache Httpd 配置文件:/etc/apache2/httpd.conf。

$ cd /etc/apache2/ // 备份文件,以防不测 $ sudo cp httpd.conf httpd.conf.bak $ sudo vim httpd.conf
  • 1
  • 2
  • 3
  • 4

默认的文档服务目录:

DocumentRoot "/Library/WebServer/Documents"
  • 1
  • 2

修改 ServerName

通过以下命令获取主机名:

  • hostname
  • scutil --get ComputerName
  • scutil --get LocalHostName

搜索 ServerName 注释行,设置与主机名称一致

ServerName mbpa1398:80
  • 1

启动验证 httpd 服务

由于尚未配置 webdav 扩展服务,暂时先不管 webDAV 服务,先把 httpd server 跑起来。

请检查 wfsctl status 是否为禁用状态:

$ sudo wfsctl status disabled
  • 1
  • 2

如果否,请先执行 sudo wfsctl stop 停止,否则可能会有端口冲突等问题导致后续无法访问。


执行 sudo apachectl -k start 启动 Apache Httpd 服务,然后在本地命令行输入 curl localhost,正常应返回 DocumentRoot 下的 index.html.en 页面:

It works!

  • 1

或在浏览器输入 http://localhost 或 http://mbpa1398.local 看看是否正常输出 It works! 。

Stopping and Restarting Apache HTTP Server - Apache HTTP Server Version 2.4

# 停止内置 Apache 方法 $ sudo apachectl -k stop $ sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist 2>/dev/null
  • 1
  • 2
  • 3

启用 Dav 扩展服务配置

移除以下配置文件中 5 行行首的注释:

92 #LoadModule auth_digest_module libexec/apache2/mod_auth_digest.so 165 #LoadModule dav_module libexec/apache2/mod_dav.so 176 #LoadModule dav_fs_module libexec/apache2/mod_dav_fs.so 177 #LoadModule dav_lock_module libexec/apache2/mod_dav_lock.so 533 #Include /private/etc/apache2/extra/httpd-dav.conf
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  1. LoadModule 加载 mod_dav 相关的三个动态库和用于 digest auth 验证的动态库。
  2. Include 包含(引入)dav 扩展服务配置(extra/httpd-dav.conf)。

如果使用默认的认证方式 AuthType Digest,则需加载 mod_auth_digest.so。
如果改为 Basic,默认已经加载了 mod_auth_basic.so,无需加载 mod_auth_digest.so。

配置 httpd 扩展 Dav 服务

Httpd 的 Dav 扩展服务配置文件:/etc/apache2/extra/httpd-dav.conf。

$ cd extra # 备份配置文件 $ sudo cp httpd-dav.conf httpd-dav.conf.bak # 编辑配置文件 $ sudo vim httpd-dav.conf
  • 1
  • 2
  • 3
  • 4
  • 5

设置共享目录文件夹

macOS 下自带的 Apache Httpd 服务的站点目录有两级:

  1. 系统级的根目录:httpd.conf 中配置的 DocumentRoot(/Libraray/WebServer/Ducuments),对应网址: http://localhost/。
  2. 用户级的根目录:对应配置 httpd-userdir.conf(~/Sites),对应网址:http://localhost/~user/。

httpd.conf 中默认未启用用户级站点配置 httpd-userdir.conf:

# User home directories #Include /private/etc/apache2/extra/httpd-userdir.conf
  • 1
  • 2

httpd-userdir.conf 内容如下:

#Include /private/etc/apache2/users/*.conf RegisterUserSite customized-users
  • 1
  • 2
  • 3
  • 4

在 /etc/apache2/users/ 目录下,可以看到当前用户的配置 faner.conf:

Options Indexes MultiViews Require all granted
  • 1
  • 2
  • 3
  • 4

按照 Apache 的部署策略,本机的全局站点部署在系统级根目录,用户级的站点部署在家目录下的 Sites 下。


暂时没有使用 Apache 部署个人站点的需求,所以先在 ~Sites 下新建 DAVNAS 目录用作 WebDAV 共享服务。

第19行指定共享服务目录:/Users/faner/Sites/DAVNAS。
第17行设置 alias 名字为 /webdav,为后续访问 URL 的根路径。

17 Alias /webdav "/Users/faner/Sites/DAVNAS" 18 19
  • 1
  • 2
  • 3

httpd.conf 中指定了运行 httpd daemon 进程的用户和组:

User _www Group _www
  • 1
  • 2

macOS 下 mkdir/touch 新创建的文件(夹),默认对 staff 工作组和 everyone 都开放了 Read Only 权限。

客户端通过 HTTP Basic/Digest 认证访问 web 服务,运行 httpd 服务的 _www._www 用户作为 everyone,拥有对 Directory 目录的只读浏览权限。

想要让 httpd 有权限修改/写入共享的 Directory 目录,需要将该目录更改为 _www._www 用户组名下。调用 chown 命令即可:

$ sudo chown -R _www:_www /Users/faner/Sites/DAVNAS
  • 1

此项修改将导致本地管理员无法直接写 Directory 目录,详见后续讨论。

配置 DavLockDB 目录

创建 /opt/webdav/var 目录:

$ sudo mkdir -p /opt/webdav/var # -R? $ sudo chown _www:_www /opt/webdav/var
  • 1
  • 2
  • 3

修改 httpd-dav.conf 第 15 行的 DavLockDB 路径配置:

# 15 DavLockDB "/usr/var/DavLock" 15 DavLockDB /opt/webdav/var/DavLock
  • 1
  • 2

创建 WebDAV 访客用户

新建存储密码的文件 user.passwd,并修改所属的用户和组。

$ sudo touch /opt/webdav/user.passwd $ sudo chown _www:_www /opt/webdav/user.passwd
  • 1
  • 2

紧接着,为 webdav 域新增用户 username。

如果 AuthType 是 Digest,执行 htdigest 命令:

$ sudo htdigest -c /opt/webdav/user.passwd webdav $username
  • 1

如果 AuthType 改为了 Basic,则执行 htpasswd 命令:

$ sudo htpasswd -c /opt/webdav/user.passwd $username
  • 1

其中, -c 选项将 truncate 已存在的密码文件。

根据提示,为新增的用户(username)设置密码并确认。

可以提前创建多个账号,分配给不同的局域网访客用户。

httpd-dav.conf 主要改动部分

Basic

  • 改:DavLockDB
  • 改:AuthName
  • 改:AuthUserFile
  • 注:AuthDigestProvider
15 DavLockDB "/opt/webdav/var/DavLock" 16 17 Alias /webdav "/Users/faner/Sites/DAVNAS" 18 19 20 Dav On 21 22 AuthType Basic 23 AuthName webdav 24 # You can use the htdigest program to create the password database: 25 # htdigest -c "/usr/user.passwd" $AuthName $username 26 AuthUserFile "/opt/webdav/user.passwd" 27 # AuthDigestProvider file 29 30 # Allow universal read-access, but writes are restricted 31 # to the admin user. 32 33 Require method GET POST OPTIONS 34 Require user $username 35 36
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

Digest

  • 改:DavLockDB
  • 改:AuthName
  • 改:AuthUserFile
  • 增:Require valid-user
  • 注:
15 DavLockDB "/opt/webdav/var/DavLock" 16 17 Alias /webdav "/Users/faner/Sites/DAVNAS" 18 19 \ 20 Dav On 21 22 AuthType Digest 23 AuthName webdav 24 # You can use the htdigest program to create the password database: 25 # htdigest -c "/usr/user.passwd" DAV-upload admin 26 AuthUserFile "/opt/webdav/user.passwd" 27 Require valid-user 28 AuthDigestProvider file 29 30 # Allow universal read-access, but writes are restricted 31 # to the admin user. 32 # \ 33 # Require method GET POST OPTIONS 34 # Require user admin 35 # \ 36 \
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

共享多个目录

建议把要共享的内容放在一个共享目录(DAVNAS),然后通过 /webdav 访问。

如果有多个共享目录,可以复制 Alias、Directory,建立多组 URL 路径映射。

Alias /webdav1 "/Users/faner/Sites/DAVNAS1" Dav On # Dav access control Alias /webdav2 "/Users/faner/Sites/DAVNAS2" Dav On # Dav access control
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

这样,后续就可以通过 /webdav1, /webdav2 分别访问不同的共享目录。

授予 httpd 完全磁盘访问权限

将 DAVNAS 共享目录分配给 _www:_www 后,还得给 httpd 相关 daemon 进程分配磁盘访问权限,这样才能读写磁盘文件系统。

打开 macOS 设置(System Settings),隐私与安全性(Privacy & Security),完全磁盘访问权限(Full Disk Access),

点按左下角的 + 号,在打开的访达窗口按 Shift+Command+G 调出路径访问方式,输入 /usr/sbin/httpd 回车,找到 httpd 命令添加。

依此方法,添加 /usr/sbin/htdigest(或 /usr/sbin/htpasswd)。

验证更新配置重启Apache Httpd

在验证服务之前,可以调用 apachectl 或 httpd 命令查看配置:

$ apachectl -t -D DUMP_INCLUDES $ apachectl -t -D DUMP_RUN_CFG
  • 1
  • 2

执行 apachectl -t(或 apachectl configtest)检查 Apache Httpd 配置文件:如果仅输出一行 Syntax OK 代表配置正确;否则,表示配置有问题,请按提示检查配置文件,也可查看分析问题日志 /var/log/apache2/error_log。

如果 configtest 遇到以下错误,请执行 sudo mkdir /private/var/log/apache2 创建 apache2 日志文件夹。

$ apachectl -t (2)No such file or directory: AH02291: Cannot access directory '/private/var/log/apache2/' for main error log AH00014: Configuration check failed
  • 1
  • 2
  • 3

配置文件验证无误后,执行 sudo apachectl graceful 重载配置文件使生效。

最后,重新启动 Apache 服务器:sudo apachectl -k restart。

局域网连接验证WebDAV服务

打开本机访达(Finder),按 Command+k 连接服务器,输入 http://mbpa1398.local/webdav/,然后输入在 user.passwd 中配置的账户密码,看看是否可以正常访问。

  • 如果机器名无法解析(unable to resolve host),可以换成局域网 IP 访问:http://192.168.0.100/webdav/ , 或者考虑在 /etc/hosts 中添加条目:127.0.0.1 mbpa1398.local 。

本机验证通过后,在局域网其他终端(例如 Mac Finder,iPhone PDF expert)上尝试连接 webdav 服务。连接成功后,即可进行简单的多用户协作。

这样,就将 DAVNAS 配置为家庭局域网内的数据中心,支持多设备共享和编辑同步文件。

将配置文件 httpd-dav.conf 中的 Directory 配置为外挂硬盘,例如 /Volumes/WDHD,即可变为简陋的 NAS。

有条件的,可以进一步升级支持 HTTPS 安全访问,需要在 httpd.conf 引入 httpd-ssl.conf 并配置加载 ssl 相关模块,还得使用 openssl 创建自签名证书。

如果家里的宽带有分配公网 IP,可以在路由器中配置端口映射,支持外网访问。这样,即使身在外边,也可远程访问家里的 WebDAV 服务。

本地无法修改共享目录问题探讨

在服务器配置 WebDav 服务目录 Directory(/Users/faner/Sites/DAVNAS)时,将其 owner 修改为了 httpd 用户( _www._www)。

这样修改后,本地其他用户(包括当前用户)将无法再直接写该目录。当前用户 faner:staff 尝试写入时要求密码认证,认证后可以强制写入,但是 owner 就变成了当前用户 faner,httpd 用户 _www 又没有这个文件的写入权限了!

所以,对于 WebDAV 共享服务目录,预期所有用户都统一以 WebDAV 客户形式请求 httpd-dav 服务器以 _www 身份对其执行写入操作。带来的不便之处在于,即使服务器本地管理员,也需连接挂载到本地(/Volumes/webdav)之后才能执行写入操作。

最简单粗暴的方案:修改 httpd.conf 中的 User:Group 为当前用户组 faner:staff(共享服务目录相应也需要 chown),即 httpd 以当前用户的身份启动服务,当前用户当然可以直接修改写入共享服务目录。

如果害怕 httpd 以管理员身份运行权限过高甚至为非作歹,最好还是维持 httpd.conf 中默认的 User:Group 配置。那么,我们就得探究其他的变通方案。

这里涉及到 UNX 读写文件的权限控制问题,让我们按照以下步骤探究一下服务器本地和加载的“云盘”下文件(夹)的权限。

  1. 使用 ls -l 命令,查看服务器本地共享目录(/Users/faner/Sites/DAVNAS)的权限是 drwxr-xr-x(755)。
  2. 登录 WebDAV 服务后,本地挂载点 /Volumes/webdav 下看到的文件(夹)权限是rwx------(700),即当前用户拥有对该云盘的全部权限。
  3. 向云盘粘贴写入文件后,回到本地共享目录查看,其文件(夹)的 owner 是 _www,文件夹权限是 drwxr-xr-x(755),文件权限是 -rw-r--r--(644)。

macOS/Linux 下,系统按照 umask 设置用户创建文件(夹)的默认权限。在命令行输入 umask 其值为 022(八进制),即 owner 拥有全部权限,同时屏蔽了用户组 g 和其他用户 o 的写权限。

当创建一个文件夹时,其权限=777 & ~umask(Python下计算:oct(0o777 & ~0o022) = ‘0o755’),文件的权限是 -rw-r--r--(644),即 owner 拥有读写权限,用户组 g 和其他用户 o 拥有只读权限。

根据以上分析,按照 umask 权限屏蔽策略,只有 httpd 用户(_www) 这个 owner 对 WebDav 服务目录 Directory 拥有写权限,其他用户(包括当前用户 faner:staff)只有只读权限。

解决思路:如果有办法修改 httpd 用户(_www)的 umask 为 002,即开放其所在用户组(_www)的写权限,然后执行 sudo dscl . -append /Groups/_www GroupMembership faner 将当前用户 faner 加入 _www 用户组,当前用户即有权限直接写本地 WebDav 服务目录 Directory。

现有 umask 下的方案探索

Webdav (Apache) 的文件权限问题 给出了一种解决方案:

  1. 将共享目录的 owner 从 _www:_www 修改为 faner:_www:
sudo chown -R faner:_www /Users/faner/Sites/DAVNAS
  • 1
  1. 为组加上s 标志,这样其下新建的文件就会自动 setgid 为 _www 组的 ID:
sudo chmod -R g+s /Users/faner/Sites/DAVNAS
  • 1

For a directory, g+s overrides the group id that new files and directories will have (it is usually inherited from the creator).

在这种方案中,改变文件夹的 owner 和 mod,当前用户 faner 不用加入 _www 组,即可在共享文件夹新建文件(夹)。

  • 新建文件夹隶属 faner:_www,权限为 drwxr-xr-x
  • 新建文件隶属 faner:_www,权限为 -rw-r–r–

受现有 umask=022 制约,新建的文件(夹)的用户组均无 w 权限。
webdav 客户端对应的 httpd 用户 _www 将只有 r 读浏览权限,无法写入!


考虑为共享目录所属组 _www 开放写权限:

# 755 -> 775 $ sudo chmod -R g+w ~/Sites/DAVNAS
  • 1
  • 2

并将当前用户 faner 加入 _www 组:

# -delete 删除 $ sudo dscl . -append /Groups/_www GroupMembership faner
  • 1
  • 2

这样的话,共享目录维持为 _www:_www 所有,_www 组员 faner 可向根目录修改写入数据。

但是,faner:_www 在根目录新建文件属性为 -rw-r--r--@,一旦被 webdav 客户端修改,其 owner 变为 _www,属性中的 @ 消失,本地管理员 faner 又无权修改该文件!

  • 客户端新建的文件 owner 为 _www:_www,faner 在本地无权修改写入!

归根结底,还是受现有 umask=022 制约,新建的文件夹并不会继承根目录的 g+w,即用户组均无 w 写权限。服务端 faner 或客户端 _www 建的文件夹,彼此都无权修改写入!

所以,此部分仅作为探索记录,奇技淫巧和歪门邪道终究不能登堂入室取得正果。

尝试将 umask 修改为 002?

CentOS、Ubuntu 下的方案参考 Setting the umask of the Apache user:

# CentOS $ echo "umask 002" >> /etc/sysconfig/httpd $ service httpd restart # Debian and Ubuntu echo "umask 002" /etc/apache2/envvars service apache2 restart
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

macOS 下,参考 Apache2 & umasks,需要修改 apache 的环境变量配置文件 /usr/sbin/envvars:

$ sudo vim /usr/sbin/envvars # set custom umask, allow group writing umask 002
  • 1
  • 2
  • 3

参考 Set umask in OS X Yosemite 和 Mac umask apache,修改 org.apache.httpd.plist 配置文件:

$ sudo vim /System/Library/LaunchDaemons/org.apache.httpd.plist add Umask 002 in section $ sudo apachectl stop $ sudo apachectl start
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

可惜的是,以上两个系统配置文件均隶属 root:wheel, 即使执行 sudo -i 或 sudo su - 切换到 root 身份,进入恢复模式执行 csrutil disable 关闭 SIP(System Integrity Protection),也还是处于只读保护状态,无法修改。至于想通过 sudo mount -uw / 把整个磁盘重新 mount 为可写模式更是痴心妄想!

网上有很多此类问题的讨论,随着 macOS 系统的安全策略升级,有些方案已经失效:

  • MAC: Root User Not Getting Edit Permissions
  • Cannot add/modify system or root dir files even though I’m logged in as root user
  • Can’t edit read only file even when root
  • Still can’t edit /System/Library after disabling SIP : r/MacOS

参考苹果相关官方文档:

  • Signed system volume security in iOS, iPadOS and macOS - Apple Support (HK)
  • About the read-only system volume in macOS Catalina or later: Apple has made changes to Catalina to lock down the system files which are now stored and mounted as a read-only volume.

在 Set a custom umask in macOS 中,官方给出了修改 umask 的方案,不过只能针对 system 和 user(所有用户)全局设置,无法针对具体用户(_www)设置 umask。

# user: 所有用户 sudo launchctl config user umask nnn # system: 系统用户 sudo launchctl config system umask nnn
  • 1
  • 2
  • 3
  • 4

config 目标只能为 system | user,尝试执行 sudo launchctl config user umask 002 报错:

sudo launchctl config _www umask 002 Usage: launchctl config When given the "system" argument, modifies the configuration for the system domain. When given the "user" argument on supported platforms, modifies the configuration for all user domains. You must reboot for changes to take effect. Note that if a service specifies a conflicting configuration, the service's parameter will be preferred. Supported configuration parameters are: umask Modifies the umask(2) applied to services launched in the domain. path Modifies the PATH environment variable set on each service in the domain.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

当然,如果不介意,也可通过这种方式全局修改所有用户(user )的 umask 为 002,向同一用户组开放写权限。

期待 apache 官方未来预留一个用户级环境变量的配置机会,或者采用 nginx 平替(为www-data用户(nginx)更改umask值)。

或者,暂时就此作罢,服务器本地管理员也登录挂载 WebDAV 云盘后,统一以 Web HTTP 客户身份同步操作云盘。

Finder 挂载 WebDAV 卡死问题

除了在 Finder 中手动连接服务器(Connect to Server),也可考虑改用内置的 mount 系列命令行(或第三方命令行工具 rclone )挂载/卸载 WebDAV:

# 创建本地挂载点目录 $ sudo mkdir /Volumes/webdav # 修改用户名和用户组为你自己的用户(组) $ sudo chown -R faner:staff /Volumes/webdav # 使用 mount_webdav 命令加载 WebDAV,按照提示输入 username:password $ mount_webdav -i http://mbpa1398.local/webdav/ /Volumes/webdav # 使用 diskutil umount 命令卸载 WebDAV $ diskutil umount /Volumes/webdav
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

挂载成功后,执行 df -h 命令会输出一条 Filesystem=http://mbpa1398.local/webdav,Mounted on /Volumes/webdav 的条目。

无论哪种方式,挂载成功后,Finder 侧边栏的 Locations/Network 中都会出现相应网盘映射。

macOS Finder 对 WebDAV 的支持貌似不是那么好,可考虑 Finder 的替代品 QSpace 或使用专业的云盘加载工具软件 Mountain Duck、CloudMounter 等。


从实际体验来看,iPad/iPhone 上的 PDF Expert 挂载局域网 WebDAV 后,工作得挺稳定,回写同步做得比较好。在 macOS 上编辑 PDF 文件,时不时转菊花,有时候等一会能恢复,有时候等了很久还是卡死。

此时,使用 ⌥+⌘+esc 打开查看 Force Quit Applications 窗口,其中 PDF Expert 为 not responding 卡死状态,点击底下的 Relaunch 按钮,也并没有解决问题。过一会回到 Finder 中的 /Volumes/webdav,点几下也卡死。在 Force Quit Applications 窗口点选 Finder Relaunch,Finder 关闭后迟迟没有重新打开。

最初,遇到这种情况没辙,只能按住电源键强制重启,但是总这么搞也不是办法。稍微研究了一下,通过 macOS 提供的诊断工具箱,可以找到相关进程杀之。

通过 ps aux | grep webdav 过滤 webdav 相关的进程,或利用 lsof 命令过滤服务器 IP 查找出 webdav 网络连接和进程 PID。

lsof 显示有些 TCP 连接处于 SYN_SENT 状态一直等待服务器确认,具体有待进一步研究分析。

$ ps aux | grep webdav # or $ lsof -nPi4 +c0 +M | grep 192.168.0.100
  • 1
  • 2
  • 3

假设获取到进程的 COMMAND=webdavfs_agent, PID=3231,执行 kill 命令杀死 webdav 进程,Finder 重获新生。

$ sudo killall -9 webdavfs_agent # or $ sudo kill -9 3231
  • 1
  • 2
  • 3

curl 命令行访问操作 WebDAV

  1. 认证方式可选 --basic,--digest,不指定相当于 --anyauth,让 cURL 自动选择。

  2. -u(–user) 后面可只指定用户名 -u $username,将提示输入密码;也可连带指定密码 -u $username:$password。

  3. 拉取文件列表(也可指定其他目录,以/结尾):

curl -i --basic -u $username -X PROPFIND http://mbpa1398.local/webdav/ --upload-file - -H "Depth: 1" < end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  1. 新建目录
curl -v -u $username -X MKCOL http://mbpa1398.local/webdav/curltest/
  • 1
  1. 上传文件(也可在 url 后续接上传后的自定义目标文件名):
curl -v -u $username -T test.txt http://mbpa1398.local/webdav/curltest/
  • 1
  1. 移动文件(同目录相当于重命名):
curl -v -u $username -X MOVE http://mbpa1398.local/webdav/curltest/test.txt --header 'Destination: http://mbpa1398.local/webdav/curltest/test2.txt'
  • 1
  1. 复制文件
curl -v -u $username -X COPY http://mbpa1398.local/webdav/curltest/test2.txt --header 'Destination: http://mbpa1398.local/webdav/curltest/test3.txt'
  • 1
  1. 下载文件(或 > test2.txt,重定向 stdout 到文件;-v 是 stderr):
curl -v -u $username http://mbpa1398.local/webdav/curltest/test3.txt -o test3.txt
  • 1
  1. 删除文件(夹):
curl -v -u $username -X DELETE http://mbpa1398.local/webdav/curltest/test3.txt
  • 1

linux 挂载 WebDAV 云盘

在 Ubuntu 或 CentOS 下可以将 WebDAV 挂载为本地磁盘,可采用 rclone 云同步命令行工具,或安装 davfs2 文件系统扩展。

  1. 安装 davfs2:
# Ubuntu sudo apt-get install davfs2 -y # CentOS sudo yum install davfs2 -y
  • 1
  • 2
  • 3
  • 4
  1. 创建本地挂载点目录:
$ mkdir /mnt/webdav@mbpa1398
  • 1
  1. 执行 mount 命令挂载 WebDAV:
$ sudo mount -t davfs http://mbpa1398.local/webdav /mnt/webdav@mbpa1398 Please enter the username to authenticate with server http://mbpa1398.local/webdav or hit enter for none. Username: $username Please enter the password to authenticate user $username with server http://mbpa1398.local/webdav or hit enter for none. Password: $password
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

挂载成功后,执行 df -h 命令会输出一条 Filesystem=http://mbpa1398.local/webdav,Mounted on /mnt/webdav@mbpa1398 的条目。

  1. 直接编辑 WebDAV 上的文件,然后保存同步:
sudo vim /mnt/webdav@mbpa1398/test/test.c
  • 1
  1. 用完之后,记得解除挂载:
sudo umount /mnt/webdav@mbpa1398
  • 1
  1. 可考虑配置开机自动挂载,涉及以下配置文件:

    • davfs2配置文件:/etc/davfs2/davfs2.conf
    • davfs2密码配置:/etc/davfs2/secrets
    • 自动挂载配置文件:/etc/fstab

参考

wiki - WebDAV
网络存储文件共享之 WebDAV
在 Mac mini Server 上配置 WebDAV 文件共享

WEBDAV WITH CURL:curl 测试 webdav,学习 WebDav

如何在Ubuntu或CentOS将WebDAV挂载为本地磁盘
Linux 挂载 WEBDAV,Linux将WebDAV为本地磁盘

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索