Как рекурсивно загрузить каталог на сервер WebDAV через HTTPS из командной строки?


12

Я сталкиваюсь с довольно простой ситуацией, я должен загрузить, как есть, большое дерево файлов на сервер WebDAV, который доступен через HTTPS. Я должен начать загрузку из окна Linux только с командной строки. Я могу установить программы на коробке.

Я пробовал Cadaver, но он не поддерживает рекурсивную загрузку каталогов.

Знаете ли вы о простых инструментах / сценариях для достижения этой цели?


Хорошо, я нашел кое-что, что сделало это.

Я начал со davpush.plскрипта, который можно найти здесь https://github.com/ptillemans/davpush

Некоторые изменения были необходимы:

  • заменить все " dav://" на " https://"
  • добавить " print POUT "open";до" print POUT $script;"

Черт, нужно взломать Perl-скрипт, чтобы просто загрузить грубый каталог. Я все еще ищу простые инструменты / сценарии.

Ответы:


2

Попробуй gnomevfs-copy:

Изменить: gvfs-копия не является рекурсивной. Я исправил это, но все же опубликовал код. В то же время, проверить Дэйва из perldav. Это делает рекурсивные переводы.

Если у вас не отключен предохранитель, вы можете попробовать davfs2

Если вы не против создания собственного инструмента, вы можете использовать gvfs и получить вдохновение из исходного кода gvfs-copy.

У меня похожая проблема, поэтому я могу вернуться с лучшим решением


Кио-клиент тоже мог это сделать. К сожалению, это довольно ограниченная коробка, и у меня не установлено ни gnomevfs-copy, ни kio-client.
Eskatos

Попробуй Дэйва, если сможешь. Он работает рекурсивно (но, к сожалению, он не понимает многослойного ответа от сервера)
user36520

Дэйв сделал это с целевым сервером, спасибо! На самом деле это не так уж далеко от того, что я сделал на основе сценария davpush, который использует сам cadaver с использованием perl HTTP :: DAV API. Но с Дейвом нельзя легко написать сценарий оболочки с кучей команд, потому что он только интерактивный. Ответ принят :)
eskatos

8

Вот быстро взломанный сценарий оболочки, позволяющий использовать труп :

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

Использование такое же. Цитирую ответ Нберта:

Если [выше] называется davcpy.sh, то такая команда

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

позволяет рекурсивную копию из

<local-directories>/<dirname>

в отдаленный по имени

<some-directories>/<dirname>

0

Я на Ubuntu Linux. С помощью fuse, (Файловая система в Userspace) и 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.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.