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?
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?
Jawaban:
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 masuk
rsync
. Dan ya, Anda perlu rsync
di sisi yang jauh juga, sama seperti dengan scp
. Adapun kunci SSH, rsync
sebenarnya menggunakan SSH di bawahnya dengan default -e ssh
, jadi jika Anda memiliki kunci yang diatur untuk digunakan scp
, mereka akan bekerja rsync
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 target foo
tetapi rsync foo/ u@h:~/bar/
tidak akan membuat direktori target bar
. Yang itu bar/foo
hanya akan dibuat jika bar/
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 jika foo/
tidak ada tetapi rsync file host:/foo/
membuat direktori dan tempat file
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:
$ scp -pr /source/directory user@host:the/target/directory
Jika directory
tidak ada ~/the/target
aktif host
, 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 dimaksudkan scp
untuk gagal.
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 langsung ssh
ke mesin target, membuat direktori lalu menyalin. Sesuatu seperti:
ssh user@host "mkdir -p /target/path/" &&
scp /path/to/source user@host:/target/path/
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):
scp ~/foo/ user@host:~/
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 target bar
ada. Bagaimanapun, -r
flag tidak akan membantu membuat direktori target jika Anda menyalin file individual.
Ya kamu bisa. Menurut halaman manual scp:
man scp
.....
-r Salin seluruh direktori secara rekursif. Perhatikan bahwa scp mengikuti tautan simbolik yang ditemui di traversal pohon.
....
scp -r foo/ u@h:~/bar
akan membuat bar/foo
jika remote bar/
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 maka scp
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 membuat bar/
.
Saya menggunakan fungsi berikut sebelum mentransfer btrfs
foto ssh
:
check_remote_dir() {
printf "\ntesting remote directory: '$1' "
if ssh -p $PORT $ROOT@$REMOTE "[ ! -d $1 ]"; then
printf "\nCreating: $1 on $ROOT@$REMOTE\n"
ssh -p $PORT $ROOT@$REMOTE "mkdir -p $1"
else
printf "[OK]\n"
fi
}
Cukup panggil fungsi dalam skrip Anda dengan:
check_remote_dir /my/remote/path
Anda bisa mengaitkan perintah dengan perintah mkdir dan kemudian merujuk ke folder yang Anda buat:
mkdir ~/new-folder/ && scp -P 22 <remote/url>:~/new-folder/
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:
rsync -e 'ssh -p22' -av -f"+ */" -f"- *" ~/.ssh backup@1.2.3.4:~/
scp -P22 ~/.ssh/id_rsa.pub backup@1.2.3.4:~/.ssh/authorized_keys
Dimungkinkan untuk menggabungkan perintah-perintah ini menjadi satu rsync menambahkan satu lagi filter sertakan di tengah, jika nama file target adalah sama.