Kaynak makinenin IP veya ana makine adını bulma (ssh)


10

Farklı fiziksel konumlardan (ve dolayısıyla farklı fiziksel makinelerden) sürekli olarak birkaç makineye bağlarım. Ssh, bazen bir geçit makine veya iki gereklidir olsa bu çoğu (ki ben çağırmak aracılığıyla yapılır ProxyCommandiçinde ~/.ssh/config). Uzak bağlantıda ilk bağlantıyı (yani üzerinde çalıştığım makine) çağıran makinenin IP'sini veya ana makine adını tanımlamak için bir yöntem olup olmadığını bilmek ister misiniz?

  • Ayarlanacak kök olmadığım bazı makineler olduğu için ortam değişkenleri göndermek istemiyorum PermitUserEnvironment.
  • $SSH_CLIENTÇevre değişkeni doğrudan bağlantılar için yararlıdır, ancak yalnızca en son ağ geçidini listeler.

Şu anki çözüm fikrim, onu ele $SSH_CLIENTgeçirmek, o makinenin $SSH_CLIENTdeğerini bulmak ve var olana kadar tekrarlamak; sonra ana bilgisayar adını alın ve bir şekilde geri çekin.

Gerçi bir kesmek işi gibi görünüyor; daha iyi bir yöntemi var mı?

Çoğunlukla bash kabuğunda çalışıyorum, ama aynı zamanda kullanmayan herhangi bir öneri için de mutluyum.


ProxyCommand'ın amaçlarından biri elbette kaynak ana bilgisayarı gizlemek (veya unutmak) (örneğin, son ana bilgisayardan yönlendirilemeyebilir)
Hagen von Eitzen

Bu bilgiye nerede veya neden ihtiyaç duyduğunuza bir örnek verebilir misiniz? Açık olmayan başka çözümler de olabilir.
Manwe

@Manwe nihayetinde .bashrc gibi şeylerde yerel ayara özgü bölümler oluşturmak isteyeceğim. Şu anda yapmak istediğim tek şey, çalıştığım makineye bağlı olarak üç klavye düzeninden birini vim'de otomatik olarak ayarlamak .
Jeodezik

Yanıtlar:


3

Hiç denemedim, ama işe yarayabilecek bir şey düşünebilirim: SSH'nin giriş kabuğunuzu başlatmasına izin vermezsiniz, ancak konuları kendi ellerinizde alırsınız. SSH'ye rastgele komutlar çalıştırmasını söyleyebilirsiniz. Onun yerine

ssh remote_host

çizgilerinde bir şey koşardın

ssh remote_host -t "
    . /etc/profile; 
    . /etc/bash.bashrc; 
    DAT_ORIGIN_HOST=$(ifconfig eth0|grep -Po 't addr:\K[\d.]+') /bin/bash -l -i"

Bu, SSH'ye bir giriş kabuğu başlatmak yerine yapacak başka bir şey verir. Bir şeyin uzaktan komut olarak çalıştırılacak bir dize olduğunu. Bunu çok özel bir şekilde bir kabuk başlatmak için kullanırız: DAT_ORIGIN_HOSTeth0 üzerine ipimizi içeren çevresel bir değişken veririz (bunu değiştirmeniz gerekebilir).

Gerçekleştirdiğimiz hile, çift qoutes'de uzaktan çalıştırma komutunu koymamızdır ". Çift tırnaklar (en azından Bash cinsinden), STRING'in SSH'ye GEÇMEDEN ÖNCE, kabuğumuz bunu tarar ve uygun olduğunda genişletmeler / değiştirme işlemleri gerçekleştirir. Bu, kabuğumuzun mevcut ip adresimize `$ (ifconfig ...) bölümünü değerlendireceği ve yerel IP adresimizle bir çevresel değişken tanımını içeren bir ssh geçireceği anlamına gelir.

Uzak makineye giriş yaptıktan sonra echo $DAT_ORIGIN_HOSTIP adresinizi yazdırmalısınız.

SSH'ye yapılan bu çağrıyı geliştirmek için IP adresini çıkarmak için buradan utanmadan aldım ve burada -t ve interaktif bir şeyin nasıl başlatılacağı

Yasal Uyarı: -lve -iseçeneği hakkında emin değilim /bin/bash. Belki de onları atlamanız gerekir.


