Ich hatte gerade das gleiche Problem in Linux mit Bash. Ich habe zuerst die Umgebungsvariable SSH_CONNECTION verwendet, dann aber festgestellt, dass sie bei Ihnen nicht gesetzt ist su -
.
Die letzte Lösung funktionierte weder nach su
noch nach su -
.
Schließlich verwende ich who am i
, die die entfernte IP (oder den Hostnamen) am Ende zeigt, wenn es eine SSH-Verbindung ist. Es funktioniert auch nach su.
Mit regulären Bash-Ausdrücken funktioniert Folgendes:
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 auf viele verschiedene Arten mit grep, cut, sed oder was auch immer erreicht werden.
Für die Neugierigen ist unten, wofür ich dies benutze, in root's .bashrc:
# 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 funktioniert, su
wäre, rekursiv sshd
durch die übergeordneten Prozesse zu suchen :
#!/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 verwendet werden if is_ssh; then ...