Come caricare ricorsivamente una directory su un server WebDAV tramite HTTPS dalla riga di comando?


12

Sto affrontando una situazione piuttosto semplice, devo caricare, così com'è, un grande albero di file su un server WebDAV che è raggiungibile tramite HTTPS. Devo iniziare il caricamento da una scatola di Linux solo con la riga di comando. Posso installare programmi sulla scatola.

Ho provato Cadaver ma non supporta il caricamento ricorsivo della directory.

Conosci strumenti / script semplici per raggiungere questo obiettivo?


Ok, ho trovato qualcosa che l'ha fatto.

Ho iniziato dallo davpush.plscript che può essere trovato qui https://github.com/ptillemans/davpush

Sono state necessarie alcune modifiche:

  • sostituisci tutto " dav://" in " https://"
  • aggiungi " print POUT "open";" prima di " print POUT $script;"

Dannazione, dover hackerare uno script perl per caricare semplicemente una directory maleducata. Sto ancora cercando strumenti / script semplici.

Risposte:


2

Prova gnomevfs-copy:

Modifica: gvfs-copy non è ricorsivo. L'ho corretto ma ho ancora pubblicato il codice. Nel frattempo, controlla dave di perldav. Effettua trasferimenti ricorsivi.

Se non hai disabilitato il fusibile, puoi provare davfs2

Se non sei contrario al codice del tuo strumento, potresti usare gvfs e trarre ispirazione dal codice sorgente di gvfs-copy

Sto riscontrando un problema simile, quindi potrei tornare con una soluzione migliore


anche kio-client avrebbe potuto farlo. Sfortunatamente è una scatola abbastanza limitata e non ho installato gnomevfs-copy né kio-client.
eskatos,

Prova dave se puoi. Funziona in modo ricorsivo (ma sfortunatamente per me, non capisce la risposta multistato dal server)
user36520

dave l'ha fatto con il server di destinazione, grazie! In realtà non è così lontano da quello che ho fatto basandomi sullo script davpush che usa lo stesso cadaver usando l'API perl HTTP :: DAV. Ma con Dave, non si può facilmente scrivere uno script di shell con un sacco di comandi perché è solo interattivo. Risposta accettata :)
eskatos

8

Ecco uno script di shell rapidamente hackerato che ti permette di farlo usando 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";

Se è chiamato, davcpy.shallora un comando simile

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

consente una copia ricorsiva da

<local-directories>/<dirname>

in uno remoto chiamato

<some-directories>/<dirname>

Si noti che utilizza la funzione di scripting cadaverper consentire ancora la digitazione interattiva di login / password. Penso che sia anche abbastanza robusto da gestire strani nomi di file e directory contenenti spazi, ma non ho testato nessun caso del genere.


2

Una soluzione potrebbe essere Rclone . Questo è un programma di sincronizzazione della riga di comando unidirezionale, simile a rsync, che supporta WebDAV (tra gli altri). Può copiare ricorsivamente una directory, saltando i file esistenti sulla destinazione. Ha alcune opzioni della riga di comando per controllare il comportamento della sincronizzazione, ad esempio se desideri che i file di destinazione vengano eliminati se sono stati trasferiti dal sorgente. Ci sono pacchetti disponibili per molte distro ma puoi anche installare ed eseguire il semplice binario. La prima volta, dovrai definire un "telecomando":

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

Successivamente, puoi copiare o sincronizzare file e directory:

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

1

Una modifica della risposta di nberth che funziona su 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";

L'uso è lo stesso. Citando dalla risposta di nberth:

Se [quanto sopra] si chiama davcpy.sh, allora un comando simile

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

consente una copia ricorsiva da

<local-directories>/<dirname>

in uno remoto chiamato

<some-directories>/<dirname>

0

Sono su Ubuntu Linux. Con l'aiuto di fuse, (Filesystem in Userspace) e mountdavfs (davfs2), è possibile montare una sottodirectory sul server Webdav come cartella locale.

Apri il tuo terminale e procedi come segue:

  • Installa davfs2 se non esiste già: sudo apt-get install davfs2

  • Connettiti al server Webdav:

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

(È necessario inserire il proprietario del file system, altrimenti non sono presenti diritti di scrittura)

Inoltre ho dovuto inserire queste righe in /etc/dafs2/davfs2.conf:

use_proxy       0         
use_locks       0
if_match_bug    1

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

mount - Comando - Risultato (ultima riga dell'output):

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)

Controlla anche se c'è un file strano ~/.davfs2/secrets- potrebbe essere necessario, per i montaggi permanenti che sopravvivono al riavvio.

Ora puoi emettere comandi simili cp -vr /data/myphotos /media/somedire i file verranno copiati in modo ricorsivo e caricati sul sito webdav.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.