Je viens d'avoir le même problème sous Linux, en utilisant Bash. J'ai d'abord utilisé la variable d'environnement SSH_CONNECTION, mais je me suis ensuite rendu compte qu'elle n'était pas définie si vous su -
.
La solution lastlog ci-dessus ne fonctionnait ni après su
ni su -
.
Enfin, je l’utilise who am i
, ce qui indique l’adresse IP distante (ou le nom d’hôte) à la fin s’il s’agit d’une connexion SSH. Cela fonctionne également après le su.
En utilisant des expressions régulières Bash, cela fonctionne:
if [[ $(who am i) =~ \([-a-zA-Z0-9\.]+\)$ ]] ; then echo SSH; else echo no; fi
Si zsh ne prend pas en charge les expressions rationnelles, la même chose peut être réalisée de différentes manières avec grep, cut, sed, etc.
Pour les curieux, voici ce que j’utilise pour cela, dans le fichier .bashrc de 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
Une alternative qui fonctionne également avec su
serait de rechercher récursivement à sshd
travers les processus parents:
#!/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 fonction est ajoutée à .bashrc, elle peut être utilisée comme if is_ssh; then ...