pengembangan-web-mp.com

Bagaimana cara saya melakukan transfer Multihop SCP?

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

Alih-alih pertama-tama mentransfer ke server B, masuk dan kemudian transfer ke server C, Apakah mungkin untuk mentransfer file secara langsung dengan SCP atau program serupa?

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

87
sverrejoh

Anda dapat menambahkan -o pilihan ke scp bukan .ssh/config.

scp -o ProxyCommand="ssh $jump_Host nc $Host 22" $local_path $Host:$destination_path

$jump_Host adalah "server B" Anda dalam hal ini.

48
John Tantalo

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

Host distant
ProxyCommand ssh near nc distant 22

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

Agar ini berfungsi, Anda perlu 'nc' alias netcat diinstal pada mesin yang bernama near. Tetapi banyak sistem modern sudah memilikinya.

solusi tar towo lebih efektif untuk masalah satu-shot, dengan asumsi Anda telah menghafal sintaks tar dan aturan operasi.

44
tialaramex

Dengan versi terbaru dari ssh di server dekat (B) mesin berikut ini akan bekerja tanpa netcat:

Host distant
    ProxyCommand ssh near -W distant:22

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

sunting: membutuhkan OpenSSH 5.4+ pada B

19
danblack

Anda dapat ssh ke server B menggunakan sesuatu seperti

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

Kemudian Anda dapat 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:

Ingatlah untuk menggunakan huruf p yang benar dengan scp dan ssh

18

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

Perintah di bawah ini akan menyalin file dari remotePath on server2 langsung ke mesin Anda di localPath. Secara internal permintaan scp diproksi melalui server1.

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p [email protected]" [email protected]:/<remotePath> <localpath>

Cara sebaliknya juga berfungsi (mengunggah file):

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p [email protected]" <localpath> [email protected]:/<remotePath>

Jika Anda menggunakan otentikasi kata sandi, coba dengan

scp -o ProxyCommand="ssh -W %h:%p [email protected]" [email protected]:/<remotePath> <localpath>

Jika Anda menggunakan kredensial pengguna yang sama di kedua server:

scp -o ProxyCommand="ssh -W %h:%p [email protected]" [email protected]:/<remotePath> <localpath>
5
donhector

Jika Anda ingin benar-benar jahat, Anda bisa membuat rantai ssh dan tar, kira-kira seperti tar c mydir | ssh server "ssh otherserver | tar x", tapi ini bisa mengalami semua masalah.

Cara yang lebih mudah adalah dengan membuat terowongan SSH dengan metode bawaan SSH; lihat -D aktifkan manpage dan teruskan beberapa port ke port ssh server lain.

3
towo

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

Misalkan Anda memiliki sesi ssh dibuka dengan mesin yang ingin Anda kirimi file. PC terjauh ini, kita akan menyebutnya hop2 ini. Host "proxy" Anda akan menjadi hop1. PC yang merupakan file-Asal, kami akan menyebutnya Asal.

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

Anda dapat membangun terowongan yang menyediakan port lokal pada PC jarak jauh. Karenanya, kami menetapkan port untuk dibuka pada PC jarak jauh, yang akan menjadi redirect ke port yang Anda tumpangi saat 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 di sesi terowongan yang dibuka, 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 diarahkan dari hop2 ke hop1 ke Origin. Secara kebetulan, sekarang kedua port 5555 dan 6666 terbuka di Origin, yang dialihkan ke port hop2 22. Dalam sesi ini, kedua berikut 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 sejumlah Hop yang sewenang-wenang di antaranya, dan lebih mudah untuk digunakan dalam hal merantai bersama lebih dari dua Hop.

2
SYANiDE

Cobalah mengadaptasi contoh berikut ini konfigurasi openssh untuk pengaturan yang dapat digunakan untuk banyak host:

Host uat-*
     ProxyCommand ssh bastion-uat nc %h %p

Ini menganggap seperangkat server yang dimulai dengan "uat-" yang hanya dapat diakses melalui server melompat/gateway "bastion-uat". Anda mungkin juga ingin menambahkan ForwardAgent yes jika Anda menggunakan kunci untuk masuk.

1

Ini bukan scp (yang diminta OP), tapi saya merasa sangat mudah menggunakan rsync untuk menyalin dari lokal ke jarak jauh melalui satu hop dengan:

rsync -v -e 'ssh -A -t [email protected] ssh -A -t [email protected]' /path/to/sourcefile :/path/to/destination

Sumber: http://mjbright.blogspot.com/2012/09/using-rsync-over-multi-hop-ssh.html

Saya telah mencoba saran -o ProxyPass di atas dan tidak ingin mengubah konfigurasi untuk kebutuhan saya yang berubah. Seperti yang dinyatakan penulis di tautan di atas, file tujuan yang mendahului titik dua (:) penting untuk menunjukkan jalur yang ditentukan ada di server tujuan. Juga, menggunakan rsync, Anda memiliki opsi untuk membandingkan tanggal, sinkronisasi folder, dll. Saya harap ini membantu seseorang!

1
texas-bronius