จะอัพโหลดไดเรกทอรีไปยังเซิร์ฟเวอร์ WebDAV ซ้ำผ่าน HTTPS จากบรรทัดคำสั่งได้อย่างไร


12

ฉันกำลังเผชิญกับสถานการณ์ที่ค่อนข้างง่ายฉันต้องอัปโหลดไฟล์ต้นไม้ขนาดใหญ่ไปยังเซิร์ฟเวอร์WebDAVที่สามารถเข้าถึงได้ผ่าน HTTPS ฉันจะต้องเริ่มต้นการอัพโหลดจากกล่อง linux ด้วยบรรทัดคำสั่งเท่านั้น ฉันสามารถติดตั้งโปรแกรมบนกล่อง

ฉันได้ลองCadaver แล้วแต่ไม่รองรับการอัปโหลดไดเรกทอรีซ้ำ

คุณรู้จักเครื่องมือ / สคริปต์ง่าย ๆ เพื่อให้บรรลุหรือไม่


ตกลงฉันพบสิ่งที่ทำ

ฉันเริ่มต้นจากdavpush.plสคริปต์ที่สามารถพบได้ที่นี่https://github.com/ptillemans/davpush

ต้องการการเปลี่ยนแปลงบางอย่าง:

  • แทนที่ " dav://" เป็น " https://" ทั้งหมด
  • เพิ่ม " print POUT "open";" ก่อน " print POUT $script;"

ประณามการแฮกสคริปต์ perl เพื่ออัปโหลดไดเรกทอรีที่หยาบคาย ฉันยังคงมองหาเครื่องมือ / สคริปต์อย่างง่าย

คำตอบ:


2

ลองgnomevfs-copy:

แก้ไข: gvfs-copy ไม่สามารถเรียกซ้ำได้ ฉันแก้ไขมัน แต่ยัง havi เพื่อเผยแพร่รหัส ในระหว่างนี้ให้ตรวจสอบdaveจาก perldav มันจะถ่ายโอนซ้ำ

หากคุณไม่ได้ปิดการใช้งานฟิวส์คุณสามารถลองdavfs2

หากคุณไม่ต้องการเขียนโค้ดเครื่องมือของคุณเองคุณสามารถใช้ gvfs และรับแรงบันดาลใจจากซอร์สโค้ดของ gvfs-copy

ฉันมีปัญหาที่คล้ายกันดังนั้นฉันอาจกลับมาพร้อมทางออกที่ดีกว่า


kio-client ก็ทำได้เช่นกัน น่าเสียดายที่มันเป็นกล่องที่ค่อนข้าง จำกัด และฉันไม่ได้ติดตั้ง gnomevfs-copy หรือ kio-client
eskatos

ลองเดฟถ้าคุณทำได้ มันทำงานซ้ำ ๆ (แต่น่าเสียดายที่ฉันไม่เข้าใจการตอบสนองแบบหลายขั้นตอนจากเซิร์ฟเวอร์)
user36520

เดฟทำกับเซิร์ฟเวอร์เป้าหมายขอบคุณ! ในความเป็นจริงมันไม่ไกลจากสิ่งที่ฉันทำตามสคริปต์ davpush ที่ใช้ซากศพเองโดยใช้ perl HTTP :: DAV API แต่ด้วยเดฟเราไม่สามารถเขียนเชลล์สคริปต์ได้อย่างง่ายดายด้วยคำสั่งจำนวนมากเพราะมันเป็นแบบโต้ตอบเท่านั้น ตอบรับได้แล้ว :)
eskatos

8

นี่คือ hacked ได้อย่างรวดเร็วเชลล์สคริปต์ว่าใบอนุญาตให้ทำ tha ใช้ซากศพ :

#!/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 (รวมถึงอื่น ๆ ) สามารถคัดลอกไดเรกทอรีซ้ำข้ามไฟล์ที่มีอยู่ในปลายทาง มันมีตัวเลือกบรรทัดคำสั่งบางอย่างเพื่อควบคุมพฤติกรรมการซิงค์ตัวอย่างเช่นคุณต้องการลบไฟล์เป้าหมายหรือไม่หากพวกเขาหายไปจากแหล่งที่มา มีแพ็กเกจสำหรับ distros จำนวนมาก แต่คุณสามารถติดตั้งและรันไบนารีธรรมดาได้ ในครั้งแรกคุณจะต้องกำหนด "ระยะไกล":

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

หลังจากนั้นคุณสามารถคัดลอกหรือซิงค์ไฟล์และ dirs:

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

1

การแก้ไขคำตอบของ nberth ที่ทำงานบน 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";

การใช้งานเหมือนกัน อ้างจากคำตอบของ nberth:

หาก [ข้างต้น] ชื่อ davcpy.sh ดังนั้นคำสั่งจะเหมือนกับ

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

อนุญาตให้คัดลอกซ้ำจาก

<local-directories>/<dirname>

เป็นชื่อรีโมต

<some-directories>/<dirname>

0

ฉันใช้ Ubuntu Linux ด้วยความช่วยเหลือของฟิวส์ (ระบบไฟล์ใน Userspace) และ 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.