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


12

我面对的是一个非常简单的情况,我必须按原样将一棵大文件上传到可以通过HTTPS访问的WebDAV服务器。我必须仅使用命令行从Linux盒中开始上传。我可以在盒子上安装程序。

我已经尝试过Cadaver,但它不支持递归目录上传。

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


好吧,我找到了做到这一点的东西。

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

需要进行一些更改:

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

该死,必须破解一个Perl脚本才能简单地上传一个粗鲁的目录。我仍在寻找简单的工具/脚本。

Answers:


2

尝试gnomevfs-copy

编辑:gvfs复制不是递归的。我对其进行了修补,但仍然很难发布代码。同时,从perldav 检查dave。它进行递归传输。

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

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

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


kio-client也可以做到。不幸的是,这是一个非常受限制的盒子,我没有安装gnomevfs-copy或kio-client。
eskatos

如果可以,请尝试戴夫。它可以递归工作(但不幸的是,它不理解来自服务器的多状态响应)
user36520 2013年

dave是用目标服务器完成的,谢谢!实际上,这与我基于davpush脚本所做的事情相去不远,该脚本使用peraver HTTP :: DAV API使用cadaver本身。但是,使用dave时,由于仅是交互式的,因此无法轻松地用一堆命令编写shell脚本。接受的答案:)
eskatos

8

这是一个快速被黑客入侵的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";

如果已命名,davcpy.sh则类似

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

允许从递归复制

<local-directories>/<dirname>

进入一个名为

<some-directories>/<dirname>

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


2

一个解决方案可能是Rclone。这是一种与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:

1

对nberth的答案的修改,适用于OSX:

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

{
    find "$src" -type d | xargs -I{} echo 'mkcol '{}
    find "$src" -type f \
    -exec echo 'cd '$(basename {}) \; \
    -exec echo 'lcd '$(basename {}) \; \
    -exec echo 'mput '{} \; \
    -exec echo 'cd -' \; \
    -exec echo 'lcd '"$root" \;
    echo "quit";
} > "$rc";

cadaver -r "$rc" "$@";
rm -f "$rc";

用法是相同的。引用nberth的答案:

如果[上面的]被命名为davcpy.sh,则类似

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

允许从递归复制

<local-directories>/<dirname>

进入一个名为

<some-directories>/<dirname>

0

我在Ubuntu Linux上。借助保险丝,(用户空间中的文件系统)和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-可能是必要的,这样永久挂载在重启后仍然有效。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.