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

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

我面临的情况相当简单,我必须将一大堆文件原封不动地上传到WebDAV可通过 HTTPS 访问的服务器。我必须从仅使用命令行的 Linux 机器开始上传。我可以在机器上安装程序。

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

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


好的,我找到了可以做到的事情。

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

需要进行一些改变:

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

该死,为了简单地上传目录而不得不破解 perl 脚本,这太粗鲁了。我仍在寻找简单的工具/脚本。

答案1

尝试gnomevfs-copy

编辑:gvfs-copy 不是递归的。我修补了它,但还得发布代码。在此期间,请检查戴夫来自 perldav。它执行递归传输。

如果你没有禁用保险丝,你可以尝试davfs2

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

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

答案2

这是一个快速破解的 shell 脚本,允许使用尸体

#!/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";

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

davcpy.sh "<local-directories>/<dirname>" "https://<target-website>/<some-directories>/"

允许递归复制

<local-directories>/<dirname>

进入名为

<some-directories>/<dirname>

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

答案3

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

rclone config create my-remote webdav \
    url https://my-webdav-server/my-dir/ \
    vendor other \
    user 'onno'  pass 'mypasswd'

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

rclone copy /home/onno/mydir my-remote:

答案4

我在 Ubuntu Linux 上。借助 fuse(用户空间中的文件系统)和 mountdavfs(davfs2),您可以将 Webdav 服务器上的子目录挂载为本地文件夹。

打开终端并按以下步骤操作:

  • 如果 davfs2 不存在,请安装它: sudo apt-get install davfs2

  • 连接到Webdav服务器:

    sudo mount.davfs -o user=knb,rw https://webdav.site.de/data /mnt/somedir

(必须输入文件系统的所有者,否则没有写入权限)

此外,我还必须输入以下几行/etc/dafs2/davfs2.conf

use_proxy       0         
use_locks       0
if_match_bug    1

https://bugs.launchpad.net/ubuntu/+source/davfs2/+bug/466960

mount- 命令 - 结果(输出的最后一行):

https://webdav.mysite.de/icdp on /media/somedir type fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=0,allow_other,max_read=16384,uid=1000,gid=0,helper=davfs)

还要检查是否存在奇怪的文件~/.davfs2/secrets- 这可能是必要的,用于在重启后继续永久挂载。

现在您可以发出类似的命令cp -vr /data/myphotos /media/somedir,文件将被递归复制并上传到 webdav 网站。

相关内容