10

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

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

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


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

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

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

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

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

5 ответов5

7

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

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

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

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

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

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

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

0

Модификация ответа 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

Решением может быть 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:
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 - Command - Result (последняя строка вывода):

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.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .