Saya ingin menggunakan scp
untuk mengunggah file tetapi terkadang direktori target mungkin tidak ada.
Apakah mungkin membuat folder secara otomatis? Jika ya, bagaimana caranya? Jika tidak, cara alternatif apa yang bisa saya coba?
Ini adalah salah satu dari banyak hal yang rsync
dapat dilakukan.
Jika Anda menggunakan versi yang rsync
dirilis dalam beberapa tahun terakhir, ¹ sintaks perintah dasarnya mirip dengan scp
: ²
$ rsync -r local-dir remote-machine:path
Itu akan menyalin local-source
dan isinya ke $HOME/path/local-dir
pada mesin jarak jauh, membuat direktori apa pun yang diperlukan.³
rsync
memang memiliki beberapa batasan di sini yang dapat mempengaruhi apakah ini akan berhasil dalam situasi khusus Anda. Itu tidak akan membuat beberapa level direktori remote yang hilang, misalnya; itu hanya akan membuat hingga satu level yang hilang pada remote. Anda dapat dengan mudah menyiasati ini dengan mendahului rsync
perintah dengan sesuatu seperti ini:
$ ssh remote-host 'mkdir -p foo/bar/qux'
Itu akan membuat $HOME/foo/bar/qux
pohon jika tidak ada. Ini tidak akan mengeluh atau melakukan hal lain yang buruk jika tidak sudah ada.
rsync
terkadang memiliki perilaku mengejutkan lainnya. Pada dasarnya, Anda memintanya untuk mencari tahu apa yang ingin Anda salin, dan tebakannya mungkin tidak cocok dengan asumsi Anda. Cobalah dan lihatlah. Jika tidak berperilaku seperti yang Anda harapkan dan Anda tidak dapat melihat alasannya, posting lebih detail tentang pengaturan direktori lokal dan jauh Anda, dan berikan perintah yang Anda coba.
Catatan kaki :
Sebelum rsync
2.6.0 (1 Jan 2004), diperlukan -e ssh
bendera untuk membuatnya berperilaku seperti scp
karena default ke protokol RSH yang sudah usang .
scp
dan rsync
berbagi beberapa bendera, tetapi hanya ada sedikit tumpang tindih.
Saat menggunakan SSH
sebagai protokol transfer, rsync
gunakan default yang sama. Jadi, sama seperti scp
, itu akan menganggap ada pengguna dengan nama yang sama dengan pengguna lokal Anda pada mesin remote secara default.
rsync
halaman dokumentasi yang dicari , tidak menemukan cara menggunakan ssh-key untuk login. Saya tidak ingin menggunakan nama pengguna / kata sandi untuk masukrsync
. Dan ya, Anda perlursync
di sisi yang jauh juga, sama seperti denganscp
. Adapun kunci SSH,rsync
sebenarnya menggunakan SSH di bawahnya dengan default-e ssh
, jadi jika Anda memiliki kunci yang diatur untuk digunakanscp
, mereka akan bekerjarsync
juga.-r
tidak ada bedanya. Skenario yang Anda uraikan hanya berfungsi jika Anda menyalin direktori dan jika direktori induk target ada. Jadi,rsync foo/ u@h:~/
akan membuat direktori targetfoo
tetapirsync foo/ u@h:~/bar/
tidak akan membuat direktori targetbar
. Yang itubar/foo
hanya akan dibuat jikabar/
ada. Bagaimanapun, OP mengunggah file dan bahkan dalam kasus di mana ini bekerja, OP hanya berfungsi untuk seluruh direktori.rsync file host:/foo/file
gagal jikafoo/
tidak ada tetapirsync file host:/foo/
membuat direktori dan tempatfile
di dalamnya. Aneh. Bagaimanapun, Anda benar dan skenario dasarnya berfungsi, saya akan menarik kembali downvote saya.Jika Anda menyalin sekelompok file, tidak juga. Jika Anda menyalin direktori dan semua konten di bawahnya, ya. Diberi perintah ini:
Jika
directory
tidak ada~/the/target
aktifhost
, itu akan dibuat. Namun, jika~the/target
tidak ada, Anda mungkin akan memiliki masalah - saya tidak ingat hasil pasti dari kasus ini, tetapi bersiaplah untuk yang dimaksudkanscp
untuk gagal.sumber
scp: /home/madmike/test_bin: No such file or directory
Segera setelah direktori target hilang, ini rusak pada pengaturan saya. Menggunakan cygwin di klien dan RHEL 6.9 di server. Apa pengaturan Anda?Sejauh yang saya tahu,
scp
itu sendiri tidak bisa melakukan itu, tidak. Namun, Anda bisa langsungssh
ke mesin target, membuat direktori lalu menyalin. Sesuatu seperti:Perhatikan bahwa jika Anda menyalin seluruh direktori, hal di atas tidak diperlukan. Misalnya, untuk menyalin direktori
~/foo
ke host jarak jauh, Anda bisa menggunakan-r
bendera (rekursif):Itu akan membuat direktori target
~/foo
pada host jarak jauh. Namun, itu tidak dapat membuat direktori induk.scp ~/foo user@host:~/bar/foo
akan gagal kecuali direktori targetbar
ada. Bagaimanapun,-r
flag tidak akan membantu membuat direktori target jika Anda menyalin file individual.sumber
Ya kamu bisa. Menurut halaman manual scp:
sumber
scp -r foo/ u@h:~/bar
akan membuatbar/foo
jika remotebar/
ada tetapi akan gagal jika tidak.foo
konten ke direktori baru/bar
. Tentu saja namanya telah diubah yang mungkin bukan yang diinginkan OP. Jika yang Anda inginkan adalah struktur pohon baru yang dibuat di mesin tujuan makascp
tidak akan melakukan pekerjaan, jika apa yang Anda inginkan adalah mereplikasi struktur pohon dari cabang tertentu di pohon maka struktur itu dibuat.scp -r file host:~/bar/
tidak akan membuatbar/
.Saya menggunakan fungsi berikut sebelum mentransfer
btrfs
fotossh
:Cukup panggil fungsi dalam skrip Anda dengan:
check_remote_dir /my/remote/path
sumber
Anda bisa mengaitkan perintah dengan perintah mkdir dan kemudian merujuk ke folder yang Anda buat:
sumber
Ketika dibatasi hanya scp atau sftp tanpa ssh tersedia (oleh rssh), dimungkinkan untuk membuat direktori dengan menyalin pohon direktori kosong dengan rsync dan kemudian menyalin file.
Itulah cara saya meletakkan kunci ssh publik ke host jarak jauh ketika ssh-copy-id tidak berfungsi dan direktori .ssh tidak ada:
Dimungkinkan untuk menggabungkan perintah-perintah ini menjadi satu rsync menambahkan satu lagi filter sertakan di tengah, jika nama file target adalah sama.
sumber