Bagaimana saya bisa mengunduh file dari host yang saya hanya bisa SSH melalui host lain?

30

Saya ingin mengunduh file dari komputer kantor saya ke laptop saya.

Saya dapat menghubungkan mesin kantor saya dengan SSH ke server organisasi dan kemudian SSH dari server ke mesin kantor saya.

Satu-satunya perintah yang diterima server organisasi adalah ssh, ssh1, dan ssh2.

Bagaimana saya bisa mengunduh file dari mesin kantor (jarak jauh) saya melalui server ke mesin laptop (lokal) saya?

yochay magan
sumber
2
Gunakan terowongan SSH terbalik? Lihat jawaban saya di sini dan sesuaikan seperlunya: superuser.com/questions/1186905/…
Darren
1
multi-hop SSH?
mckenzm

Jawaban:

37

Jawaban sebelumnya menyebutkan bagaimana menggunakan direktif ProxyJump (ditambahkan dalam OpenSSH 7.3) untuk terhubung melalui server perantara (biasanya disebut sebagai bastion host), tetapi menyebutkannya hanya sebagai argumen baris perintah.

Kecuali jika itu adalah mesin yang tidak akan Anda sambungkan di masa depan, hal terbaik adalah Anda mengonfigurasikannya ~/.ssh/config.

Saya akan meletakkan file seperti:

Host office-machine
Hostname yochay-machine.internal.company.local
ProxyJump bastion-machine

Host bastion-machine
Hostname organization-server.company.com
...

Jika Anda menggunakan versi OpenSSH sebelumnya yang tidak mendukung ProxyJump, Anda akan menggantinya dengan yang setara:

ProxyCommand ssh -W %h:%p bastion-machine

dan jika versi ssh lokal Anda benar-benar kuno yang tidak mendukung -W:

ssh bastion-machine nc %h %p

meskipun yang terakhir ini mensyaratkan bahwa mesin benteng telah ncdiinstal.

Keindahan ssh adalah Anda dapat mengkonfigurasi setiap tujuan pada file, dan mereka akan menumpuk dengan sangat baik. Dengan demikian Anda akhirnya bekerja dengan office-machinesebagai hostname pada semua alat (ssh, scp, sftp ...) karena mereka terhubung langsung, dan mereka akan mencari cara untuk menghubungkan berdasarkan ssh_config. Anda juga dapat memiliki wildcard ingin Host *.internal.company.localmembuat semua host berakhir seperti itu melalui benteng tertentu, dan itu akan berlaku untuk semuanya. Setelah dikonfigurasi dengan benar, satu-satunya perbedaan antara melakukan satu koneksi hop atau dua puluh akan menjadi waktu koneksi yang lebih lambat.

Malaikat
sumber
36

Jika Anda memiliki OpenSSH (8.0) baru-baru ini, Anda dapat menggunakan -Jsakelar (lompatan) :

scp -J user@intermediate user@target:/path

Dengan versi yang lebih lama (tapi setidaknya 7,3), Anda dapat menggunakan ProxyJumparahan , baik di baris perintah:

scp -o ProxyJump=user@intermediate user@target:/path

atau dalam ssh_configfile, seperti yang ditunjukkan oleh jawaban oleh @ Ángel.


Ada opsi lain seperti ProxyCommandatau penerusan porta, yang dapat Anda gunakan pada versi OpenSSH yang lebih lama. Ini tercakup dalam Apakah OpenSSH mendukung login multihop?

Martin Prikryl
sumber
2
@yochaymaganssh -J userA@orgserv userB@officecomp cat remote/path > local/path
mosvy
4
Untuk scp, ditambahkan pada 7.10
Ángel
4
Bahkan jika scptidak mendukung -J, itu mungkin masih cukup baru untuk mendukung ProxyJumpopsi; coba salah satu jawaban lain yang menggunakan opsi ini secara eksplisit.
Gordon Davisson
2
Ini harus menjadi jawaban yang diterima. Saya membenci semua jawaban untuk sshpertanyaan yang menyarankan Anda memodifikasi configuntuk host tertentu ketika opsi baris perintah sederhana sudah cukup untuk melakukan pekerjaan.
clemisch
2
"Despise" tampaknya seperti reaksi ekstrem. Tentu, ada kasus di mana modifikasi cepat dari baris perintah lebih mudah daripada harus terlebih dahulu memodifikasi file konfigurasi. Tetapi jika Anda berencana untuk terhubung ke host yang sama beberapa kali, saya pasti lebih suka memperbarui file konfigurasi saya sekali daripada menggunakan -J user@intermediatesetiap kali saya perlu terhubung.
chepner
10

