명령 행에서 HTTPS를 통해 WebDAV 서버에 디렉토리를 재귀 적으로 업로드하는 방법은 무엇입니까?


12

나는 다소 간단한 상황에 직면하고 있으며, HTTPS를 통해 연결할 수 있는 WebDAV 서버에 큰 파일 트리를 그대로 업로드해야합니다 . 커맨드 라인만으로 리눅스 박스에서 업로드를 시작해야합니다. 상자에 프로그램을 설치할 수 있습니다.

Cadaver를 시도 했지만 재귀 디렉토리 업로드를 지원하지 않습니다.

이를 달성하기위한 간단한 도구 / 스크립트를 알고 있습니까?


좋아, 나는 그것을 한 것을 발견했다.

https://github.com/ptillemans/davpushdavpush.pl 에서 찾을 수있는 스크립트 에서 시작했습니다.

몇 가지 변경이 필요했습니다.

  • 모든 " dav://"을 " https://"로 교체
  • " print POUT "open";"앞에 " print POUT $script;" 추가

젠장, 단순히 무례한 디렉토리를 업로드하기 위해 펄 스크립트를 해킹해야했다. 여전히 간단한 도구 / 스크립트를 찾고 있습니다.

답변:


2

시도 gnomevfs-copy:

편집 : gvfs-copy는 재귀 적이 지 않습니다. 나는 그것을 패치했지만 아직 코드를 게시해야합니다. 그 동안 perldav에서 dave 를 확인하십시오 . 재귀 전송을 수행합니다.

퓨즈를 비활성화하지 않은 경우 davfs2 를 사용해보십시오 .

자신의 도구를 작성하는 데 불리하지 않은 경우 gvfs를 사용 하여 gvfs-copy소스 코드 에서 영감을 얻을 수 있습니다.

비슷한 문제가 발생하여 더 나은 솔루션으로 돌아올 수 있습니다.


kio-client도 그렇게 할 수 있습니다. 불행히도 그것은 매우 제한된 상자이며 gnomevfs-copy 또는 kio-client가 설치되어 있지 않습니다.
eskatos

가능하면 데이브를 시도하십시오. 재귀 적으로 작동합니다 (그러나 불행히도 서버의 다중 상태 응답을 이해하지 못합니다)
user36520 2016

데이브가 대상 서버로 해냈습니다. 감사합니다! 실제로 perl HTTP :: DAV API를 사용하여 시체 자체를 사용하는 davpush 스크립트를 기반으로 한 것과 멀지 않습니다. 그러나 dave에서는 대화식으로 만 제공되므로 많은 명령으로 쉘 스크립트를 쉽게 작성할 수 없습니다. 답변 허용 :)
eskatos

8

다음은 시체를 사용하여 빠르게 해킹 할 수있는 쉘 스크립트입니다 .

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

이름이 davcpy.sh다음과 같은 명령이면

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

재귀 복사본을

<local-directories>/<dirname>

원격으로 명명

<some-directories>/<dirname>

이 스크립트는 스크립트 기능을 사용하여 cadaver로그인 / 암호를 대화식으로 입력 할 수 있습니다. 공백이 포함 된 이상한 파일 및 디렉토리 이름을 처리 할만 큼 강력하다고 생각하지만 그런 경우는 테스트하지 않았습니다.


2

해결책은 Rclone 일 수 있습니다 . 이것은 rsync와 유사하게 WebDAV를 지원하는 단방향 명령 행 동기화 프로그램입니다. 대상에 존재하는 파일을 건너 뛰면서 디렉토리를 반복적으로 복사 할 수 있습니다. 예를 들어, 대상 파일이 소스에서 삭제 된 경우 삭제할지 여부와 같은 동기화 동작을 제어하기위한 일부 명령 행 옵션이 있습니다. 많은 배포판에 사용할 수있는 패키지가 있지만 일반 바이너리를 설치하고 실행할 수도 있습니다. 처음으로 "원격"을 정의해야합니다.

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

그런 다음 파일과 디렉토리를 복사하거나 동기화 할 수 있습니다.

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

1

OSX에서 작동하는 nberth의 답변 수정 :

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

사용법은 같습니다. nberth의 답변에서 인용 :

[위]의 이름이 davcpy.sh이면

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

재귀 복사본을

<local-directories>/<dirname>

원격으로 명명

<some-directories>/<dirname>

0

우분투 리눅스를 사용하고 있습니다. fuse (사용자 공간의 파일 시스템) 및 mountdavfs (davfs2)를 사용하여 Webdav 서버의 하위 디렉토리를 로컬 폴더로 마운트 할 수 있습니다.

터미널을 열고 다음과 같이 진행하십시오.

  • davfs2가 없으면 설치하십시오. sudo apt-get install davfs2

  • Webdav 서버에 연결하십시오.

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

(파일 시스템의 소유자를 입력해야하며, 그렇지 않으면 쓰기 권한이 없습니다)

또한이 줄을 입력해야했습니다 /etc/dafs2/davfs2.conf.

use_proxy       0         
use_locks       0
if_match_bug    1

참조 https://bugs.launchpad.net/ubuntu/+source/davfs2/+bug/466960를

mount -명령-결과 (마지막 출력) :

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)

~/.davfs2/secrets재부팅 후에도 영구 마운트가 필요한 경우 이상한 파일이 있는지 확인하십시오 .

이제 같은 명령을 실행할 수 cp -vr /data/myphotos /media/somedir있으며 파일이 재귀 적으로 복사되어 webdav 사이트에 업로드됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.