Nginx 默认支持 WebDav,但 PROPFIND OPTIONS 等操作还不支持。如果需要在普通客户端打开,需要手动添加模块 nginx-dav-ext-module
Install
通过 nginx -V
获取目前本机 nginx 默认的编译参数
1
| git clone https://github.com/arut/nginx-dav-ext-module
|
接着在 nginx 源码目录添加下面的编译参数
1 2 3 4 5 6 7
| ./configure \ ... --with-http_dav_module \ --add-module=../nginx-dav-ext-module
make install
|
记得把原来的卸载清理干净,因为可能会使用一些原来 nginx 存在的模块,导致 nginx 异常
在 nginx.conf(/etc/nginx/nginx.conf) 中添加下面的一个新域名
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| server { listen 80; server_name xxx.com;
location / { root /data/dav; # alias /data/dav; autoindex on; dav_methods PUT DELETE MKCOL COPY MOVE; # 需要 nginx-dav-ext-module 才有下面的选项 dav_ext_methods PROPFIND OPTIONS; create_full_put_path on; dav_access user:rw group:r all:r; auth_basic "Authorized Users Only"; auth_basic_user_file /etc/nginx/htpasswd; } }
|
上面的配置中 auth_basic_user_file
需要用 htpasswd
生成用户库,之后重启即可
客户端
- 在浏览器直接访问
http://xxx.com
即可,提示用户名密码后,就可以访问。
- 使用 MacOS 的 Finder,Command+K,打开服务器连接,输入
http://xxx.com
,填入用户密码
- 使用专业的客户端: iOS 用
Coda.app
使用命令行操作 DAV 文件
把 stdin 转为二进制流传送到 DAV
1 2
| echo 'bbb' | curl -X PUT -u username:password 'example.com/ii' --data-binary @- cat file | ...
|
上传文件
1
| curl -X PUT -u username:password 'example.com/ii' --data-binary @/home/user/filename
|
删除文件
1
| curl -X DELETE -u yantze:password s.vastiny.com/filename
|
简单的写了一个脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| #!/usr/bin/env bash set -eu
# 三个行为: # 一个参数,无流,参数为远程相对路径,获取文件内容 # 一个参数,读取流文件,参数为远程相对路径 # 两个参数,第一参数本地路径,第二参数远程相对路径
WEBDAV="http://xxx.com" DAVUSER="username" DAVPASS="password"
# Get file content if [[ $# -eq 1 && -t 0 ]]; then curl -su "$DAVUSER:$DAVPASS" "$WEBDAV/$1"
# Upload file elif [[ $# -eq 1 && -n $1 ]]; then curl -X PUT -u "$DAVUSER:$DAVPASS" "$WEBDAV/$1" --data-binary @- echo "$WEBDAV/$1" elif [[ $# -eq 2 && -n $1 && -n $2 ]]; then LOCALFILE="$(\cd "$(\dirname "$1")" && \pwd)/$(\basename "$1")" curl -X PUT -u "$DAVUSER:$DAVPASS" "$WEBDAV/$2" --data-binary @"$LOCALFILE" echo "$WEBDAV/$2" fi
|
使用示例
1 2 3 4 5 6 7 8 9 10 11 12 13
| $ echo "example string" | pan ex1.txt http://xxx.com/slid/ex1.txt
$ pan ex1.txt example string
$ echo "example string2" > local_ex1.txt
$ pan local_ex1.txt ex1.txt http://xxx.com/slid/local_ex1.txt
$ pan ex1.txt example string2
|
更多 DAV 指令可以自行探索
用途
这样的设置 WebDav 一旦发现,容易被爆破,所以真的有价值的内容,可能需要再做进一步处理。
REF