Catatan penting:Mesin yang Anda sebut "mesin lokal" sama sekali tidak relevan. Kisah sebenarnya dimulai ketika Anda sudah berada di 100.100.100.1
. Dalam konteks scp
dan dalam konteks jawaban ini "lokal" adalah mesin tempat scp
dipanggil oleh Anda.
Mengapa [perintah] pertama gagal?
Anda mencoba menyalin antara dua (secara formal) host jarak jauh. scp
mengenali [email protected]:/path/1/
sebagai jalur non-lokal. Tidak masalah [email protected]
menunjuk ke mesin lokal. Alat tidak (dan tidak seharusnya) memeriksa apakah alamat yang terlihat jauh mengarah ke mesin lokal. Hanya dengan merujuk ke sumber seolah-olah itu jauh, Anda membuat scp
memperlakukannya sebagai jauh. Juga tujuannya jauh.
Menyalin antara dua host jarak jauh dapat dilakukan dengan atau tanpa -3
opsi:
-3
Salinan antara dua host jarak jauh ditransfer melalui host lokal. Tanpa opsi ini, data disalin langsung antara dua host jarak jauh. […]
Fragmen tebal berlaku untuk kasus Anda (meskipun scp
Anda tidak mendukung -3
).
Jika Anda menggunakan -v
dengan perintah pertama Anda
scp -v -i ~/keyfile -r [email protected]:/path/1/ [email protected]:/path/2/
Anda akan melihat scp
terhubung dari host lokal ke host sumber ("kebetulan" menjadi host yang sama) menggunakan kunci yang ditentukan dengan -i
. (Tampaknya host dikonfigurasi untuk menerima kunci ini, mungkin karena server lain menggunakan kunci yang sama untuk terhubung.)
Kemudian Anda akan melihat scp
lainnya dipanggil pada host sumber. Perintahnya adalah:
scp -v -r /path/1/ [email protected]:/path/2/
-v
dan -r
ada di sana karena mereka berada di perintah lokal Anda. Jalur sumber diterjemahkan ke jalur lokal; tujuan tidak berubah. Jika perintah ini berhasil dijalankan, data akan "disalin langsung antara dua host jarak jauh".
Perhatikan tidak ada -i
. Harus -i ~/keyfile
berada di sana? Atau lebih tepatnya -i /home/cindy/keyfile
atau lebih? (karena scp
lokal mendapatkan sesuatu seperti ini setelah shell lokal memperluas tilde).
Tidak. Secara umum host sumber jarak jauh mungkin (dan biasanya) berbeda dari host lokal. Jalur yang valid untuk host lokal dapat menunjuk ke apa pun atau tidak sama sekali pada host jarak jauh. Jika scp
pada host sumber dipanggil dengan -i
, itu akan menyebabkan lebih banyak masalah daripada yang bisa dipecahkan. Untung -i
tidak menyebar ke perintah yang dipanggil pada host sumber. Namun kemudian host terhubung ke tujuan menggunakan kunci defaultnya atau apa pun yang diperintahkan konfigurasinya untuk digunakan.
Dalam kasus Anda, tampaknya seseorang memerlukan ~/keyfile
lokal untuk terhubung ke host tujuan. Host sumber memegang file yang tepat (karena dalam kasus khusus ini lokal dan sumbernya adalah mesin yang sama), tetapi scp
perintah yang benar-benar terhubung ke tujuan tidak memiliki -i
(sebagaimana mestinya pada umumnya) dan karena itu kuncinya tidak digunakan.
Perintah kedua Anda menggunakan jalur lokal sebagai sumber, hanya tujuan yang jauh. Dalam hal ini kunci ditentukan dengan -i
digunakan untuk terhubung dari host lokal ke host tujuan, persis seperti yang Anda rencanakan. Oleh karena itu berhasil.
Perhatikan jika Anda mengonfigurasi mesin lokal untuk menggunakan ~/keyfile
secara otomatis untuk terhubung ke server lain (IdentityFile
di ~/.ssh/config
), maka perintah pertama akan berhasil. Host lokal tidak perlu terhubung ke dirinya sendiri, hanya untuk memberitahu dirinya sendiri untuk terhubung ke tujuan, tetapi tetap saja itu akan berhasil. Sambungan pertama akan menggunakan ~/keyfile
karena -i
, sambungan kedua akan menggunakan ~/keyfile
karena konfigurasinya.
Dari manual scp, -3 opsi deskripsi:Salinan antara dua host jarak jauh ditransfer melalui host lokal. Tanpa opsi ini, data disalin langsung antara dua host jarak jauh. Perhatikan bahwa opsi ini menonaktifkan pengukur kemajuan dan memilih mode batch untuk host kedua, karena scp tidak dapat meminta sandi atau frasa sandi untuk kedua host.
Menurut deskripsi pertama gagal karena 2 server jarak jauh akan berkomunikasi secara langsung (dalam server 100.100.100.1 nyata akan berkomunikasi dengan server 100.100.100.2 melalui ssh) oleh karena itu Anda harus memilih:
- Gunakan opsi -3.
- Konfigurasi 2 server jarak jauh agar dapat mengautentikasi dengan keyfile ssh key. Jika Anda dapat masuk dari server 100.100.100.1 ke 100.100.100.2 dengan kunci ssh, perintah asli Anda akan berfungsi.