Terkadang kita bisa menggunakan pipeline saja. Waktu itu hari ini.

ssh -A user@host1 ssh user@host2 cat filename > filename

Anda juga dapat mengunggah

ssh -A user@host1 ssh user@host2 cat \\\> filename < filename

Ya ada solusi lain yang melibatkan proksi, dll. Tetapi mengetahui cara melakukan ini berguna.

Joshua
sumber
Penggunaan berguna cat!
Piskvor
Catatan ini memberikan setiap pengguna cukup istimewa akses host perantara ke agen dan kunci ssh Anda. Data yang mengalir antara host Anda dan host2 juga akan ada tidak terenkripsi pada host1. Metode menggunakan proxy, dan melompat di atas menghindari kedua masalah ini.
james
@james: Saya tidak sadar. Host Bastion seperti ini biasanya sangat bisa dipercaya.
Joshua
7

Gunakan ProxyJumpkonfigurasi:

ProxyJump
Menentukan satu atau lebih proxy loncatan sebagai host [user @] [: port] atau URI ssh. Beberapa proxy dapat dipisahkan dengan karakter koma dan akan dikunjungi secara berurutan. Mengatur opsi ini akan menyebabkan ssh (1) terhubung ke host target dengan terlebih dahulu membuat koneksi ssh (1) ke host ProxyJump yang ditentukan dan kemudian membuat penerusan TCP ke target akhir dari sana.

scp -o ProxyJump=user@intermediate user@target:/path
RalfFriedl
sumber
2

Ada protokol kuno yang disebut ZMODEM : beberapa program mendukungnya akhir-akhir ini, tetapi ketika berfungsi, itu bisa sangat nyaman.

Pertama periksa apakah program terminal laptop Anda mendukung ZMODEM. (Misalnya, Anda dapat mengkonfigurasi iTerm2 (di Mac) untuk mendukung ZMODEM. Contoh skrip tersedia di sini .)

Di mesin kantor Anda, jalankan: sudo apt install lrzsz

Sekarang yang harus Anda lakukan adalah ssh ke mesin kantor Anda, dan jalankan sz (filename). File akan diunduh melalui terminal Anda.

jick
sumber
1

Konfigurasi di bawah ssh pengguna: ~/.ssh/config

Host *
    UserKnownHostsFile=/dev/null
    StrictHostKeyChecking=no
    ServerAliveInterval 300
    ServerAliveCountMax 2
    ForwardAgent yes


Host jump server
    HostName server.company.org
    User root

Host jump1 server1
    HostName server1.dmz.company.org
    User root
    ProxyJump jump

Host jump2 server2
    HostName server.dmz2.company.org
    User root
    ProxyJump jump1

Host *.intranet.company.org
    User user
    ProxyJump jump2

Anda dapat menyalin sekarang dari server intranet langsung ke 3 server lompat.

scp [email protected]:/home/user/ ./*

Saya lebih suka ini karena tidak perlu lagi menentukan server melompat dengan scp

Lukáš Viktora
sumber
0

Melalui SCP -3:

scp -3 user1@remote1:/root/file1.txt user2@remote2:/root/file1.txt
wuseman
sumber
2
The -3opsi digambarkan sebagai "Salinan antara dua host remote ditransfer melalui host lokal." sementara saya percaya pertanyaan ini menetapkan bahwa tuan rumah lokal tidak dapat mengakses "remote2".
Jeff Schaller
2
@ JeffSchaller: Anda terhubung ke mesin di tengah, lalu gunakan -3. Tetapi ini mengasumsikan bahwa Anda dapat terhubung dari mesin tengah kembali ke yang pertama.
Joe
Saya tidak melihat keuntungan dari ini selama -J/ JumpHost. Justru sebaliknya karena memiliki batasan yang @Joe sebutkan.
Martin Prikryl