Ho avuto lo stesso problema in Linux, usando Bash. Ho usato prima la variabile di ambiente SSH_CONNECTION, ma poi ho capito che non è stato impostato se si su -.
La soluzione lastlog sopra non ha funzionato né dopo suné su -.
Infine, sto usando who am i, che mostra l'IP remoto (o il nome host) alla fine se si tratta di una connessione SSH. Funziona anche dopo su.
Usando le espressioni regolari di Bash, funziona:
if [[ $(who am i) =~ \([-a-zA-Z0-9\.]+\)$ ]] ; then echo SSH; else echo no; fi
Se zsh non supporta le espressioni regolari, lo stesso può essere ottenuto in molti modi diversi con grep, cut, sed o altro.
Per i curiosi, di seguito è quello per cui lo uso, nel .bashrc di root:
# 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
Un'alternativa che funziona anche con la suricerca ricorsiva sshdattraverso i processi padre:
#!/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 $?
Se la funzione viene aggiunta a .bashrc, può essere utilizzata come if is_ssh; then ...