Soru (TL; DR)
Uzaktan yönlendirme için bağlantı noktalarını dinamik olarak atarken (diğer bir -Rseçenek olarak), uzak makinedeki bir komut dosyası (örneğin, kaynaklı .bashrc) OpenSSH tarafından hangi bağlantı noktalarının seçildiğini nasıl belirleyebilir?
Arka fon
Birden fazla kullanıcıyla paylaştığım merkezi sunucumuza bağlanmak için OpenSSH (her iki uçta) kullanıyorum. Uzak oturumum için (şimdilik) X, fincanlar ve pulseaudio'ları iletmek istiyorum.
En önemlisi -Xseçeneği kullanarak X iletmektir . Tahsis edilen X adresi çevresel değişkende saklanır DISPLAYve bundan dolayı karşılık gelen TCP bağlantı noktasını çoğu durumda yine de belirleyebilirim. Ama neredeyse hiç ihtiyacım yok, çünkü Xlib onurlandırıyor DISPLAY.
Bardaklar ve pulseaudio için benzer bir mekanizmaya ihtiyacım var. Her iki hizmetin temelleri sırasıyla çevresel değişkenler biçiminde CUPS_SERVERve vardır PULSE_SERVER. Kullanım örnekleri:
ssh -X -R12345:localhost:631 -R54321:localhost:4713 datserver
export CUPS_SERVER=localhost:12345
lowriter #and I can print using my local printer
lpr -P default -o Duplex=DuplexNoTumble minutes.pdf #printing through the tunnel
lpr -H localhost:631 -P default -o Duplex=DuplexNoTumble minutes.pdf #printing remotely
mpg123 mp3s/van_halen/jump.mp3 #annoy co-workers
PULSE_SERVER=localhost:54321 mpg123 mp3s/van_halen/jump.mp3 #listen to music through the tunnel
Sorun ayarlanıyor CUPS_SERVERve PULSE_SERVERdoğru.
Bağlantı noktası iletimlerini çok kullanıyoruz ve bu nedenle dinamik bağlantı noktası ayırmalarına ihtiyacım var. Statik port tahsisi bir seçenek değildir.
OpenSSH, 0uzaktan yönlendirme için bağlantı noktası olarak belirleyerek ( -Risteğe bağlı) uzak sunucuda dinamik bağlantı noktası ayırma mekanizmasına sahiptir . Aşağıdaki komutu kullanarak, OpenSSH dinamik olarak kaplar ve darbe iletme için bağlantı noktaları ayıracaktır.
ssh -X -R0:localhost:631 -R0:localhost:4713 datserver
Bu komutu kullandığımda sshaşağıdakileri yazdırır STDERR:
Allocated port 55710 for remote forward to 127.0.0.1:4713
Allocated port 41273 for remote forward to 127.0.0.1:631
İstediğim bilgiler var! Sonuçta ben oluşturmak istiyorum:
export CUPS_SERVER=localhost:41273
export PULSE_SERVER=localhost:55710
Ancak yerel makinemde "Ayrılan bağlantı noktası ..." iletileri oluşturulur STDERRve uzak makineden erişemediğim adresine gönderilir. Garip bir şekilde OpenSSH'nin port yönlendirmeleri hakkında bilgi almanın bir yolu yok gibi görünüyor.
Bu bilgileri, uygun bir şekilde ayarlamak CUPS_SERVERve PULSE_SERVERuzak ana bilgisayarda bir kabuk betiğine koymak için nasıl getirebilirim ?
Çıkmaz sokaklar
Bulabildiğim tek kolay şey, sshd bu bilgiler günlüklerden kadar . Bu, bilgilerin kök olmayan kullanıcılar tarafından erişilebilir hale getirilmesinden çok daha fazla bilgi ifşa ettiği için geçerli değildir.
İç yapının güzel bir temsilini basan ek bir kaçış dizisini desteklemek için OpenSSH'yi yamalamayı düşünüyordum permitted_opens, ancak istediğim bu olsa bile, hala istemci tarafından sunucu tarafında kaçış dizilerine erişemiyorum.
Daha iyi bir yol olmalı
Aşağıdaki yaklaşım çok dengesiz görünüyor ve kullanıcı başına böyle bir SSH oturumu ile sınırlı. Ancak, en az iki eşzamanlı oturum ve diğer kullanıcılara daha fazla ihtiyacım var. Ama yorgunum ...
Yıldızlar düzgün bir şekilde hizalandığında, bir veya iki tavuğu feda sshdettikten sonra, kullanıcı olarak başlatılmayan, ancak başarılı bir şekilde giriş yaptıktan sonra bunu yapmak için ayrıcalıklar bırakan gerçeği kötüye kullanabilirim :
kullanıcıya ait tüm dinleme soketleri için bağlantı noktası numaralarının bir listesini al
netstat -tlpen | grep ${UID} | sed -e 's/^.*:\([0-9]\+\) .*$/\1/'kullanıcımın başlattığı işlemlere ait tüm dinleme soketleri için bağlantı noktası numaralarının bir listesini al
lsof -u ${UID} 2>/dev/null | grep LISTEN | sed -e 's/.*:\([0-9]\+\) (LISTEN).*$/\1/'İlk sette olan tüm bağlantı noktaları, ancak ikinci sette benim iletme portları ve gerçekten setleri verimi çıkarılarak olması için yüksek ihtimalini yok
41273,55710ve6010; bardak, nabız ve X.6010kullanılarak X bağlantı noktası olarak tanımlanırDISPLAY.41273bardaklar liman, çünkülpstat -h localhost:41273 -adöner0.55710darbe bağlantı noktasıdır, çünküpactl -s localhost:55710 statgeri döner0. (Hatta istemcimin ana bilgisayar adını yazdırır!)
(Ayarlama çıkarma I'yi yapmak ve sort -uyukarıdaki komut satırlarından çıkışı saklamak commve çıkarma yapmak için kullanın .)
Pulseaudio istemciyi tanımlamama izin veriyor ve tüm niyetler ve amaçlar için bu, ayrılması gereken SSH oturumlarını ayırmak için bir çapa görevi görebilir. Ancak, ben bağlamak için bir yol bulmuş değil 41273, 55710ve 6010aynı için sshdsüreç. netstatbu bilgileri kök olmayan kullanıcılara açıklamaz. Yalnızca bir olsun -içinde PID/Program nameben okumak istiyorum kolonunun 2339/54(bu özel durumda). Çok yakın ...
netstatsahip olmadığınız veya çekirdek alanı olmayan işlemler için size PID'yi göstermeyeceğini söylemek daha doğru olur . Örneğin