Saya memiliki akses ke 3 mesin, A, B, dan C. Satu-satunya kemungkinan koneksi (ssh) adalah:
A -> B
B <-> C
Saya perlu mendapatkan file dari A ke C, jadi saya bisa scp file dari A ke B, dan kemudian scp dari B ke C. Namun, B tidak memiliki banyak ruang disk, jadi ini bukan pilihan. Apakah ada cara untuk scp file dari A ke C via B? Catatan, saya tidak memiliki akses root pada salah satu mesin, jadi jangan berpikir saya bisa mengatur terowongan yang persisten, tetapi perbaiki saya jika saya salah!
A$ rsync <options> -e 'ssh B ssh' source C:destination
Jawaban:
ProxyJump
Baru di OpenSSH 7.3:
(Di belakang layar, ini hanya menggunakan ProxyCommand dan
ssh -W
.)Perintah Proxy
Diperbarui untuk menyertakan -W dari jawaban lain:
Jika A memiliki klien SSH yang sangat lama diinstal (tanpa
-W
dukungan), atau jika B dikonfigurasi untuk melarang penerusan TCP (tetapi masih memungkinkan perintah shell), gunakan alternatif:Pipa
Hanya untuk satu file:
"Tunnel" melalui B
Setelah selesai, jangan lupa untuk mematikan proses yang sebelumnya dimulai
ssh
(yang telah jatuh ke latar belakang karena-f -N
).-f
Meminta ssh untuk pergi ke latar belakang sebelum eksekusi perintah. Ini berguna jika ssh akan meminta kata sandi atau frasa sandi, tetapi pengguna menginginkannya di latar belakang. Ini menyiratkan -n.-N
Jangan jalankan perintah jarak jauh. Ini berguna untuk hanya meneruskan porta.Membalikkan "terowongan" melalui B ke A
Tidak selalu bekerja:
-R
Menentukan bahwa koneksi ke port TCP yang diberikan atau soket Unix pada host (server) jarak jauh harus diteruskan ke host dan port yang diberikan, atau soket Unix, di sisi lokal.sumber
scp
dari C, meskipun B, ke A, Anda bisa melakukannyaA$ scp -oProxyJump=B C:destination thefile
.Versi scp dari awal 2011 dan yang lebih baru mungkin memiliki opsi "-3":
Jika sudah begini, Anda bisa menjalankan:
sumber
Hampir semua telah sudah mengatakan tapi di sini adalah sen terakhir saya: Saya menggunakan ProxyCommand varian tanpa
nc
atausoc
. Berdasarkan OpenSSH Proxies dan Jumphost Cookbook, saya membuat konfigurasi berikut:Jadi kami memiliki pemain berikut:
Pertama saya menambahkan kunci publik lokal saya dari host rumah saya
.ssh/id_dsa.pub
ke host.ssh/authorized_keys
hop dan target. Ya, kunci publik yang sama dari tuan rumah ke keduanya. Biasanya Anda akan mengharapkan itu adalah kunci publik HOP yang harus Anda tambahkan ke TARGET.Lalu saya
.ssh/config
sedikit men - tweak dengan menambahkan entri berikut:Setelah itu operasi copy adalah yang sederhana seperti:
scp FILE TARGET_HOST:
. Ini menampilkan spanduk ganda dari node hop dan target tetapi berfungsi.Tentu saja Anda dapat menggunakan di atas untuk ssh langsung ke sasaran:
ssh TARGET_HOST
. Ini bekerja dengan scp dan ssh.Pilihan lain yang lebih umum mungkin adalah utilitas sshuttle yang tampaknya semacam proxy transparan (vpn over ssh). Jadi dalam kasus A-> B <-> C Anda memungkinkan untuk terhubung ke setiap node di jaringan C: A-> B- [CDEFG]. Tidak perlu admin tetapi membutuhkan Python 2.7 (3.5 juga OK) yang tidak selalu seperti yang kita miliki. Layak untuk dicoba.
sumber
di shell lain:
Ini menggunakan penerusan porta. Satu-satunya batasan di sini adalah host B perlu dikonfigurasi untuk memungkinkan penerusan port. Kalau tidak, ini akan bekerja dengan baik.
Di jalan penjelasan,
-L
dan-R
memungkinkan Anda untuk meneruskan port. Dalam-L
, port pertama yang diberikan adalah port ssh akan mulai mendengarkan pada mesin asal (host A), dan itu akan meneruskan apa pun yang diterimanya pada port tersebut melalui koneksi SSH Anda ke host B, kemudian merutekan ke host C pada port 22.sunting
Saya sedikit mengacaukan sintaks. Ini mengatur maju pada mesin LOKAL Anda.
sumber
Jawaban ProxyCommand Grawity berhasil untuk saya, tetapi karena saya kurang terbiasa dengan SSH, perlu beberapa percobaan. Saya pikir saya hanya akan mengeja jawaban Grawity dengan lebih detail untuk membantu pemula lain untuk SSH seperti saya. Berikut adalah definisi untuk notasi yang lebih eksplisit:
Mesin A: mesin yang Anda pakai
Server B: [email protected] (host melompat atau server tengah)
Server C: [email protected] (server jarak jauh yang ingin Anda salin)
ProxyCommnad
Contoh nyata
Jadi untuk contoh konkret, misalkan Anda memiliki akses ke server dengan IP
0.0.1.2
dengan akun pengguna bernamabar
(Server C). Tetapi untuk mencapainya Anda harus terlebih dahulu masuk ke server dengan IP0.0.1.1
dengan akun pengguna bernamafoo
(Server B). Sekarang Anda ingin menyalin filebaz.txt
yang terletak pada mesin Anda saat ini (Machine A) ke server0.0.1.2
's/home/bar/
direktori. Untuk menggunakan ProxyCommand di atas untuk contoh ini Anda akan menjalankan yang berikut:Anda juga dapat dengan mudah menyalin file dari Server C dengan mengalihkan urutan file dan tujuan. Jadi misalnya, jika
baz.txt
sudah ada di server yang0.0.1.2
terletak di/home/bar/
maka Anda dapat menyalinnya ke mesin Anda menggunakan:Semoga ini bisa membantu orang yang membutuhkan sesuatu yang dijabarkan lebih banyak daripada yang lain.
sumber