scp dari satu server jauh ke server jauh lain

15

Saya punya satu file besar di server onedan saya ingin menyalinnya ke server twomenggunakan scp. Saya memiliki pengaturan tombol yang benar dan saya dapat ssh / scp ke kedua server dari desktop saya.

File yang saya perlu salin lebih besar daripada ruang kosong di hdd workstation saya, jadi saya ingin melakukan:

scp one:/opt/bigfile.tar.gz two:/opt/bigfile.tar.gz

tapi saya mendapat:

ssh: Could not resolve hostname one: Name or service not known

Kami tidak memiliki DNS di sini (jangan tanya kenapa), jadi saya punya ini di ~ / .ssh / config saya:

Host one
    Hostname        <IP address of server one>
    User            jspurny

Host two
    Hostname        <IP address of server two>
    User            jspurny

Jika saya mencoba dengan file yang lebih kecil dan mentransfernya dari oneke workstation saya dan kemudian ke two, itu berfungsi dengan baik:

scp one:/opt/smallerfile.tar.gz .
scp smallerfile.tar.gz two:/opt/

Saat menggunakan alamat IP secara langsung seperti yang disarankan dalam komentar, saya mendapat:

$ scp jspurny@<one's IP>:bigfile.tar.gz jspurny@<two's ip>:bigfile.tar.gz
Host key verification failed.
lost connection

Bukan masalah:

Ukurannya bukan masalah di sini - itu hanya "pemicu" untuk masalah ini karena tidak ada cara untuk menyimpan bigfile.tar.gzdi workstation saya. Masalah terjadi terlepas dari ukuran file.

Pertanyaan:

Mengapa perintahnya:

scp oneremote:file secondremote:file

melempar kesalahan terlepas dari apakah menggunakan .ssh/configalias atau langsung menggunakan alamat ip?

Diselesaikan - semacam - masih mencari penjelasan - Saya telah membagi file besar ke file yang lebih kecil dan mentransfernya satu per satu melalui workstation saya. Saya masih bertanya-tanya mengapa itu tidak berhasil. Jadi saya masih akan menghargai beberapa penjelasan tentang apa yang salah ..

Menemukan alasan mengapa gagal: Sepertinya saya bodoh. Saya pikir itu perintahnya

scp one:file two:file

sedang membuat dua koneksi ke setiap server dan kemudian menerima data dari satu dan segera mengirimkannya ke dua dan dengan demikian bertindak seperti relay.

Ini jelas bukan masalahnya, karena -vopsi sederhana mengungkapkan bahwa sebenarnya hanya terhubung ke satu dan dari satu ia mencoba untuk terhubung ke dua . Yang jelas tidak mungkin karena server satu seharusnya tidak terhubung ke dua .

Jan Spurny
sumber
Apakah Anda mencoba mengubah perintah scp Anda untuk menggunakan alamat IP saja seperti "scp jspurny @ ip_address_server_one: /opt/bigfile.tar.gz jspurny @ ip_address_server_two: /opt/bigfile.tar.gz".
@tchester: Saya lakukan sekarang, tetapi hanya memberikan kesalahan yang berbeda (lihat pertanyaan yang diedit)
Jan Spurny
@slm tidak, saya tidak punya masalah dengan ukuran.
Jan Spurny
Ketika saya telah menemukan penjelasan tentang kesalahan, saya ingin menambahkan / menerimanya sebagai jawaban saya sendiri, tetapi bagi saya itu agak tidak adil karena sebenarnya tidak menyelesaikan masalah. Apakah Anda pikir saya harus mengubah pertanyaan menjadi: Bagaimana cara menyalin file dari server satu ke server dua menggunakan workstation saya sebagai relay? atau haruskah saya menambahkan penjelasan saya tentang ketidakmampuan saya untuk menggunakan opsi --verbose sebagai jawaban dan menerimanya?
Jan Spurny

Jawaban:

6

Pipa sederhana

Coba ini:

ssh one 'cat file' | ssh two 'cat > file'

Yang pertama harus mengirim konten file ke mesin Anda, sedangkan yang kedua harus mengirim yang ke mesin kedua. Saya akan menghitung checksum di kedua ujung setelah transfer, untuk memastikan bahwa tidak ada yang hilang atau rusak di sepanjang jalan.

Terowongan yang rumit

Untuk aplikasi yang lebih rumit, Anda bisa menggunakan terowongan ssh. Misalnya, Anda dapat mencoba sesuatu seperti ini:

ssh -R 5001:127.0.0.1:5002 one
ssh -L 5002:127.0.0.1:22 two

