Soru (TL; DR)
Uzaktan yönlendirme için bağlantı noktalarını dinamik olarak atarken (diğer bir -R
seç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 -X
seçeneği kullanarak X iletmektir . Tahsis edilen X adresi çevresel değişkende saklanır DISPLAY
ve 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_SERVER
ve 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_SERVER
ve PULSE_SERVER
doğ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, 0
uzaktan yönlendirme için bağlantı noktası olarak belirleyerek ( -R
isteğ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 ssh
aş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 STDERR
ve 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_SERVER
ve PULSE_SERVER
uzak 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 sshd
ettikten 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
,55710
ve6010
; bardak, nabız ve X.6010
kullanılarak X bağlantı noktası olarak tanımlanırDISPLAY
.41273
bardaklar liman, çünkülpstat -h localhost:41273 -a
döner0
.55710
darbe bağlantı noktasıdır, çünküpactl -s localhost:55710 stat
geri döner0
. (Hatta istemcimin ana bilgisayar adını yazdırır!)
(Ayarlama çıkarma I'yi yapmak ve sort -u
yukarıdaki komut satırlarından çıkışı saklamak comm
ve çı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
, 55710
ve 6010
aynı için sshd
süreç. netstat
bu bilgileri kök olmayan kullanıcılara açıklamaz. Yalnızca bir olsun -
içinde PID/Program name
ben okumak istiyorum kolonunun 2339/54
(bu özel durumda). Çok yakın ...
netstat
sahip 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