Znajdowanie adresu IP lub nazwy hosta komputera źródłowego (ssh)

10

Ciągle łączę się z wieloma maszynami, z różnych fizycznych lokalizacji (a więc z różnych fizycznych maszyn). Większość tego jest wykonywana przez ssh, czasem wymagana jest maszyna bramkowa lub dwie (które wywołuję przez ProxyCommandin ~/.ssh/config). Chciałbym wiedzieć, czy istnieje metoda identyfikacji adresu IP lub nazwy hosta komputera, który wywołuje połączenie początkowe (tj. Komputer, na którym pracuję) na zdalnym końcu?

  • Nie chcę wysyłać zmiennych środowiskowych, ponieważ na niektórych komputerach nie mam ustawionego katalogu głównego PermitUserEnvironment.
  • $SSH_CLIENTZmienna jest przydatna dla połączeń bezpośrednich, ale tylko wymienia najnowszą bramę.

Mój obecny pomysł na rozwiązanie polega na przechwytywaniu $SSH_CLIENT, ssh do niego, znajdowaniu wartości tej maszyny $SSH_CLIENTi powtarzaniu, dopóki ona nie istnieje; następnie chwyć nazwę hosta i cofnij jakoś.

Wydaje się jednak, że to trochę włamanie; czy ktoś ma lepszą metodę?

Pracuję głównie w powłoce bash, ale cieszę się również z sugestii, które również jej nie używają.

Geodezja
źródło
Jednym z celów ProxyCommand jest oczywiście ukrycie (lub zapomnienie) hosta źródłowego (który i tak może nie być możliwy do routingu z hosta końcowego)
Hagen von Eitzen
Czy możesz podać przykład, gdzie lub dlaczego potrzebujesz tych informacji? Mogą istnieć inne nieoczywiste rozwiązania.
Manwe,
@Manwe W końcu chcę skonfigurować sekcje specyficzne dla ustawień regionalnych w takich rzeczach, jak mój .bashrc. W tej chwili wszystko, co chcę zrobić, to ustawić automatycznie jeden z trzech układów klawiatury w vimie, w zależności od komputera, z którego pracuję.
Geodesic

Odpowiedzi:

3

Nigdy nie próbowałem, ale mogę wymyślić coś, co może działać: nie pozwalasz SSH na uruchomienie powłoki logowania, ale bierzesz sprawy w swoje ręce. Możesz powiedzieć SSH, aby uruchamiał dowolne polecenia. Zamiast

ssh remote_host

prowadziłbyś coś wzdłuż linii

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

To robi, daje SSH coś innego do zrobienia zamiast uruchamiania powłoki logowania. Że coś jest łańcuchem, który będzie uruchamiany zdalnie jako polecenie. Używamy tego do uruchamiania powłoki w bardzo szczególny sposób: dajemy jej zmienną środowiskową DAT_ORIGIN_HOST, która zawiera naszą ip na eth0 (być może trzeba to zmienić).

Trik, który wykonujemy polega na tym, że umieszczamy polecenie, aby wykonać je zdalnie w podwójnych qoutach ". Podwójne cudzysłowy (przynajmniej w Bash) oznaczają, że ZANIM STRING JEST PRZEKAZANY SSH, nasza powłoka skanuje go i wykonuje rozszerzenia / wymiany, tam gdzie to właściwe. Oznacza to, że nasza powłoka oceni część `$ (ifconfig ...) na nasz aktualny adres ip i przekaże ssh ciąg znaków, który zawiera definicję zmiennej środowiskowej z naszym lokalnym adresem ip.

Po zalogowaniu się do zdalnego urządzenia echo $DAT_ORIGIN_HOSTnależy wydrukować swój adres IP.

Aby rozwinąć to wezwanie do SSH, bezwstydnie wziąłem stąd do wyodrębnienia adresu IP i tutaj do -t i jak uruchomić coś interaktywnego

Oświadczenie: Nie jestem pewien co do opcji -li . Może musisz je pominąć.-i/bin/bash

użytkownik1129682
źródło
Być może coś tu masz! Pobawię się nim i wrócę do ciebie.
Geodesic
Zaznaczam tę odpowiedź, ponieważ oba pseudo-tty i polecenia zdalne działają. Ostatecznie rozwiązałem swój konkretny przypadek za pomocą wywołań zwrotnych ^ E, opartych na sugestii poleceń zdalnych - w końcu jest nieco czystszy i ma ogólne zastosowanie. Dzięki!
Geodesic
2

Czy rozumiem poprawnie, że łączysz się bezpośrednio z maszyny początkowej do miejsca docelowego za pomocą proxycommandchmielu. Oto trzy hacki dla ciebie (trzeci dodany po komentarzu na temat scenariusza użycia). Po pierwsze) Użyj zdalnego przekierowania portów, aby umożliwić ci powrót do komputera źródłowego za pomocą-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 

Po drugie) Nadużycie AcceptEnv LC_*w celu. To nie jest miłe, ale dość często dopuszcza się zmienne LOCALE, nawet jeśli AcceptUserEnviconment nie jest dostępne. Teraz możesz zrobić:

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

Po trzecie) Użyj zdalnego przesyłania dalej ssh, aby zidentyfikować hosta lub typ hosta.

# 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

Teraz połącz się z przekierowaniem portów:

### 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
Manwe
źródło
Dzięki za sugestie, ale żadne z nich nie działa jeszcze w pełni. Zdalne przekierowanie portów nie jest złym pomysłem, ale niezbędnym założeniem jest to, że masz tę samą nazwę użytkownika na wszystkich hostach. Tak nie jest w tym przypadku ani czegoś, co mogę zmienić. Po drugie: nie mogłem tego uruchomić. Czy mówisz, że AcceptEnv LC_*jest to ogólnie dozwolone, ale nie standardowe, ustawienie domyślne?
Geodesic
Cóż, LC_ jest trafiony. Nie mogę wypowiedzieć się na temat tego, jak powszechne jest to zjawisko, ale może to działać. (Pamiętaj, aby wyeksportować LC_SOURCEHOST przed połączeniem ssh).
Manwe,
Przetestowano LC_ * i działa. Może to być dowolna zmienna wymieniona w AcceptEnvdyrektywie w /etc/ssh/sshd_config. Pamiętaj, aby ponownie uruchomić, sshdjeśli ten plik zostanie zmieniony.
david.perez
1

Możesz wpisać who -mna zdalnym końcu, aby uzyskać informacje o aktualnie zalogowanym użytkowniku (w tym nazwę hosta). whopodaje informacje o zalogowanych użytkownikach, a -mprzełącznik pokazuje „tylko nazwę hosta i użytkownika powiązanego ze standardowym wejściem”.

Paulo Almeida
źródło
Jest to przydatne tylko wtedy, gdy nie tuneluję przez maszynę bramy.
Geodesic
0

próbowałeś następujących rzeczy?

 netstat -an | grep " 22 "

źródło
Ta metoda jest przydatna tylko dla połączeń z jednym przeskokiem, więc nie jest dla mnie przydatna.
Geodesic