Burada bir şey olabilirsiniz! Onunla biraz oynayacağım ve size geri döneceğim.
Jeodezik

Ben bu yanıtı işaretliyorum, yalancı tty ve uzak komutların ikisi de çalışıyor. Sonunda özel durumumu uzaktan komut önerisine dayanarak ^ E geri çağrılarıyla çözdüm - biraz daha temiz ve genel kullanım haline geliyor. Teşekkürler!
Jeodezik

2

Id Doğru anladım doğrudan menşe makine ile proxycommandatlama ile hedefe bağlantı olduğunu . Ve işte size üç kesmek (kullanım senaryosu hakkında yorumdan sonra üçüncü eklendi). İlk olarak, menşe makinenize geri dönmenizi sağlamak için uzaktan bağlantı noktası iletmeyi kullanın.-R remotemachineport:dstonlocalnet:dstportonlocalnet

ssh -R 2222:localhost:22 user@target
# on "target" you can now do this to get back to origin host
ssh user2@localhost -p 2222 

İkinci) AcceptEnv LC_*Hedefe taciz. Hoş değil, ancak AcceptUserEnviconment mevcut olmadığında bile LOCALE değişkenlerine izin vermek oldukça yaygın. Şimdi şunları yapabilirsiniz:

export LC_SOURCEHOST=my.ip.addr.or:something
ssh user@target
# on tathet:
echo $LC_SOURCEHOST

Üçüncü) Ana makine veya ana makine türünü tanımlamak için ssh remote forward kullanın.

# Here is an example what you can use on target machine. 
# This will modify your PS1 variable (prompt) based on source host (port forwarding)
# Add this to .bash_profile

function checkHost {
  RET=""
  ## loop over test port numbers 17891-17895 in my example
  for x in $(seq 1 5); do 
    # if netstat is not available test port some other way like with nc or something
    ## && RET= will set RET = 1-5
    /bin/netstat -lnt|/bin/grep -q 127.0.0.1:1789$x && RET=$x;
  done
  # return RET
  # please note that if you have multiple open connections with different port numbers
  # this method cannot not distinguish between them 
  echo $RET
}

# get 1-5 number from function above
VAL=$(checkHost)
# do something like set PS1 var or map vim file or something
export PS1='\[\033k\033\\\]\u@\h: \w\$ '$VAL

Şimdi port yönlendirme ile bağlanın:

### this will still enable ssh forwarding back. Change 22 to something else like 
### 24 to disable it (if nothing is listening on your source machines 24 port)
ssh -R 17891:localhost:22 user@target

Öneriler için teşekkürler, ancak henüz tam tatminim için çalışmıyor. İleriye doğru uzak bağlantı noktası kötü bir fikir değildir, ancak gerekli bir varsayım, tüm ana bilgisayarlarda aynı kullanıcı adına sahip olmanızdır. Burada durum bu değil, değiştirebileceğim bir şey değil. İkincisi: Bunu çalıştıramadım. Diyorsun ki AcceptEnv LC_*edilir genellikle varsayılan ayarı tarafından üzerinde, standart edilmesine değil?
Jeodezik

LC_ vuruldu ve özledim. Ne kadar yaygın olduğu hakkında yorum yapamam, ama işe yarayacak bir şey .. (ssh bağlantısından önce LC_SOURCEHOST vermeyi unutmayın).
Manwe

LC_ * test edildi ve çalışıyor. AcceptEnvİçindeki yönergede listelenen herhangi bir değişken olabilir /etc/ssh/sshd_config. sshdBu dosya değişirse yeniden başlatmayı unutmayın .
david.perez

1

who -mOturum açmış olan kullanıcı (ana bilgisayar adı dahil) hakkında bilgi almak için uzak uca yazabilirsiniz . whooturum açmış kullanıcılar hakkında bilgi verir ve -manahtar "stdin ile ilişkili yalnızca ana bilgisayar adını ve kullanıcıyı" gösterir.


Bu sadece bir ağ geçidi makinesinden tünellemiyorsam faydalıdır.
Jeodezik

0

aşağıdakileri denedin mi

 netstat -an | grep " 22 "

Bu yöntem yalnızca bir atlama bağlantısı için yararlıdır, bu yüzden benim için yararlı değildir.
Jeodezik
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.