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?
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.
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.
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 ;-)
/var/log/secure
dan/var/log/auth.log
catat koneksi SSH; koneksi slave tidak muncul di sana karena mendukung dukungan yang ada. Jika sesi ssh Anda mengalokasikan terminal (yaitussh somehost
tanpa perintah disediakan, ataussh -t
), yang (biasanya) masukwtmp
, terlepas dari bagaimana terminal itu muncul (sshd metode apa pun yang digunakan untuk membangun koneksi, aplikasi emulator terminal, ...).ControlPersist 600
penundaan 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)-S
(tentukan soket) dan-M
(buat koneksi master) klien SSH.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:
Ketik perintah penerusan lokal untuk membuka terowongan ssh:
Di mana
targethost
nama 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:
ssh
klien pada mesin Anda mendengarkan port 22000, dan itu akan meneruskan semua lalu lintas yang dikirim ke port 22001targethost
.2. Mulai server jaringan pada mesin jarak jauh
Ini sesederhana memasukkan ke dalam sesi ssh Anda yang sudah terbuka perintah berikut:
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
targethost
instance shell.3. Kirim skrip Anda ke atas terowongan
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.
sumber
~
karakter harus muncul setelah baris baru, jadiLF ~ C
mungkin urutan yang lebih baik.less
, pager default umum, mendukung pencarian yang dapat menghemat beberapa pengguliran jika Anda tahu kata kunci Anda: cukup ketikman ssh
/ESCAPE
dan Anda di sana.