Pertanyaan Bagaimana cara melakukan transfer SCP Multihop?


Saya ingin menyalin file dari mesin saya A ke server C, tetapi hanya memiliki akses ke server C melalui server B.

Daripada pertama mentransfer ke server B, masuk dan kemudian transfer ke server C, Apakah mungkin untuk mentransfer file langsung dengan SCP atau program sejenis?

(Emacs tramp-mode memiliki fitur ini untuk mengedit file dari jarak jauh).


76
2017-07-08 12:09






Jawaban:


Dengan asumsi OpenSSH, tambahkan ke konfigurasi SSH Anda dalam .ssh / config

Host distant
ProxyCommand ssh near nc distant 22

Ini akan menyebabkan SSH dapat terhubung "langsung" ke mesin yang dinamakan jauh dengan membuat proxy melalui mesin yang bernama dekat. Kemudian dapat menggunakan aplikasi seperti scp dan sftp ke mesin yang jauh.

Untuk ini untuk bekerja Anda perlu 'nc' alias netcat diinstal pada mesin yang bernama dekat. Tetapi banyak sistem modern akan memilikinya.

Solusi tar towo lebih efektif untuk masalah one-shot, dengan asumsi Anda telah mengingat sintaks tar dan aturan operasi.


43
2017-07-08 12:25



Ini adalah metode yang sama saya gunakan ... Dalam contoh ini 'jauh' akan menjadi server C dan 'dekat' akan menjadi server B untuk klarifikasi ... - Jeremy Bouse
Banyak mesin modern tidak memiliki 'nc': biasanya hanya tersedia untuk mesin Linux dan hanya berdasarkan permintaan (bukan bagian dari pemasangan standar). - Mei
ssh kini memiliki opsi -W, yang melakukan ini secara otomatis tanpa 'nc', tetapi saya bertanya-tanya mengapa tidak ada scp-W - kubanczyk
Dalam hal saya bukan satu-satunya yang tidak jelas: jika nama pengguna di near berbeda dari nama pengguna di distant, pengguna dekat masuk ke ProxyCommand ssh nearuser@near..., dan pengguna yang jauh masuk ke tempat terpisah User distantuser baris. - Mu Mind
Cukup ketik ssh multi harapan dan tekan Google Saya merasa beruntung - chandank


Anda dapat menambahkan -o opsi untuk scp dari pada .ssh/config.

scp -o ProxyCommand="ssh $jump_host nc $host 22" $local_path $host:$destination_path

$jump_host adalah "server B" Anda dalam kasus ini.


41
2018-01-11 17:30



Ini cara yang lebih saya sukai untuk melakukan ini. Berkirim pesan .ssh / config untuk multihopping bukanlah solusi terbaik jika Anda mengakses host yang sama baik dari gateway dan secara langsung. - GabrieleV
cuplikan hebat ... Terima kasih ... - Paul T.
Bagaimana ini akan dengan nama pengguna dan port yang berbeda / khusus? - Pablo Bianchi


Dengan versi lebih baru dari ssh pada server dekat (B) mesin berikut ini akan bekerja tanpa netcat:

Host distant
    ProxyCommand ssh near -W distant:22

Namun, ini akan membutuhkan AllowTcpForwarding menjadi yes (default) pada mesin near (B)

edit: membutuhkan OpenSSH 5.4+ di B


19
2018-03-20 01:04



bekerja seperti pesona :) - gongzhitaao
Dan sejak OpenSSH 7.4p1 setidaknya, ada perintah "ProxyJump" di mana seseorang hanya perlu mendaftarkan setiap pengguna @ host: port yang dipisahkan dengan koma. Bagus! - hmijail
ProxyJump bagus, tetapi tidak mengambil Pengguna dan IdentityFile dari file konfigurasi. ProxyCommand -W melakukan ini dan juga bekerja dengan scp. - rickfoosusa


