scp antara dua host jarak jauh dari pc (ketiga) saya

136

Saya memiliki dua host jarak jauh.
host1-> 10.3.0.1
host2-> 10.3.0.2
Keduanya menjalankan server ssh.

Server ssh mendengarkan pada port 22 di host1 dan pada port 6969 di host2. Sekarang, menggunakan mesin lokal saya, saya perlu menyalin sesuatu dari host1 ke host2 tanpa masuk ke host1 atau host2 melalui ssh. Sesuatu seperti,

scp [email protected]:/path/to/file [email protected]/path/to/file

Bagaimana saya bisa melakukan ini, harap dicatat bahwa kedua host menggunakan port yang berbeda untuk ssh.

uwais ibrahim
sumber
Apakah Anda bertanya apakah Anda dapat mentransfer dari host jarak jauh ke host jarak jauh, atau apakah Anda bertanya bagaimana melakukannya tanpa harus memberikan kata sandi?
glenn jackman
Meskipun -Pada flag untuk menentukan port yang akan digunakan, dalam kasus transfer jarak jauh ke remote, ssh karena tidak ada perilaku yang ditentukan tentang cara menentukan port per-host ...
mveroone

Jawaban:

216

Di masa lalu, cara scpkerja, ketika dipanggil (secara naif ) untuk menyalin file antara sistem jarak jauh, sangat merepotkan: jika Anda menulis, misalnya

    scp user1@remote1:/home/user1/file1.txt user2@remote2:/home/user2/file1.txt

scppertama-tama akan membuka sshsesi di remote1, dan kemudian akan berjalan scpdari sana ke remote2. Agar ini berfungsi, Anda harus menyiapkan kredensial otorisasi untuk remote2 pada remote1.

Sebaliknya, cara modern untuk melakukannya ("modern" karena diterapkan hanya beberapa tahun yang lalu, dan mungkin tidak semua orang memiliki -3-mampu scp) memerlukan dua langkah. Langkah pertama yang diperlukan adalah menggunakan ~/.ssh/configuntuk mengatur semua opsi untuk koneksi ke remote1 dan remote2, sebagai berikut:

    Host remote1.example.org
    Port 2222
    IdentityFile /path/to/host1-id_rsa

    Host remote2.example.org
    Port 6969
    IdentityFile /path/to/host2-id_rsa

Dengan cara ini menjadi mungkin untuk melewatkan semua opsi yang diperlukan ke perintah tanpa ambiguitas : misalnya, jika kita telah mengatakan pada CLI menggunakan port 2222 tanpa konfigurasi di atas, tidak akan jelas apakah kita merujuk ke remote1 atau ke remote2 , dan demikian juga untuk file yang berisi kunci cryptgraphic. Dengan cara ini CLI tetap rapi dan sederhana.

Kedua, gunakan -3opsi, sebagai berikut:

    scp -3 user1@remote1:/home/user1/file1.txt user2@remote2:/home/user2/file1.txt

The -3pilihan menginstruksikan scpuntuk rute lalu lintas melalui PC yang perintah dikeluarkan, meskipun pihak ke-3 untuk transfer. Dengan cara ini, kredensial otorisasi harus berada hanya pada PC yang mengeluarkan, pihak ketiga.

MariusMatutiae
sumber
6
Untuk referensi di masa mendatang: Jika Anda menyalin file antara dua host yang berbagi file identitas (seperti instance EC2), maka Anda tidak memerlukan file konfigurasi. Satu -i argumen cukup untuk terhubung ke kedua host.
Artur Czajka
1
Juga patut dicatat, untuk Google Compute Engine, ada dukungan untuk menambahkan ke ~/.ssh/configfile Anda : cloud.google.com/compute/docs/gcloud-compute tetapi saya tidak berpikir bahwa AWS memiliki dukungan yang sama
modulitos
1
Karena Anda tidak akan melihat output seperti biasanya, tip untuk mengaktifkan mode verbose -v.
holmberd
6

Terakhir kali saya mencoba ini, scp tidak dapat melakukan itu. Baris perintah Anda terlihat oke. Solusi ini akan berhasil:

ssh -p port_on_machine1 user@machine1 "cat /path/to/file/one"|ssh -p port_on_machine2 user@machine2 "cat >/path/to/file/two"
pengguna259412
sumber
halaman manual scp saya mengatakan "Salinan antara dua host jarak jauh juga diizinkan."
glenn jackman
1
Terima kasih, senang mendengarnya. Untuk scp Anda dapat memberikan flag -P (ditulis oleh beberapa orang BSD, ini karena penanganan argumennya sangat tragis :-(), tetapi sepertinya Anda tidak dapat menentukan port yang berbeda pada host jarak jauh. Maaf, tapi saya pikir, hanya solusi ini yang dapat digunakan (atau ada banyak solusi rumit, menggunakan ssh tetapi menghindari scp - misalnya, sftpfs, tetapi mereka bukan yang paling sederhana). Saya memperluas solusi saya dengan pengaturan port.
user259412
4

Dalam kasus saya, saya melakukan copy remote ke remote, tanpa -3argumen. Port yang diberikan dengan parameter '-P' bekerja dengan server 1, tetapi port 22 digunakan dengan yang ke-2.

ssh -P 1234 [email protected] [email protected]

Solusinya adalah mengedit /etc/ssh/ssh_configfile server1dan menambahkan baris-baris ini:

Host *.otherdomain.com
   Port  1234

Dengan cara ini, port 1234 digunakan untuk keduanya. Itu bisa berbeda juga.

Solusi ini memiliki throughput yang lebih baik daripada solusi sebelumnya, karena komunikasi bersifat langsung.

david.perez
sumber
perez apakah ada cara untuk mencapai scp melalui dua port yang berbeda untuk dua mesin remote yang berbeda dari comman line?
Botol Merah
4

Sumber dan target dapat ditentukan sebagai URI dalam bentuk scp: // [user @] host [: port] [/ path]

sehingga Anda dapat menjalankan:

scp -3 scp://[email protected]:22/path/to/file scp://[email protected]:6969/path/to/file
molabib
sumber