Kemudian Anda dapat membuka koneksi oneke localhostport mesin 5001dan itu akan diteruskan dua kali dan berakhir sebagai koneksi twoke localhostport 22. Ini adalah port ssh, jadi Anda dapat menggunakan ini untuk scp lain, atau untuk rsync, atau apa pun. Anda juga dapat memulai rsyncserver two, dan meneruskan port 873 alih-alih 22. Atau Anda dapat menggunakan ncdi kedua sisi untuk mentransfer data mentah, menggunakan nomor port yang sewenang-wenang.

Manfaat utama antara pendekatan di atas adalah bahwa Anda memiliki koneksi tcp dua arah antara kedua mesin, alih-alih pipa satu arah saja. Dengan begitu, kedua pihak dapat bertukar informasi, yang sangat penting dalam rsynckasus ini.

MvG
sumber
1
Terima kasih! Ini tidak melakukan persis apa yang saya inginkan , tetapi apa yang sebenarnya saya butuhkan , sangat bagus.
Jan Spurny
16

Kredit penuh untuk jawaban ini pergi ke /superuser//a/602436/142948

Anda memerlukan -3opsi untuk scp:

scp -3 one:/opt/bigfile.tar.gz two:/opt/bigfile.tar.gz

-3: Salinan antara dua host jarak jauh ditransfer melalui host lokal. Tanpa opsi ini, data disalin langsung antara dua host jarak jauh.

http://www.openbsd.org/cgi-bin/man.cgi?query=scp&sektion=1

Kalau tidak alias 2 "sedang diselesaikan pada host" satu " , yang mungkin tidak ada.

artfulrobot
sumber
Sayangnya, opsi ini tampaknya cukup baru dan disebarkan ke semua distro.
whereswalden
2

Karena Anda memiliki akses pengguna ke server sumber (satu) mengapa tidak masuk dan menjalankan perintah scp Anda di server itu secara langsung ... Jika Anda khawatir itu akan memakan waktu terlalu lama, kemudian mulai perintah di dalam screenlalu lepaskan dari layar dengan Ctrl+a ddan biarkan berjalan.

Namun, jika Anda harus melakukan ini dari workstation Anda, dan kunci SSH dari sumber ke server tujuan berfungsi dengan baik, maka kirim scpperintah sebagai parameter sshperintah, seperti:

ssh user@source 'scp /path/to/file user@destination:/path/to/file'
Marios Zindilis
sumber
Terima kasih, itu pasti akan berhasil, kecuali kedua server tersebut telah menonaktifkan PasswordAuthentication dan saya tidak dapat menambahkan kunci dari satu ke yang lain - mereka seharusnya tidak dapat terhubung satu sama lain.
Jan Spurny
0

Mencari pesan kesalahan: "Verifikasi kunci host gagal." tampaknya menjadi hal yang paling mudah dilakukan di sini. Saya menemukan Tanya Jawab ini di askubuntu berjudul: Masalah koneksi SSH dengan kesalahan "Verifikasi kunci host gagal ..." .

Salah satu jawaban untuk T&J menyarankan bahwa masalah tersebut terletak pada entri yang bertentangan dalam ~/.ssh/known_hostsfile Anda . Anda dapat menghapus entri yang merepotkan dari file itu menggunakan editor teks apa pun atau Anda dapat menggunakan perintah ini untuk menghapus entri:

$ ssh-keygen -R hostname

Dari mana hostnamealamat IP atau nama server yang Anda coba sambungkan. Semua di atas akan menjadi tuan rumah dua by the way.

slm
sumber
Saya tidak yakin apakah saya mengerti. Saya dapat ssh to onedan twoserver dari workstation saya tanpa masalah .. masalahnya dimulai ketika saya menjalankan scp one:file two:filedari workstation. Dan tidak ada known_hostsfile pada satu atau dua . Saya hanya mencoba untuk menghapus kunci untuk dua (bahkan untuk satu untuk memastikan) di workstation saya tetapi tidak ada yang berubah (kecuali apakah Anda yakin y / n propt).
Jan Spurny
@ JanSpurny - referensi Anda ke workstation Anda agak membingungkan dalam Q ini, setidaknya bagi saya. Ketika Anda mengatakan bahwa yang Anda maksud adalah laptop / desktop Anda. Jadi Anda melakukan sesuatu seperti ini ketika Anda mengatakan bahwa itu "berhasil": scp workstation:file one:filedan workstation:file two:file? Jelas Anda tidak perlu mengatakan "workstation: file" Saya hanya mengatakannya secara eksplisit demi percakapan.
slm
Yah apa yang saya ment adalah bahwa saya menjalankan semua perintah dari workstation saya. Jadi itu lebih seperti: workstation$ scp one:file filedan workstation$ scp file two:file. Bagaimanapun, saya pikir saya sudah menyelesaikannya. Saya akan menambahkannya sebagai jawaban saya sendiri.
Jan Spurny
@ JanSpurny - OK, senang Anda menemukan jawabannya. Terima kasih atas pertanyaannya, BTW!
slm