Anda dapat ssh ke server B menggunakan sesuatu seperti

ssh -L 5022:<server C IP>:22 <user_serverB>@<server B IP>

Maka Anda bisa ssh ke server C menggunakan

ssh -p 5022 <user_serverC>@localhost 

Demikian pula scp akan bekerja menggunakan

scp -P 5022 foo.txt <user_serverc>@localhost:

Ingat untuk menggunakan case p dengan scp dan ssh yang benar


15
2017-07-08 13:02





Jika Anda ingin benar-benar jahat, Anda dapat berantai ssh dan tar, sesuatu seperti tar c mydir | ssh server "ssh otherserver | tar x", tetapi ini bisa mengalami semua masalah.

Cara yang lebih mudah adalah dengan hanya memasang terowongan SSH dengan metode SSH yang sudah ada; lihatlah -D beralih di manpage dan hanya meneruskan beberapa port ke port ssh server lain.


3
2017-07-08 12:16





Ini mungkin dan relatif mudah, bahkan ketika Anda perlu menggunakan sertifikat untuk otentikasi (khas di lingkungan AWS).

Perintah di bawah ini akan menyalin file dari a remotePath di server2 langsung ke mesin Anda di localPath. Secara internal permintaan scp diproksikan via server1.

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p user1@server1" user2@server2:/<remotePath> <localpath>

Cara lain juga berfungsi (file upload):

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p user1@server1" <localpath> user2@server2:/<remotePath>

Jika Anda menggunakan otentikasi kata sandi, cobalah

scp -o ProxyCommand="ssh -W %h:%p user1@server1" user2@server2:/<remotePath> <localpath>

Jika Anda menggunakan kredensial pengguna yang sama di kedua server:

scp -o ProxyCommand="ssh -W %h:%p commonuser@server1" commonuser@server2:/<remotePath> <localpath>

2
2017-10-08 01:24





Anda juga dapat melakukan ini secara terbalik dan mungkin lebih mudah.

Misalkan Anda memiliki sesi ssh dibuka dengan mesin Anda ingin mengirim file ke. PC Farthest-hop ini, kita sebut ini hop2. Host "proxy" Anda akan menjadi hop1. PC yang merupakan asal file, kita akan memanggil asal itu.

origin:~/asdf.txt  --> hop1 --> hop2:~/asdf.txt

Anda dapat membuat terowongan yang membuat port lokal tersedia di PC jarak jauh. Kami dengan demikian mendefinisikan port untuk dibuka pada PC jarak jauh, yang akan menjadi pengalihan ke port yang Anda lepaskan ketika Anda membangun terowongan.

Di hop2:

ssh -R 5555:127.0.0.1:22 <hop1_user>@<hop1_IP>
#this has the effect of building a tunnel from hop2 to hop1, making hop2's port 22 available on hop1 as port 5555

Sekarang dalam sesi terowongan terbuka, Anda dapat melakukan hal yang sama dari hop1 ke file_origin.

Di hop1:

ssh -R 6666:127.0.0.1:5555 <origin_user>@<origin_IP>
#this has the effect of building a tunnel from hop1 to origin while also pulling the active tunnel with it, making hop1's port 5555 (hop2's port 22) available on origin as port 6666.

Anda sekarang terowongan dari hop2 ke hop1 ke asal. Secara kebetulan, sekarang baik port 5555 dan 6666 terbuka pada asalnya, yang merupakan pengalihan ke port hop2 22. Dalam sesi ini, kedua hal berikut ini adalah rute scp yang valid ke hop2:

Asal:

scp -P 6666 ~/asdf.txt <hop2_user>@<127.0.0.1>:~/asdf.txt

Dengan cara ini, Anda dapat memiliki beberapa lompatan lompatan di antaranya, dan lebih mudah untuk bekerja bersama dalam hal chaining bersama lebih dari dua lompatan.


2
2017-11-18 20:22