Làm cách nào để tải đệ quy một thư mục lên máy chủ WebDAV thông qua HTTPS từ dòng lệnh?


12

Tôi đang đối mặt với một tình huống khá đơn giản, tôi phải tải lên, như một cây tập tin lớn đến máy chủ WebDAV có thể truy cập qua HTTPS. Tôi phải bắt đầu tải lên từ một hộp linux chỉ với dòng lệnh. Tôi có thể cài đặt các chương trình trên hộp.

Tôi đã thử Cadaver nhưng nó không hỗ trợ tải lên thư mục đệ quy.

Bạn có biết các công cụ / tập lệnh đơn giản để đạt được điều đó?


Ok, tôi tìm thấy một cái gì đó đã làm điều đó.

Tôi đã bắt đầu từ davpush.pltập lệnh có thể tìm thấy ở đây https://github.com/ptillemans/davpush

Một số thay đổi là cần thiết:

  • thay thế tất cả " dav://" thành " https://"
  • thêm " print POUT "open";" trước " print POUT $script;"

Chết tiệt, phải hack một tập lệnh perl để tải lên một thư mục thô lỗ. Tôi vẫn đang tìm kiếm các công cụ / tập lệnh đơn giản.

Câu trả lời:


2

Hãy thử gnomevfs-copy:

Chỉnh sửa: gvfs-copy không được đệ quy. Tôi đã vá nó nhưng chưa xuất bản mã. Trong thời gian chờ đợi, hãy kiểm tra dave từ perldav. Nó không chuyển đệ quy.

Nếu bạn không có cầu chì bị vô hiệu hóa, bạn có thể thử davfs2

Nếu bạn không phản đối mã công cụ của riêng mình, bạn có thể sử dụng gvfs và lấy cảm hứng từ mã nguồn của gvfs-copy

Tôi đang gặp vấn đề tương tự, vì vậy tôi có thể quay lại với một giải pháp tốt hơn


kio-client có thể đã làm điều đó quá. Thật không may, đó là một hộp khá hạn chế và tôi không cài đặt gnomevfs cũng như kio-client.
eskatos

Hãy thử dave nếu bạn có thể. Nó hoạt động theo cách đệ quy (nhưng thật không may với tôi, nó không hiểu phản hồi đa tầng từ máy chủ)
user36520

Dave đã làm điều đó với máy chủ mục tiêu, cảm ơn! Trên thực tế, nó không quá xa so với những gì tôi đã làm dựa trên tập lệnh davpush sử dụng chính cadaver bằng cách sử dụng API HTTP :: DAV. Nhưng với dave, người ta không thể dễ dàng viết một kịch bản shell với một loạt các lệnh vì nó chỉ tương tác. Trả lời được chấp nhận :)
eskatos

8

Dưới đây là một kịch bản shell bị hack nhanh chóng cho phép thực hiện bằng cách sử dụng 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";

Nếu nó được đặt tên davcpy.shthì một lệnh như

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

cho phép một bản sao đệ quy từ

<local-directories>/<dirname>

vào một cái xa

<some-directories>/<dirname>

Lưu ý rằng nó sử dụng tiện ích kịch bản cadaverđể vẫn cho phép nhập thông tin đăng nhập / mật khẩu tương tác. Tôi nghĩ rằng nó cũng đủ mạnh để xử lý các tên tệp và thư mục lạ chứa khoảng trắng, nhưng tôi đã không kiểm tra bất kỳ trường hợp nào như thế.


2

Một giải pháp có thể là Rclone . Đây là chương trình đồng bộ hóa dòng lệnh một chiều, tương tự như rsync, hỗ trợ WebDAV (trong số các chương trình khác). Nó có thể sao chép đệ quy một thư mục, bỏ qua các tệp tồn tại trên đích. Ví dụ, nó có một số tùy chọn dòng lệnh để kiểm soát hành vi đồng bộ hóa, cho dù bạn muốn xóa các tệp mục tiêu nếu chúng bị lấy khỏi nguồn. Có các gói có sẵn cho nhiều bản phát hành nhưng bạn cũng có thể cài đặt và chạy tệp nhị phân đơn giản. Lần đầu tiên, bạn sẽ cần xác định "từ xa":

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

Sau đó, bạn có thể sao chép hoặc đồng bộ hóa tệp và thư mục:

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

1

Một sửa đổi của câu trả lời của nberth hoạt động trên 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";

Cách sử dụng là như nhau. Trích dẫn từ câu trả lời của nberth:

Nếu [ở trên] được đặt tên là davcpy.sh thì một lệnh như

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

cho phép một bản sao đệ quy từ

<local-directories>/<dirname>

vào một cái xa

<some-directories>/<dirname>

0

Tôi đang dùng Ubuntu Linux. Với sự trợ giúp của cầu chì, (Hệ thống tập tin trong không gian người dùng) và mountdavfs (davfs2), bạn có thể gắn thư mục con trên máy chủ Webdav dưới dạng thư mục cục bộ.

Mở terminal của bạn và tiến hành như sau:

  • Cài đặt davfs2 nếu nó chưa tồn tại: sudo apt-get install davfs2

  • Kết nối với máy chủ Webdav:

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

(Chủ sở hữu hệ thống tập tin phải được nhập, nếu không thì không có quyền ghi)

Ngoài ra, tôi đã phải nhập những dòng này vào /etc/dafs2/davfs2.conf:

use_proxy       0         
use_locks       0
if_match_bug    1

Xem https://bugs.launchpad.net/ubfox/+source/davfs2/+orms/466960

mount - Lệnh - Kết quả (Dòng đầu ra cuối cùng):

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)

Ngoài ra, hãy kiểm tra xem có một tập tin kỳ lạ nào không ~/.davfs2/secrets- có thể là cần thiết, để gắn kết vĩnh viễn tồn tại trong quá trình khởi động lại.

Bây giờ bạn có thể ban hành các lệnh như cp -vr /data/myphotos /media/somedirvà các tệp sẽ được sao chép đệ quy và được tải lên trang web web.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.