Como fazer upload recursivo de um diretório para um servidor WebDAV através de HTTPS na linha de comando?


12

Estou enfrentando uma situação bastante simples, tenho que carregar, como está, uma grande árvore de arquivos em um servidor WebDAV acessível por HTTPS. Devo iniciar o upload a partir de uma caixa Linux com apenas linha de comando. Eu posso instalar programas na caixa.

Eu tentei o Cadaver, mas ele não suporta o upload de diretório recursivo.

Você conhece ferramentas / scripts simples para conseguir isso?


Ok, eu encontrei algo que fez isso.

Comecei a partir do davpush.plscript que pode ser encontrado aqui https://github.com/ptillemans/davpush

Algumas mudanças foram necessárias:

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

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

Respostas:


2

Tente gnomevfs-copy:

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

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

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

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


O kio-client também poderia ter feito isso. Infelizmente, é uma caixa bastante restrita e não tenho o gnomevfs-copy nem o kio-client instalado.
Eskatos

Tente dave, se puder. Ele funciona de forma recursiva (mas, infelizmente para mim, ele não entende resposta com vários estados do servidor)
user36520

Dave fez isso com o servidor de destino, obrigado! Na verdade, não está muito longe do que eu fiz com base no script davpush que usa o próprio cadáver usando a API HTTP :: DAV perl. Mas com o dave, não é possível escrever facilmente um script de shell com vários comandos, porque é apenas interativo. Resposta aceita :)
eskatos

8

Aqui está um shell script rapidamente hackeado que permite fazer isso usando o 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 cadaverpara ainda permitir a digitação interativa de login / senhas. Eu acho que também é robusto o suficiente para lidar com nomes de arquivos e diretórios estranhos que contêm espaços, mas não testei nenhum caso como esse.


2

Uma solução pode ser o Rclone . Este é um programa de sincronização de linha de comando unidirecional, semelhante ao rsync, que suporta WebDAV (entre outros). Pode copiar recursivamente um diretório, ignorando os arquivos existentes no destino. Ele possui algumas opções de linha de comando para controlar o comportamento da sincronização, por exemplo, se você deseja que os arquivos de destino sejam excluídos se forem retirados da fonte. Existem pacotes disponíveis para muitas distribuições, mas você também pode instalar e executar o binário comum. Na 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:

1

Uma modificação da resposta de 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 de nberth:

Se [o acima] for chamado 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>

0

Estou no Ubuntu Linux. Com a ajuda do fusível (Sistema de arquivos no espaço do usuário) 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 davfs2 se ele 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

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

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

use_proxy       0         
use_locks       0
if_match_bug    1

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

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 à reinicialização.

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.