¿Cómo cargar recursivamente un directorio a un servidor WebDAV a través de HTTPS desde la línea de comandos?


12

Me enfrento a una situación bastante simple, tengo que cargar, tal cual, un gran árbol de archivos a un servidor WebDAV al que se puede acceder a través de HTTPS. Debo comenzar la carga desde un cuadro de Linux solo con la línea de comandos. Puedo instalar programas en la caja.

Intenté Cadaver pero no admite la carga recursiva de directorios.

¿Conoces herramientas / scripts simples para lograr eso?


Ok, encontré algo que lo hizo.

Comencé con el davpush.plscript que se puede encontrar aquí https://github.com/ptillemans/davpush

Se necesitaban algunos cambios:

  • reemplace todos los " dav://" a " https://"
  • agregar " print POUT "open";" antes " print POUT $script;"

Maldición, tener que hackear un script de Perl para simplemente cargar un directorio que es grosero. Todavía estoy buscando herramientas / scripts simples.

Respuestas:


2

Prueba gnomevfs-copy:

Editar: gvfs-copy no es recursivo. Lo parcheé pero aún así tuve que publicar el código. Mientras tanto, compruebe dave desde perldav. Hace transferencias recursivas.

Si no tiene el fusible desactivado, puede probar davfs2

Si no es adverso al código de su propia herramienta, puede usar gvfs y obtener inspiración del código fuente de gvfs-copy

Tengo un problema similar, así que puedo volver con una mejor solución


kio-client también podría haberlo hecho. Desafortunadamente es un cuadro bastante restringido y no tengo gnomevfs-copy ni kio-client instalado.
eskatos

Prueba Dave si puedes. Funciona de forma recursiva (pero por desgracia para mí, que no entiende la respuesta de varios estados del servidor)
user36520

Dave lo hizo con el servidor de destino, ¡gracias! De hecho, no está tan lejos de lo que hice en base al script davpush que usa el cadáver mismo usando la API perl HTTP :: DAV. Pero con Dave, uno no puede escribir fácilmente un script de shell con un montón de comandos porque solo es interactivo. Respuesta aceptada :)
eskatos

8

Aquí hay un script de shell rápidamente pirateado que permite hacer eso usando cadáver :

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

Si se nombra, davcpy.shentonces un comando como

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

permite una copia recursiva de

<local-directories>/<dirname>

en uno remoto llamado

<some-directories>/<dirname>

Tenga en cuenta que utiliza la función de secuencias de comandos de cadaveraún permitir la escritura interactiva de inicio de sesión / contraseñas. Creo que también es lo suficientemente robusto como para manejar nombres de archivos y directorios extraños que contienen espacios, pero no probé ningún caso como ese.


2

Una solución podría ser Rclone . Este es un programa de sincronización de línea de comandos unidireccional, similar a rsync, que admite WebDAV (entre otros). Puede copiar recursivamente un directorio, omitiendo los archivos que existen en el destino. Tiene algunas opciones de línea de comandos para controlar el comportamiento de sincronización, por ejemplo, si desea que los archivos de destino se eliminen si se han ido de la fuente. Hay paquetes disponibles para muchas distribuciones, pero también puede instalar y ejecutar el binario simple. La primera vez, deberá definir un "control remoto":

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

Después de eso, puede copiar o sincronizar archivos y directorios:

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

1

Una modificación de la respuesta de nberth que funciona en 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";

El uso es el mismo. Citando la respuesta de nberth:

Si [lo anterior] se llama davcpy.sh, entonces un comando como

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

permite una copia recursiva de

<local-directories>/<dirname>

en uno remoto llamado

<some-directories>/<dirname>

0

Estoy en Ubuntu Linux. Con la ayuda de fusible, (Sistema de archivos en el espacio de usuario) y mountdavfs (davfs2), puede montar un subdirectorio en el servidor Webdav como una carpeta local.

Abra su terminal y proceda de la siguiente manera:

  • Instale davfs2 si aún no existe: sudo apt-get install davfs2

  • Conéctese al servidor Webdav:

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

(Se debe ingresar el propietario del sistema de archivos, de lo contrario no hay derechos de escritura)

Además tuve que ingresar estas líneas en /etc/dafs2/davfs2.conf:

use_proxy       0         
use_locks       0
if_match_bug    1

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

mount - Comando - Resultado (última línea de salida):

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)

También verifique si hay un archivo extraño ~/.davfs2/secrets, puede ser necesario, para montajes permanentes que sobreviven al reiniciar.

Ahora puede emitir comandos como cp -vr /data/myphotos /media/somediry los archivos se copiarán de forma recursiva y se cargarán en el sitio webdav.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.