Wie kann man erkennen, wann eine Shell einer Remote-SSH-Sitzung gehört?

9

Meine Frage ähnelt dieser , aber ich suche etwas anderes. Ich habe einen Notebook-PC, mit dem ich in zwei verschiedenen Szenarien auf Linux-Computer in einem Netzwerk zugreifen kann:

  • Ich habe eine direkte Kabelverbindung zum Netzwerk.

  • Ich habe eine indirekte Verbindung zum Netzwerk. Im Netzwerk befindet sich ein Gateway-Computer, der dem Internet ausgesetzt ist und mit dem ich SSH-Tunnel zu Hosts im Netzwerk einrichten kann. Dies ist offensichtlich eine viel langsamere Verbindung mit höherer Latenz.

Mein Home-Verzeichnis ist von allen Computern aus über das Netzwerk zugänglich, sodass sie eine Kopie von meinem freigeben .bashrc. Ich möchte Funktionen hinzufügen, um .bashrczu erkennen, in welchem ​​der beiden Szenarien ich mich befinde, und entsprechend zu handeln (technisch gesehen gibt es drei Szenarien, in denen das dritte darin besteht, dass ich mich bei meinem lokalen Computer anmelde, dies sollte jedoch einfach zu handhaben sein ). Ich würde gerne Dinge tun wie:

  • alias ssh ssh -X Wenn ich im lokalen Netzwerk bin, aber keine X-Weiterleitung über das Internet verwenden möchte.

  • export EDITOR=gvimwenn ich im lokalen Netzwerk export EDITOR=vimbin , aber wenn ich remote bin.

Und so weiter. Basierend auf der vorherigen Antwort sollte ich in der Lage sein, so etwas zu erreichen, indem ich den Inhalt von SSH_CLIENT(falls vorhanden) überprüfe und prüfe, ob die Client-IP-Adresse mit einem der Netzwerkadapter auf meinem lokalen Computer übereinstimmt. Ich dachte, ich würde sehen, ob es einen schlaueren oder robusteren Weg gibt, dies zu erreichen.

Jason R.
quelle

Antworten:

10

Verwenden Sie zum Erkennen einer SSH-Sitzung $SSH_CLIENT.

Um zwischen lokalen und Remote-Sitzungen zu unterscheiden, gibt es zwei mögliche Ansätze: clientseitig oder serverseitig. Vergleichen Sie auf der Serverseite $SSH_CLIENTdie lokale IP-Adresse oder Routing-Tabelle. Hier erfahren Sie normalerweise, ob die Verbindung über das LAN erfolgt. Auf der Clientseite möchten Sie möglicherweise ForwardX11Einstellungen in Folgendes vornehmen ~/.ssh/config: Stellen Sie diese yesfür LAN-Hosts und nofür WAN-Hosts ein. Dies impliziert, dass ~/.ssh/configan verschiedenen Standorten unterschiedliche Einstellungen vorgenommen werden. Das ist was ich tue und ich generiere meine mit einem Shell-Skript.

Wenn die X11-Weiterleitung für LAN-Verbindungen aktiviert und für WAN-Verbindungen deaktiviert ist, können Sie Ihren bevorzugten Editor so einstellen, dass er dies $DISPLAYberücksichtigt.

Die serverseitigen Einstellungen werden normalerweise in Ihre Einstellungen übernommen .profile(oder .bash_profilewenn Ihre Anmeldeshell bash ist und Sie verwenden .bash_profileoder .zprofilewenn Ihre Anmeldeshell zsh ist).

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 - hör auf böse zu sein'
quelle
Ein für LAN und Aus für LAN? Der zweite sollte WAN lesen - aber das ist eine Einzelzeichenbearbeitung ...
Nils