SSH bağlantı noktası iletme oluşturmayı başarana kadar bekleyin


7

Dinamik bir port yönlendirme oluşturmak için ssh (OpenSSH) 'i OSX / Linux-C ++' dan çatal / exec ile uygulama olarak adlandırıyorum. Bu, toplu iş modu (-o BatchMode = yes) ve ssh (-i Seçeneği) için verilen özel bir anahtar kullanılarak yapılır. SSH çağrısının kendisi bir kabuk açmaz (-N Seçeneği).

Bu benim tam SSH-Call'um:

ssh -N -D 9000 -o BatchMode=yes -i /path/to/private-key user@host

Başvurumla mümkün olan en kısa sürede devam etmek istiyorum ve bu yüzden ssh'in kanalı oluşturmayı başarabildiğini öğrenmem gerekiyor. SSH, yalnızca bir sorunu olduğunda döner.

Başarılı bir bağlantı noktası iletme yöntemini nasıl saptayabilirim?

Tabii SSH tarafından liman açılıncaya kadar bekleyebilirim ama daha şık bir çözüm arıyorum. Başka bir çözüm de SSH'nin Log'unu (-v) "Etkileşimli Seansa Girme" için beklemektir, ancak bu bana çok taşınabilir gelmiyor.

Yanıtlar:


4

-fSeçeneği kullanın ve ssharka plana gidecektir (yani forkana işlemde çıkış), böylece yalnızca waitpidorijinalin sshbitmesini sağlayabilirsiniz ve daha sonra (çıkış durumuna göre) bağlantının başarısız olduğunu veya bağlantı noktası iletmenin zaten kurulduğunu bilirsiniz.


1
Bu iyi geliyor. Ancak şimdi, çatallı SSH işleminin PID'sini bulamama ve programın sona ermesinden sonra kolayca temizleyemem gibi bir sorun yaşadım. Debians Bugzilla'da bu tartışma var: bugzilla.mindrot.org/show_bug.cgi?id=1473 -f ile birlikte kullandığım tek şans ControlMaster / Slave-Communication kullanmak.

1
@nob torunlara işlem gruplarını kullanarak işaret verebilirsiniz. Temel olarak, uygulamanız ssh komutunu çalıştırdığında, alt süreç, exec çağrılmadan önce kendisini bir süreç grubu lideri yapmalıdır. İşte bunu yapmanın perl bir örnek.
Kenster

Proses grupları en iyi çözüm gibi görünür, ancak aynı zamanda prosesiniz tarafından belirli bir boru veya soket kapatıldığında ssh işleminin ölmesi için düzenleme yapmak da mümkün olabilir.
R. ..

1

Sanırım başka (bir de hackish) çözüm buldum. SSH ile başlarken

ssh -S /some/domain/socket -M ...args... host

kontrol etki alanı soketini yalnızca bağlantıyı başarıyla kurduğu şekilde oluşturacaktır. Bu yüzden, etki alanı soketinin dosya sisteminde görünmesini beklemek zorunda kalacağım. Hala güzel değil, ancak bu bir ağ soketinin görünmesini beklemekten daha güçlü geliyor.

İlginçtir ki, bu Master'ın PID'sini bulmak için de kullanılabilir (bkz. Cevap ..). kullanma

$ ssh -S /some/domain/socket -O check host
Master running (pid=25503)
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.