如何从命令行通过 HTTPS 将目录递归上传到 WebDAV 服务器?

esk*_*tos 12 webdav https command-line

我面临着一个相当简单的情况,我必须将一个大文件树按原样上传到可通过 HTTPS 访问的WebDAV服务器。我必须仅使用命令行从 linux 框开始上传。我可以在盒子上安装程序。

我试过尸体,但它不支持递归目录上传。

您知道实现这一目标的简单工具/脚本吗?


好的,我找到了可以做到的东西。

我从davpush.pl可以在这里找到的脚本开始https://github.com/ptillemans/davpush

需要进行一些更改:

  • 将所有“ dav://”替换为“ https://
  • 在“ print POUT "open";”前加“ print POUT $script;

该死,不得不破解一个 perl 脚本来简单地上传一个粗鲁的目录。我仍在寻找简单的工具/脚本。

小智 9

这是一个快速破解的 shell 脚本,允许使用cadaver 执行此操作

#!/bin/sh

usage () { echo "$0 <src> <cadaver-args>*" >/dev/stderr; }
error () { echo "$1" >/dev/stderr; usage; exit 1; }

test $# '<' 3 || \
    error "Source and cadaver arguments expected!";

src="$1"; shift;
test -r "$src" || \
    error "Source argument should be a readable file or directory!";

cd "$(dirname "$src")";
src="$(basename "$src")";
root="$(pwd)";
rc="$(mktemp)";
{
    find "$src" '(' -type d -a -readable ')' \
    -printf 'mkcol "%p"\n';
    find "$src" '(' -type f -a -readable ')' \
    -printf 'cd "%h"\nlcd "%h"\n'            \
    -printf 'mput "%f"\n'                    \
    -printf 'cd -\nlcd "'"$root"'"\n';
    echo "quit";
} > "$rc";

cadaver -r "$rc" "$@";
rm -f "$rc";
Run Code Online (Sandbox Code Playgroud)

如果它被命名,davcpy.sh那么命令如下

davcpy.sh "<local-directories>/<dirname>" "https://<target-website>/<some-directories>/"
Run Code Online (Sandbox Code Playgroud)

允许递归复制

<local-directories>/<dirname>
Run Code Online (Sandbox Code Playgroud)

进入一个名为

<some-directories>/<dirname>
Run Code Online (Sandbox Code Playgroud)

请注意,它使用 的脚本工具cadaver仍然允许交互式输入登录名/密码。我认为它也足够强大,可以处理包含空格的奇怪文件和目录名称,但我没有测试任何类似的情况。


小智 6

解决方案可能是Rclone。这是一种单向命令行同步程序,类似于 rsync,支持 WebDAV(以及其他)。它可以递归地复制目录,跳过目标上存在的文件。它有一些命令行选项来控制同步行为,例如,如果目标文件从源中消失,您是否希望将其删除。许多发行版都有可用的软件包,但您也可以安装并运行纯二进制文件。第一次,您需要定义一个“远程”:

rclone config create my-remote webdav \
    url https://my-webdav-server/my-dir/ \
    vendor other \
    user 'onno'  pass 'mypasswd'
Run Code Online (Sandbox Code Playgroud)

之后,您可以复制或同步文件和目录:

rclone copy /home/onno/mydir my-remote:
Run Code Online (Sandbox Code Playgroud)


use*_*520 2

尝试gnomevfs-copy

编辑:gvfs-copy 不是递归的。我修补了它,但尚未发布代码。与此同时,请检查来自 perldav 的dave。它进行递归传输。

如果你没有禁用fuse,你可以尝试davfs2

如果您不反对编写自己的工具,您可以使用 gvfs 并从gvfs-copy 的源代码中获得灵感

我遇到了类似的问题,所以我可能会提供更好的解决方案