Menggunakan saluran SSH yang sudah ada

50

Saya sudah memiliki koneksi ssh yang sudah terbangun antara dua mesin.

Apakah ada cara untuk mengirim perintah ke mesin jarak jauh dari skrip shell yang dijalankan pada mesin lokal, menggunakan koneksi yang sudah terbuka, dan tanpa memulai sesi ssh lainnya?

SWeko
sumber

Jawaban:

56

Ini sangat sederhana dengan versi OpenSSH yang cukup baru jika Anda berencana sebelumnya.

Buka koneksi master pertama kali. Untuk koneksi selanjutnya, rutekan koneksi slave melalui koneksi master yang ada. Di Anda ~/.ssh/config, atur berbagi koneksi agar terjadi secara otomatis:

ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r

Jika Anda memulai sesi ssh ke yang sama (pengguna, port, mesin) sebagai koneksi yang ada, sesi kedua akan diteruskan ke yang pertama. Membuat koneksi kedua tidak memerlukan otentikasi baru dan sangat cepat.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Tampaknya yang kedua tidak akan terdaftar di / var / log / secure atau /var/log/auth.log. Namun, akankah yang kedua terdaftar di / var / log / wtmp?
SOUser
@XichenLi /var/log/securedan /var/log/auth.logcatat koneksi SSH; koneksi slave tidak muncul di sana karena mendukung dukungan yang ada. Jika sesi ssh Anda mengalokasikan terminal (yaitu ssh somehosttanpa perintah disediakan, atau ssh -t), yang (biasanya) masuk wtmp, terlepas dari bagaimana terminal itu muncul (sshd metode apa pun yang digunakan untuk membangun koneksi, aplikasi emulator terminal, ...).
Gilles 'SO- stop being evil'
2
Anda juga dapat menggunakan ControlPersist 600penundaan dalam detik saat soket dalam keadaan siaga sebelum dihapus secara otomatis. Kalau tidak, itu akan menutup secara otomatis ketika koneksi master berakhir. Itu tidak baik untuk mengeksekusi serangkaian perintah dari jarak jauh (mis. Serangkaian perintah rsync ke folder yang berbeda)
2
Jika Anda tidak ingin mengedit konfigurasi global, Anda juga dapat menggunakan opsi -S(tentukan soket) dan -M(buat koneksi master) klien SSH.
yankee
22

Itu cukup mudah untuk dicapai dengan menggunakan alat nc dan ssh tunnel.

1. Buka ssh tunnel

Dalam sesi ssh Anda, ketikkan ~Cpada baris baru. Anda akan mendapatkan prompt ssh "service console" yang terlihat seperti ini:

ssh> 

Ketik perintah penerusan lokal untuk membuka terowongan ssh:

ssh> -L22000:targethost:22001
Forwarding port.

Di mana targethostnama host atau alamat IP dari mesin yang terhubung dengan Anda.

Sekarang, dengan asumsi server ssh pada mesin target tidak dikonfigurasikan untuk melarang terowongan, Anda memiliki penerusan koneksi yang diinginkan: sshklien pada mesin Anda mendengarkan port 22000, dan itu akan meneruskan semua lalu lintas yang dikirim ke port 22001 targethost.

2. Mulai server jaringan pada mesin jarak jauh

Ini sesederhana memasukkan ke dalam sesi ssh Anda yang sudah terbuka perintah berikut:

remote$ nc -l localhost 22001 | sh

Ini akan memulai mendengarkan server TCP pada port 22001 - yang merupakan port target dari terowongan ssh kami - dan merutekan data yang diterima (mungkin, perintah shell) ke targethostinstance shell.

3. Kirim skrip Anda ke atas terowongan

local$ cat yourscript.sh | nc localhost 22000

Ini akan mengirim tubuh skrip ke terowongan ssh Anda dan pada akhirnya akan dieksekusi di shell di targethost. Anda akan melihat output skrip di terminal Anda dengan sesi ssh.


Saya juga akan mencatat bahwa ssh tunnel (langkah 1.) dalam skenario ini tidak sepenuhnya diperlukan; Anda juga dapat memulai server terbuka dan terhubung langsung melalui internet. Namun, Anda harus menggunakan terowongan jika host target tidak dapat dihubungi secara langsung (misalnya di belakang NAT), atau enkripsi ssh diinginkan.

ulidtko
sumber
3
Jawaban yang bagus Secara teknis, untuk sampai ke konsol layanan, ~karakter harus muncul setelah baris baru, jadi LF ~ Cmungkin urutan yang lebih baik.
Alexios
@ Alexios, benar.
ulidtko
Trik yang luar biasa! Sebagai catatan, halaman ssh man menunjukkan beberapa informasi lebih lanjut tentang hal itu (gulir ke bawah ke bagian yang disebut "ESCAPE CHARACTERS")
Carles Sala
@CarlesSala juga baik untuk mengetahui bahwa less, pager default umum, mendukung pencarian yang dapat menghemat beberapa pengguliran jika Anda tahu kata kunci Anda: cukup ketik man ssh /ESCAPEdan Anda di sana.
ulidtko
@ulidtko yakin, tapi sejauh yang saya tahu, orang tidak dapat menautkan perintah CLI ke komentar SO, jadi saya menemukan halaman manual html opsi yang lebih baik ;-)
Carles Sala