Comment télécharger récursivement un répertoire sur un serveur WebDAV via HTTPS à partir de la ligne de commande?

12

Je suis confronté à une situation assez simple, je dois télécharger, tel quel, une grande arborescence de fichiers sur un serveur WebDAV accessible via HTTPS. Je dois commencer le téléchargement à partir d'une boîte Linux avec la ligne de commande uniquement. Je peux installer des programmes sur la box.

J'ai essayé Cadaver mais il ne prend pas en charge le téléchargement de répertoire récursif.

Connaissez-vous des outils / scripts simples pour y parvenir?


Ok, j'ai trouvé quelque chose qui l'a fait.

Je suis parti du davpush.plscript qui se trouve ici https://github.com/ptillemans/davpush

Quelques changements étaient nécessaires:

  • remplacer tous les " dav://" par " https://"
  • ajouter " print POUT "open";" avant " print POUT $script;"

Merde, avoir à pirater un script Perl pour télécharger simplement un répertoire qui est grossier. Je cherche toujours des outils / scripts simples.

eskatos
la source

Réponses:

2

Essayez gnomevfs-copy:

Edit: gvfs-copy n'est pas récursif. Je l'ai corrigé mais je n'ai pas encore publié le code. En attendant, vérifiez dave de perldav. Il effectue des transferts récursifs.

Si vous n'avez pas de fusible désactivé, vous pouvez essayer davfs2

Si vous n'êtes pas opposé au codage de votre propre outil, vous pouvez utiliser gvfs et vous inspirer du code source de gvfs-copy

J'ai un problème similaire, donc je peux revenir avec une meilleure solution

user36520
la source
kio-client aurait pu le faire aussi. Malheureusement, c'est une boîte assez restreinte et je n'ai pas installé gnomevfs-copy ni kio-client.
eskatos
Essayez dave si vous le pouvez. Cela fonctionne récursivement (mais malheureusement pour moi, il ne comprend pas la réponse multistatus du serveur)
user36520
dave l'a fait avec le serveur cible, merci! En fait, ce n'est pas si loin de ce que j'ai fait sur la base du script davpush qui utilise cadaver lui-même en utilisant l'API HTTP :: DAV perl. Mais avec dave, on ne peut pas facilement écrire un script shell avec un tas de commandes car il est uniquement interactif. Réponse acceptée :)
eskatos
8

Voici un script shell rapidement piraté qui permet de le faire en utilisant 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";

S'il est nommé, davcpy.shune commande comme

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

permet une copie récursive de

<local-directories>/<dirname>

dans une télécommande nommée

<some-directories>/<dirname>

Notez qu'il utilise la fonction de script de cadaverpour permettre toujours la saisie interactive des identifiants / mots de passe. Je pense qu'il est également assez robuste pour gérer des noms de fichiers et de répertoires étranges contenant des espaces, mais je n'ai testé aucun cas comme celui-ci.

nberth
la source
2

Une solution pourrait être Rclone . Il s'agit d'un programme de synchronisation en ligne de commande à sens unique, similaire à rsync, qui prend en charge WebDAV (entre autres). Il peut copier récursivement un répertoire, en ignorant les fichiers qui existent sur la destination. Il dispose de certaines options de ligne de commande pour contrôler le comportement de synchronisation, par exemple, si vous souhaitez que les fichiers cibles soient supprimés s'ils sont partis de la source. Il existe des packages disponibles pour de nombreuses distributions, mais vous pouvez également installer et exécuter le binaire ordinaire. La première fois, vous devrez définir une "télécommande":

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

Après cela, vous pouvez copier ou synchroniser des fichiers et des répertoires:

rclone copy /home/onno/mydir my-remote:
Anonyme
la source
1

Une modification de la réponse de nberth qui fonctionne sur 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'usage est le même. Citant la réponse de nberth:

Si [ce qui précède] est nommé davcpy.sh, alors une commande comme

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

permet une copie récursive de

<local-directories>/<dirname>

dans une télécommande nommée

<some-directories>/<dirname>
JayQuerie.com
la source
0

Je suis sur Ubuntu Linux. À l'aide de fuse, (Filesystem in Userspace) et mountdavfs (davfs2), vous pouvez monter un sous-répertoire sur le serveur Webdav en tant que dossier local.

Ouvrez votre terminal et procédez comme suit:

  • Installez davfs2 s'il n'existe pas déjà: sudo apt-get install davfs2

  • Connectez-vous au serveur Webdav:

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

(Le propriétaire du système de fichiers doit être entré, sinon aucun droit d'écriture n'est présent)

De plus, je devais entrer ces lignes dans /etc/dafs2/davfs2.conf:

use_proxy       0         
use_locks       0
if_match_bug    1

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

mount - Commande - Résultat (Dernière ligne de sortie):

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)

Vérifiez également s'il existe un fichier étrange ~/.davfs2/secrets- peut-être nécessaire, pour les montages permanents qui survivent aux redémarrages.

Maintenant , vous pouvez ISSU commandes comme cp -vr /data/myphotos /media/somediret les fichiers sont copiés récursive et téléchargés sur le site webdav.

knb
la source