it-swarm.com.de

Wie kann ich feststellen, ob die Shell über SSH gesteuert wird?

Ich möchte anhand eines Shell-Skripts (genauer .zshrc) erkennen, ob es über SSH gesteuert wird. Ich habe die Host-Variable ausprobiert, aber es ist immer der Name des Computers, auf dem die Shell ausgeführt wird. Kann ich auf den Hostnamen zugreifen, von dem die SSH-Sitzung stammt? Ein Vergleich der beiden würde mein Problem lösen.

Jedes Mal, wenn ich mich anmelde, wird eine Meldung mit der letzten Anmeldezeit und dem Host angezeigt:

Last login: Fri Mar 18 23:07:28 CET 2011 from max on pts/1
Last login: Fri Mar 18 23:11:56 2011 from max

Dies bedeutet, dass der Server über diese Informationen verfügt.

72
stribika

Hier sind die Kriterien, die ich in meinem ~/.profile:

  • Wenn eine der Variablen SSH_CLIENT oder SSH_TTY ist definiert, es ist eine SSH-Sitzung.
  • Wenn der übergeordnete Prozessname der Anmelde-Shell sshd lautet, handelt es sich um eine SSH-Sitzung.
if [ -n "$SSH_CLIENT" ] || [ -n "$SSH_TTY" ]; then
  SESSION_TYPE=remote/ssh
# many other tests omitted
else
  case $(ps -o comm= -p $PPID) in
    sshd|*/sshd) SESSION_TYPE=remote/ssh;;
  esac
fi

(Warum sollten Sie dies in Ihrer Shell-Konfiguration testen und nicht in Ihrem Sitzungsstart?)

Sie sollten in der Lage sein, über die Variablen SSH_TTY, SSH_CONNECTION Oder SSH_CLIENT Zu überprüfen.

23
Cakemox

Ich hatte gerade das gleiche Problem unter Linux mit Bash. Ich habe zuerst die Umgebungsvariable SSH_CONNECTION verwendet, dann aber festgestellt, dass sie nicht festgelegt ist, wenn Sie su -.

Die obige Lastlog-Lösung funktionierte weder nach su noch nach su -.

Schließlich verwende ich who am i, Das am Ende die Remote-IP (oder den Hostnamen) anzeigt, wenn es sich um eine SSH-Verbindung handelt. Es funktioniert auch nach su.

Mit regulären Bash-Ausdrücken funktioniert dies:

if [[ $(who am i) =~ \([-a-zA-Z0-9\.]+\)$ ]] ; then echo SSH; else echo no; fi

Wenn zsh keine regulären Ausdrücke unterstützt, kann dasselbe mit grep, cut, sed oder was auch immer auf viele verschiedene Arten erreicht werden.

Für Neugierige ist unten das, wofür ich dies in Roots .bashrc verwende:

    # We don't allow root login over ssh.
    # To enable root X forwarding if we are logged in over SSH, 
    # use the .Xauthority file of the user who did su

    w=$(who am i)
    if [[ $w =~ \([-a-zA-Z0-9\.]+\)$ ]] ; then
        olduser=${w/ .*/}
        oldhome=$(getent passwd $olduser | cut -d: -f 6)
        [ -f "$oldhome/.Xauthority" ] \
          && export XAUTHORITY=$oldhome/.Xauthority
    fi

Eine Alternative, die auch mit su funktioniert, wäre die rekursive Suche nach sshd über die übergeordneten Prozesse:

#!/bin/bash

function is_ssh() {
  p=${1:-$PPID}
  read pid name x ppid y < <( cat /proc/$p/stat )
  # or: read pid name ppid < <(ps -o pid= -o comm= -o ppid= -p $p) 
  [[ "$name" =~ sshd ]] && { echo "Is SSH : $pid $name"; return 0; }
  [ "$ppid" -le 1 ]     && { echo "Adam is $pid $name";  return 1; }
  is_ssh $ppid
}

is_ssh $PPID
exit $?

Wenn die Funktion zu .bashrc hinzugefügt wird, kann sie als if is_ssh; then ... Verwendet werden.

10
mivk

Schauen Sie sich zunächst Ihre Umgebung an und finden Sie die richtige Option

printenv|grep SSH
SSH_CLIENT=192.168.1.xxx
SSH_CONNECTION=192.168.1.xxx
SSH_TTY=/dev/ttys021

Sie können sich in viele dieser Umgebungsvariablen einbinden, um bestimmte Aktionen basierend auf ihrer Anwesenheit auszulösen.

2
lfender6445