Dapatkan file dari server yang berjarak dua langkah [tertutup]

14

Kami memiliki situasi berikut:

  1. Mesin saya
  2. Mesin gateway
  3. Mesin target

Saya tidak memiliki hak root pada # 2 dan # 3. Saya juga tidak dapat benar-benar menyimpan informasi (tidak lebih dari 200 MiB) pada mesin # 2 (karena ini merupakan gateway ke seluruh jaringan, tidak lebih dari itu). Pada mesin # 3 ada folder, berukuran sekitar 3 GiB, yang ingin saya salin ke lokal. Saya tidak bisa SSH dari # 1 ke # 3, tapi saya bisa SSH ke # 2 dan kemudian ke # 3. Juga tidak mungkin untuk mengatur keypair pribadi publik antara # 2 dan # 3, tetapi ada keypair yang dipasang antara # 1 dan # 2.

Biasanya saya menggunakan kombinasi SSH dan tar untuk menyelesaikan ini:

ssh name@host "tar cf - folder" > folder.tar

Tetapi dalam hal ini itu akan membutuhkan semacam sarang, dan sepertinya saya tidak bisa menyelesaikannya.

Jadi, apa cara yang baik untuk mendapatkan data dari # 3 ke # 1?

Cheiron
sumber

Jawaban:

27

Anda dapat membuat terowongan SSH melalui machine2 lalu di sesi lain sambungkan ke terowongan.

Sebagai contoh, buka dua sesi CLI pada machine1. Pada sesi pertama jalankan yang berikut:

MACHINE1$ ssh -L 2022:MACHINE3:22 <user>@MACHINE2

Di sesi kedua jalankan yang berikut:

MACHINE1 $ ssh -p 2022 <user>@localhost

Apa yang terjadi dengan perintah pertama adalah port lokal (2022 pada machine1) sedang disalurkan ke port 22 pada machine3 menggunakan koneksi SSH Anda ke machine2.

Dengan perintah kedua Anda terhubung ke port lokal yang baru dibuka (2022) dan itu seperti Anda terhubung langsung ke machine3.

Sekarang jika Anda ingin menggunakan proses transfer file khas Anda, Anda bisa melakukan hal berikut:

ssh -p 2022 <user>@localhost "tar cf - /path/to/remote/directory/" > filename.tar

Atau, Anda dapat membiasakan diri dengan rsync dan melakukan sesuatu seperti ini sebagai gantinya:

rsync -aHSv --progress -e 'ssh -p 2022' <user>@localhost:/path/to/remote/directory/ /path/to/local/directory/

Dengan asumsi tujuan akhir bukan untuk mendapatkan tarball.

Gene
sumber
2
Menggunakan ProxyCommanddan ssh -Wdua sshperintah dapat digabungkan menjadi satu baris perintah. Jika Anda memiliki versi terbaru dari klien OpenSSH ada argumen yang akan memungkinkan Anda melakukan semuanya dengan satu sshperintah.
kasperd
+1 untuk rsync;)
NieDzejkob
Saya menggunakan tar karena mentransfer banyak file membutuhkan lebih banyak waktu daripada mentransfer satu file besar. Apakah rsync menyelesaikan ini?
Cheiron
Ketika melakukan transfer jarak jauh, rsync checksum data dalam perjalanan (di sisi penerima, sebelum ia menulisnya ke disk), sehingga akan membutuhkan lebih banyak waktu untuk mentransfer file. Namun, itu menghabiskan waktu dengan baik.
Gene
5

Anda juga dapat menggunakan kemampuan sesi Master versi SSH yang lebih baru. Dijelaskan di sini:

https://en.wikibooks.org/wiki/OpenSSH/Cookbook/Multiplexing

Mungkin yang Anda butuhkan hanyalah mengedit / membuat .ssh / config Anda. Tambahkan definisi di sana yang mengontrol sesi Master:

ControlMaster auto
ControlPath ~/.ssh/cm_socket/%r@%h:%p
ControlPersist 4h
ServerAliveInterval 30

Kemudian Anda dapat menentukan definisi server hop pertama Anda seperti:

Host first_hop
Hostname <your first host FQDN or IP>
User <your user>

Dan hop kedua akan menggunakan server hop pertama Anda sebagai proxy:

Host second_hop
Hostname <your second host FQDN or IP>
User <your user>
ProxyCommand ssh -W %h:%p first_hop

Jangan lupa untuk membuat direktori ~ / .ssh / cm_socket dan izin konfigurasi harus 644.

Maka Anda harus dapat SSH atau SCP langsung ke / dari server kedua Anda. Mungkin ada lebih banyak server yang dirantai seperti ini.

Jaroslav Kucera
sumber
3
Dari membaca tautan Anda, saya tidak berpikir Multiplexing / ControlMasterdiperlukan untuk ke proxy. Halaman yang lebih relevan di wikibook itu adalah ini: en.wikibooks.org/wiki/OpenSSH/Cookbook/Proxies_and_Jump_Hosts
IMSoP
Ya saya setuju. Ada beberapa cara. Namun saya menganggap sesi Master yang paling elegan. Ini hanya tentang preferensi pribadi ;-)
Jaroslav Kucera
Salah satu dari kami salah memahami sesuatu. Sejauh yang saya bisa lihat, "koneksi master" adalah tentang membuat penggunaan sumber daya jaringan secara efisien, dan tidak ada hubungannya dengan pertanyaan. Ini bukan cara yang berbeda untuk melakukannya, itu hanya tidak relevan dengan tugas yang ada.
IMSoP