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 ProxyCommand
in ~/.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_CLIENT
Zmienna 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_CLIENT
i 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ą.
źródło
Odpowiedzi:
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
prowadziłbyś coś wzdłuż linii
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_HOST
należ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
-l
i . Może musisz je pominąć.-i
/bin/bash
źródło
Czy rozumiem poprawnie, że łączysz się bezpośrednio z maszyny początkowej do miejsca docelowego za pomocą
proxycommand
chmielu. 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
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ć:Po trzecie) Użyj zdalnego przesyłania dalej ssh, aby zidentyfikować hosta lub typ hosta.
Teraz połącz się z przekierowaniem portów:
źródło
AcceptEnv LC_*
jest to ogólnie dozwolone, ale nie standardowe, ustawienie domyślne?AcceptEnv
dyrektywie w/etc/ssh/sshd_config
. Pamiętaj, aby ponownie uruchomić,sshd
jeśli ten plik zostanie zmieniony.Możesz wpisać
who -m
na zdalnym końcu, aby uzyskać informacje o aktualnie zalogowanym użytkowniku (w tym nazwę hosta).who
podaje informacje o zalogowanych użytkownikach, a-m
przełącznik pokazuje „tylko nazwę hosta i użytkownika powiązanego ze standardowym wejściem”.źródło
próbowałeś następujących rzeczy?
źródło