Jak wykryć, kiedy powłoka jest własnością zdalnej sesji SSH?

9

Moje pytanie jest podobne do tego , ale szukam czegoś nieco innego. Mam komputer przenośny, którego używam do uzyskiwania dostępu do komputerów z systemem Linux w sieci w dwóch różnych scenariuszach:

  • Mam bezpośrednie, przewodowe połączenie z siecią.

  • Mam pośrednie połączenie z siecią. W sieci jest maszyna bramowa wystawiona na działanie Internetu, której mogę użyć do ustanowienia tuneli SSH do hostów w sieci. Jest to oczywiście znacznie wolniejsze połączenie o większym opóźnieniu.

Mój katalog domowy jest dostępny w sieci na wszystkich komputerach, więc udostępniają moją kopię .bashrc. Chciałbym dodać funkcjonalność, aby .bashrcwykrywać, w którym z dwóch scenariuszy jestem, i działać odpowiednio (technicznie byłyby trzy scenariusze, w których trzeci polega na tym, że loguję się na mojej lokalnej maszynie, ale to powinno być łatwe do rozwiązania ). Chciałbym robić takie rzeczy jak:

  • alias ssh ssh -X kiedy jestem w sieci lokalnej, ale nie chcę korzystać z przesyłania X w Internecie.

  • export EDITOR=gvimkiedy jestem w sieci lokalnej, ale export EDITOR=vimkiedy jestem zdalny.

I tak dalej. Na podstawie poprzedniej odpowiedzi wygląda na to, że powinienem być w stanie osiągnąć coś takiego, sprawdzając zawartość SSH_CLIENT(jeśli istnieje) i sprawdzając, czy adres IP klienta pasuje do jednej z kart sieciowych na moim komputerze lokalnym. Myślałem, że zobaczę, czy istnieje lepszy lub bardziej solidny sposób na osiągnięcie tego.

Jason R.
źródło

Odpowiedzi:

10

Aby wykryć sesję SSH, użyj $SSH_CLIENT.

Aby rozróżnić sesje lokalne i zdalne, istnieją dwa możliwe podejścia: po stronie klienta lub po stronie serwera. Po stronie serwera porównaj $SSH_CLIENTz lokalnym adresem IP lub tablicą routingu; zazwyczaj powie ci, czy połączenie jest z sieci LAN. Po stronie klienta możesz chcieć wprowadzić ForwardX11ustawienia ~/.ssh/config: ustaw yesna hosty LAN i nona hosty WAN. Oznacza to, że mają różne ~/.ssh/configw różnych witrynach; to właśnie robię i generuję moje za pomocą skryptu powłoki.

Jeśli przekazywanie X11 jest włączone dla połączeń LAN i wyłączone dla połączeń WAN, możesz ustawić swój ulubiony edytor, aby wziąć $DISPLAYpod uwagę.

Ustawienia po stronie serwera zwykle przechodzą do twojej .profile(lub .bash_profilejeśli twoja powłoka logowania jest bash i używasz .bash_profile, lub .zprofilejeśli twoja powłoka logowania jest zsh).

case ${SSH_CLIENT%% *}//$(/sbin/ifconfig |
                          sed -n 's/^.* addr:\([0-9][0-9.]*\) .*/\1/p' |
                          tr '\n' /)/ in
  "") :;;# local session
  10.42.*/10.42.*) :;; # LAN session
  1.2.3.*/1.2.3.*) :;; # LAN session
  *) unset DISPLAY;; # WAN session
esac
export EDITOR=vim
if [ -n "$DISPLAY" ] && type gvim >/dev/null 2>/dev/null; then
  EDITOR=gvim
fi
export VISUAL="$EDITOR"
Gilles „SO- przestań być zły”
źródło
włączony dla LAN i wyłączony dla LAN? Drugi powinien przeczytać WAN - ale to edycja pojedynczego znaku ...
Nils