Acabo de tener el mismo problema en Linux, usando Bash. Primero usé la variable de entorno SSH_CONNECTION, pero luego me di cuenta de que no está configurada si usted su -.
La última solución de registro anterior no funcionó ni después suni su -.
Finalmente, estoy usando who am i, que muestra la IP remota (o el nombre de host) al final si es una conexión SSH. También funciona después de su.
Usando expresiones regulares de Bash, esto funciona:
if [[ $(who am i) =~ \([-a-zA-Z0-9\.]+\)$ ]] ; then echo SSH; else echo no; fi
Si zsh no admite expresiones regulares, lo mismo se puede lograr de muchas maneras diferentes con grep, cut, sed o lo que sea.
Para los curiosos, a continuación es para lo que uso esto, en el .bashrc de la raíz:
# 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
Una alternativa que también funciona susería buscar de forma recursiva a sshdtravés de los procesos principales:
#!/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 $?
Si la función se agrega a .bashrc, se puede usar como if is_ssh; then ...