Önceden kurulmuş bir SSH kanalı kullanarak


50

İki makine arasında zaten kurulmuş bir ssh bağlantım var.

Uzaktaki makineye yerel makinede çalışan bir kabuk betiğinden, zaten açık olan bağlantıyı kullanarak ve başka bir ssh oturumu başlatmadan komutlar göndermenin bir yolu var mı?

Yanıtlar:


56

Önceden planlıyorsanız, OpenSSH'nin yeterince yeni sürümleriyle çok basittir.

İlk defa bir ana bağlantı açın. Daha sonraki bağlantılar için, bağımlı bağlantıları mevcut ana bağlantı üzerinden yönlendirin. Gözlerinde farklı ~/.ssh/config, otomatik olarak gerçekleşmesi bağlantı paylaşımını kurmak:

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

Mevcut bir bağlantıyla aynı (kullanıcı, port, makine) ssh oturumu başlatırsanız, ikinci oturum ilkine tünellenir. İkinci bağlantının kurulması yeni bir kimlik doğrulama gerektirmez ve çok hızlıdır.


İkincisinin / var / log / secure veya /var/log/auth.log dosyasına kaydedilmeyeceği anlaşılıyor. Ancak ikincisi / var / log / wtmp'ye mi kaydedilecek?
SOUser

@ XichenLi /var/log/secureve /var/log/auth.loglog SSH bağlantıları; orada bir köle bağlantısı görünmüyor, çünkü mevcut bir bağlantıda atlanıyor. Eğer ssh oturumunuzda bir terminal tahsis ederse (yani ssh somehost, komut verilmemişse, veya ssh -t), bu (normalde) giriş yapmış wtmpolursanız, o terminalin nasıl göründüğüne bakılmaksızın (sshd, bağlantı kurmak için hangi yöntemi kullandıysa, terminal emülatör uygulaması,…).
Gilles 'SO- kötülük'

2
Ayrıca ControlPersist 600, otomatik olarak silinmeden önce soketin boşta kaldığı saniye cinsinden bir gecikme olan da kullanabilirsiniz . Aksi takdirde, ana bağlantı sona erdiğinde otomatik olarak kapanacaktır. Uzaktan bir dizi komut çalıştırmak için iyi değildir (örn. Farklı klasörlere bir dizi rsync komutu)

2
Genel yapılandırmayı düzenlemek istemiyorsanız , SSH istemcisinin seçeneklerini de -S(soket belirtin) ve -M(ana bağlantı oluşturun) kullanabilirsiniz.
yankee

22

Nc aracı ve ssh tünellerini kullanarak elde etmek oldukça kolaydır .

1. ssh tüneli açın

Ssh oturumunuza ~Cyeni bir satır yazın. Bunun gibi görünen ssh "servis konsolu" komutunu alacaksınız:

ssh> 

Bir ssh tüneli açmak için yerel iletme komutunu yazın:

ssh> -L22000:targethost:22001
Forwarding port.

targethostBağlandığınız makinenin ana bilgisayar adı veya IP adresi nerede .

Şimdi, hedef makinedeki ssh sunucusunun tünelleri yasaklayacak şekilde yapılandırılmadığını varsayarsak, istediğiniz bağlantı yönlendirmesine sahip olursunuz: sshmakinenizdeki istemci 22000 numaralı bağlantı noktasını dinler ve kendisine gönderilen tüm trafiği 22001 bağlantı noktasına yönlendirir targethost.

2. Uzak makinede bir ağ sunucusu başlatın

Bu, zaten açık olan ssh oturumunuza aşağıdaki komutu girmek kadar basittir:

remote$ nc -l localhost 22001 | sh

Bu, ssh tünelimizin hedef portu olan 22001 portunu dinleyen bir TCP sunucusunu başlatacak ve alınan verileri (muhtemelen kabuk komutları) bir targethostkabuk örneğine yönlendirecektir.

3. Komut dosyanızı tünelden gönderin

local$ cat yourscript.sh | nc localhost 22000

Bu, betiğin gövdesini ssh tünelinize gönderecek ve üzerindeki bir kabukta idam edilecek targethost. Komut dizisinin çıktısını terminalinizde ssh oturumu ile göreceksiniz.


Ayrıca, bu senaryoda ssh tünelinin (1. adım) kesinlikle gerekmediğine dikkat edeceğim; Sunucuyu açmaya başlayabilir ve doğrudan internet üzerinden bağlanabilirsiniz. Ancak, hedef ana bilgisayara doğrudan erişilemiyorsa (örneğin bir NAT'ın arkasındaysa) veya ssh şifrelemesi isteniyorsa tüneli kullanmanız gerekir.


3
Mükemmel cevap. Teknik olarak, servis konsoluna ulaşmak için ~karakter yeni bir satırdan sonra gelmelidir, bu LF ~ Cnedenle muhtemelen daha iyi bir sıradır.
Alexios

@Alexios, doğru.
ulidtko

İnanılmaz numara! Kayıt için, ssh man sayfası hakkında daha fazla bilgi gösterir ("ESCAPE CHARACTERS" adlı bölüme ilerleyin)
Carles Sala

@CarlesSala ayrıca less, genel varsayılan çağrı cihazının, anahtar kelimelerinizi biliyorsanız, bazı kaydırma işlemlerini kurtarabilen aramayı desteklediğini bilmek iyidir : sadece yazın man ssh /ESCAPEve oradasınız.
ulidtko

@ulidtko emin, ama bildiğim kadarıyla, biri bir CLI komutunu SO yorumuna bağlayamaz, bu yüzden html man sayfasını daha iyi bir seçenek buldum ;-)
Carles Sala
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.