Bagaimana cara mengunggah direktori ke server WebDAV secara rekursif melalui HTTPS dari baris perintah?

12

Saya menghadapi situasi yang agak sederhana, saya harus mengunggah, apa adanya, pohon besar file ke server WebDAV yang dapat dijangkau melalui HTTPS. Saya harus mulai mengunggah dari kotak linux hanya dengan baris perintah. Saya dapat menginstal program di kotak.

Saya sudah mencoba mayat tetapi tidak mendukung pengunggahan direktori rekursif.

Apakah Anda tahu alat / skrip sederhana untuk mencapai itu?


Ok, saya menemukan sesuatu yang berhasil.

Saya mulai dari davpush.plskrip yang dapat ditemukan di sini https://github.com/ptillemans/davpush

Beberapa perubahan diperlukan:

  • ganti semua " dav://" menjadi " https://"
  • tambahkan " print POUT "open";" sebelum " print POUT $script;"

Sial, harus meretas skrip perl untuk hanya mengunggah direktori yang tidak sopan. Saya masih mencari alat / skrip sederhana.

eskato
sumber

Jawaban:

2

Coba gnomevfs-copy:

Sunting: gvfs-copy tidak bersifat rekursif. Saya menambalnya tetapi belum havi untuk menerbitkan kode. Sementara itu, periksa dave dari perldav. Itu transfer rekursif.

Jika sekring Anda tidak dinonaktifkan, Anda dapat mencoba davfs2

Jika Anda tidak merugikan dengan kode alat Anda sendiri, Anda bisa menggunakan gvfs dan mendapatkan inspirasi dari kode sumber gvfs-copy

Saya mengalami masalah serupa, jadi saya dapat kembali dengan solusi yang lebih baik

user36520
sumber
kio-client bisa melakukannya juga. Sayangnya ini adalah kotak yang sangat terbatas dan saya tidak memiliki gnomevfs-copy atau kio-client yang diinstal.
eskatos
Cobalah dave jika Anda bisa. Ini bekerja secara rekursif (tapi sayangnya bagi saya, itu tidak mengerti respon multistatus dari server)
user36520
dave melakukannya dengan server target, terima kasih! Sebenarnya itu tidak jauh dari apa yang saya lakukan berdasarkan pada skrip davpush yang menggunakan cadaver itu sendiri menggunakan perl HTTP :: DAV API. Tetapi dengan dave, seseorang tidak dapat dengan mudah menulis skrip shell dengan banyak perintah karena hanya interaktif. Jawaban diterima :)
eskatos
8

Berikut ini adalah skrip shell yang diretas dengan cepat yang memungkinkan untuk melakukannya menggunakan mayat :

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

Jika itu dinamai davcpy.shmaka perintah seperti

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

memungkinkan salinan rekursif dari

<local-directories>/<dirname>

menjadi yang jauh bernama

<some-directories>/<dirname>

Perhatikan bahwa ia menggunakan fasilitas scripting cadaveruntuk tetap mengizinkan pengetikan login / kata sandi interaktif. Saya pikir itu juga cukup kuat untuk menangani file aneh dan nama direktori yang mengandung spasi, tapi saya tidak menguji kasus seperti itu.

nberth
sumber
2

Sebuah solusi bisa berupa Rclone . Ini adalah program sinkronisasi baris perintah satu arah, mirip dengan rsync, yang mendukung WebDAV (antara lain). Itu bisa secara rekursif menyalin direktori, melewatkan file yang ada di tujuan. Ini memiliki beberapa opsi baris perintah untuk mengontrol perilaku sinkronisasi, misalnya, apakah Anda ingin file target dihapus jika mereka pergi dari sumber. Ada paket yang tersedia untuk banyak distro tetapi Anda juga dapat menginstal dan menjalankan biner biasa. Pertama kali, Anda harus mendefinisikan "remote":

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

Setelah itu, Anda dapat menyalin atau menyinkronkan file dan direktori:

rclone copy /home/onno/mydir my-remote:
Tidak bernama
sumber
1

Modifikasi jawaban nberth yang berfungsi di 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";

Penggunaannya sama. Mengutip dari jawaban kesembilan:

Jika [di atas] bernama davcpy.sh maka perintahnya seperti

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

memungkinkan salinan rekursif dari

<local-directories>/<dirname>

menjadi yang jauh bernama

<some-directories>/<dirname>
JayQuerie.com
sumber
0

Saya di Ubuntu Linux. Dengan bantuan sekering, (Filesystem di Userspace), dan mountdavfs (davfs2), Anda dapat memasang subdirektori pada server Webdav sebagai folder lokal.

Buka terminal Anda dan lanjutkan sebagai berikut:

  • Instal davfs2 jika belum ada: sudo apt-get install davfs2

  • Terhubung ke server Webdav:

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

(Pemilik sistem file harus dimasukkan, jika tidak tidak ada hak tulis yang hadir)

Selain itu saya harus memasukkan baris ini ke /etc/dafs2/davfs2.conf:

use_proxy       0         
use_locks       0
if_match_bug    1

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

mount - Perintah - Hasil (Baris terakhir keluaran):

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)

Juga periksa apakah ada file aneh ~/.davfs2/secrets- mungkin diperlukan, untuk tunggangan permanen yang selamat dari reboot.

Sekarang Anda dapat mengeluarkan perintah seperti cp -vr /data/myphotos /media/somedirdan file akan disalin secara rekursif, dan diunggah ke situs webdav.

knb
sumber