Como fazer upload recursivamente de um diretório para um servidor WebDAV através de HTTPS a partir da linha de comando?

9

Estou enfrentando uma situação bastante simples, tenho que carregar, como é, uma grande árvore de arquivos para um servidor WebDAV isso é acessível por HTTPS. Eu devo começar o upload de uma caixa linux apenas com a linha de comando. Eu posso instalar programas na caixa.

Eu testei o Cadaver , mas ele não suporta o upload de diretórios recursivos.

Você conhece ferramentas / scripts simples para conseguir isso?

Ok, encontrei algo que fez isso.

Eu comecei pelo script davpush.pl que pode ser encontrado aqui link

Algumas alterações foram necessárias:

  • substitua todos os " dav:// " por " https:// "
  • adicione " print POUT "open"; " antes de " print POUT $script; "

Porra, ter que hackear um script perl para simplesmente fazer o upload de um diretório que seja rude. Ainda estou procurando ferramentas / scripts simples.

    
por eskatos 12.12.2012 / 14:44

5 respostas

2

Experimente gnomevfs-copy :

Edit: gvfs-copy não é recursivo. Eu consertei mas ainda tenho que publicar o código. Enquanto isso, verifique dave no perldav. Faz transferências recursivas.

Se você não tiver um fusível desativado, tente davfs2

Se você não é adverso ao código de sua própria ferramenta, você pode usar o gvfs e obter inspiração do código fonte do gvfs-copy

Estou tendo um problema semelhante, então posso voltar com uma solução melhor

    
por 30.03.2013 / 00:21
7

Aqui está um script de shell rapidamente hackeado que permite fazer isso 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";

Se for nomeado davcpy.sh , um comando como

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

permite uma cópia recursiva de

<local-directories>/<dirname>

em um remoto chamado

<some-directories>/<dirname>

Observe que ele usa o recurso de script de cadaver para permitir a digitação interativa de login / senhas. Eu acho que ele também é robusto o suficiente para lidar com nomes estranhos de arquivos e diretórios contendo espaços, mas eu não testei nenhum caso como esse.

    
por 17.12.2013 / 14:38
0

Uma modificação da resposta da nberth que funciona no 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";

O uso é o mesmo. Citando a resposta da nberth:

If [the above] is named davcpy.sh then a command like

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

allows a recursive copy from

<local-directories>/<dirname>

into a remote one named

<some-directories>/<dirname>
    
por 05.11.2014 / 23:56
0

Estou no Ubuntu Linux. Com a ajuda do fusível (Filesystem in Userspace) e mountdavfs (davfs2), você pode montar um subdiretório no servidor Webdav como uma pasta local.

Abra o seu terminal e proceda da seguinte forma:

  • Instale o davfs2, se ainda não existir: sudo apt-get install davfs2

  • Conecte-se ao servidor Webdav:

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

(Proprietário do sistema de arquivos deve ser inserido, caso contrário, nenhum direito de gravação está presente)

Além disso, tive que inserir essas linhas em /etc/dafs2/davfs2.conf :

use_proxy       0         
use_locks       0
if_match_bug    1

Veja o link

mount - Comando - Resultado (última linha de saída):

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)

Verifique também se há um arquivo estranho ~/.davfs2/secrets - pode ser necessário, para montagens permanentes que sobrevivem a reinicializações.

Agora você pode emitir comandos como cp -vr /data/myphotos /media/somedir e os arquivos serão copiados recursivamente e carregados no site webdav.

    
por 06.12.2016 / 15:10
0

Uma solução pode ser Rclone . Este é um programa de sincronização de linha de comando unidirecional, semelhante ao rsync, que suporta WebDAV (entre outros). Ele pode recursivamente copiar um diretório, pulando arquivos que existem no destino. Ele tem algumas opções de linha de comando para controlar o comportamento de sincronização, por exemplo, se você deseja que os arquivos de destino sejam excluídos se eles forem eliminados da origem. Existem pacotes disponíveis para muitas distros, mas você também pode instalar e executar o binário simples. A primeira vez, você precisará definir um "remoto":

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

Depois disso, você pode copiar ou sincronizar arquivos e diretórios:

rclone copy /home/onno/mydir my-remote:
    
por 11.07.2018 / 17:39