Wie lade ich ein Verzeichnis über HTTPS über die Befehlszeile rekursiv auf einen WebDAV-Server hoch?


12

Ich bin mit einer ziemlich einfachen Situation konfrontiert. Ich muss so wie sie ist einen großen Baum von Dateien auf einen WebDAV- Server hochladen, der über HTTPS erreichbar ist. Ich muss den Upload von einer Linux-Box nur mit Befehlszeile starten. Ich kann Programme auf der Box installieren.

Ich habe Cadaver ausprobiert, aber es unterstützt kein rekursives Hochladen von Verzeichnissen.

Kennen Sie einfache Tools / Skripte, um dies zu erreichen?


Ok, ich habe etwas gefunden, das es getan hat.

Ich habe mit dem davpush.plSkript begonnen, das hier zu finden ist: https://github.com/ptillemans/davpush

Einige Änderungen waren erforderlich:

  • Ersetzen Sie alle " dav://" bis " https://"
  • füge " print POUT "open";" vor " print POUT $script;" hinzu

Verdammt, ich muss ein Perl-Skript hacken, um einfach ein Verzeichnis hochzuladen, das unhöflich ist. Ich suche immer noch nach einfachen Tools / Skripten.

Antworten:


2

Versuchen Sie gnomevfs-copy:

Bearbeiten: gvfs-copy ist nicht rekursiv. Ich habe es gepatcht, muss aber noch den Code veröffentlichen. Überprüfen Sie in der Zwischenzeit Dave von Perldav. Es werden rekursive Übertragungen durchgeführt.

Wenn Sie die Sicherung nicht deaktiviert haben, können Sie davfs2 ausprobieren

Wenn Sie nicht dagegen sind, Ihr eigenes Tool zu codieren, können Sie gvfs verwenden und sich vom Quellcode von gvfs-copy inspirieren lassen

Ich habe ein ähnliches Problem, daher komme ich möglicherweise mit einer besseren Lösung zurück


kio-client hätte es auch tun können. Leider ist es eine ziemlich eingeschränkte Box und ich habe weder gnomevfs-copy noch kio-client installiert.
Eskatos

Versuchen Sie es mit Dave, wenn Sie können. Es funktioniert rekursiv (aber leider versteht es nicht die Multistatus-Antwort vom Server)
user36520

Dave hat es mit dem Zielserver gemacht, danke! Tatsächlich ist es nicht so weit von dem entfernt, was ich basierend auf dem Davpush-Skript gemacht habe, das Cadaver selbst unter Verwendung der Perl-HTTP :: DAV-API verwendet. Aber mit Dave kann man ein Shell-Skript nicht einfach mit einer Reihe von Befehlen schreiben, da es nur interaktiv ist. Antwort akzeptiert :)
eskatos

8

Hier ist ein schnell gehacktes Shell-Skript, das die Verwendung von Cadaver ermöglicht :

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

Wenn es benannt ist, davcpy.shdann ein Befehl wie

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

ermöglicht eine rekursive Kopie von

<local-directories>/<dirname>

in eine entfernte mit dem Namen

<some-directories>/<dirname>

Beachten Sie, dass die Skriptfunktion von verwendet wird, cadaverum weiterhin die interaktive Eingabe von Login / Passwörtern zu ermöglichen. Ich denke, es ist auch robust genug, um seltsame Datei- und Verzeichnisnamen mit Leerzeichen zu verarbeiten, aber ich habe keinen solchen Fall getestet.


2

Eine Lösung könnte Rclone sein . Dies ist ein Einweg-Befehlszeilen-Synchronisierungsprogramm, ähnlich wie rsync, das (unter anderem) WebDAV unterstützt. Es kann rekursiv ein Verzeichnis kopieren und Dateien überspringen, die auf dem Ziel vorhanden sind. Es gibt einige Befehlszeilenoptionen zur Steuerung des Synchronisierungsverhaltens, z. B. ob Zieldateien gelöscht werden sollen, wenn sie aus der Quelle entfernt werden. Es gibt Pakete für viele Distributionen, aber Sie können auch die einfache Binärdatei installieren und ausführen. Beim ersten Mal müssen Sie eine "Fernbedienung" definieren:

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

Danach können Sie Dateien und Verzeichnisse kopieren oder synchronisieren:

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

1

Eine Modifikation der Antwort von nberth, die unter OSX funktioniert:

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

Die Verwendung ist die gleiche. Zitat aus nberths Antwort:

Wenn [das obige] davcpy.sh heißt, dann ein Befehl wie

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

ermöglicht eine rekursive Kopie von

<local-directories>/<dirname>

in eine entfernte mit dem Namen

<some-directories>/<dirname>

0

Ich bin auf Ubuntu Linux. Mit Hilfe von fuse (Dateisystem im Userspace) und mountdavfs (davfs2) können Sie ein Unterverzeichnis auf dem Webdav-Server als lokalen Ordner bereitstellen.

Öffnen Sie Ihr Terminal und gehen Sie wie folgt vor:

  • Installieren Sie davfs2, falls es noch nicht vorhanden ist: sudo apt-get install davfs2

  • Stellen Sie eine Verbindung zum Webdav-Server her:

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

(Besitzer des Dateisystems muss eingegeben werden, sonst sind keine Schreibrechte vorhanden)

Zusätzlich musste ich diese Zeilen eingeben in /etc/dafs2/davfs2.conf:

use_proxy       0         
use_locks       0
if_match_bug    1

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

mount - Befehl - Ergebnis (Letzte Ausgabezeile):

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)

Überprüfen Sie auch, ob es eine seltsame Datei gibt ~/.davfs2/secrets- möglicherweise erforderlich für permanente Bereitstellungen, die Neustarts überleben.

Jetzt können Sie Befehle wie ausgeben cp -vr /data/myphotos /media/somedirund die Dateien werden rekursiv kopiert und auf die Webdav-Site hochgeladen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.