Réponses:
Quelque chose comme ça dans votre .bashrc (en supposant que bash) fonctionne assez bien:
if ( tty | egrep -q '\/pts\/' )
then
echo "is a pts - remote login"
else
echo "is not a pts - local login"
fi
Vous ne feriez que remplacer l'écho par ce que vous vouliez utiliser.
telnet? Je ne recommande pas son utilisation! L'une des approches suivantes devrait fonctionner pour la plupart des méthodes d'accès à distance. (L'accès à distance via un client X, ou via VNC ou une exception similaire constitue une exception excusable.)
telnetd
définissent la variable d'environnement REMOTEHOST
ou similaire que vous pouvez vérifierxinetd
d' exécution, vous pouvez modifier l' telnetd
environnement via l' env
attributssh
(OpenSSH), alors vous pouvez vérifier l’une des variables SSH_TTY
et SSH_CONNECTION
.Les terminaux virtuels de la console Linux (avant de démarrer X) auront des noms de tty similaires à /dev/tty1
ceux de pty (pseudo-ttys) dans /dev/pts/
(au moins sur x86). Dans X, les terminaux se verront attribuer des ptys.
La vérification des variables d'environnement peut souvent être subvertie par les utilisateurs, si cela pose un problème.
Une solution de cas générale plus robuste consiste à parcourir l'arborescence de processus à partir de $$ jusqu'à ce que vous trouviez ce que vous cherchez (ou pas), utilisez-la dans un bash
script:
function checkparents()
{
local _proc=$1 _pid _ppid=$$ _tty="" _comm _rc=1
while [ "$_ppid" != "1" ]; do
read _pid _ppid _tty _comm < <(ps --no-headers -p $_ppid -o "pid ppid tty comm")
#echo "$_pid $_ppid $_tty $_comm"
[ "$_comm" = "$_proc" ] && { _rc=0; break; }
[ "$_pid" = "$_proc" ] && { _rc=0; break; }
done
return $_rc
}
Lorsqu'il est exécuté via un ssh
login, par exemple:
$ if checkparents sshd; then echo ssh; fi
ssh
$ if ! checkparents in.telnetd; then echo not telnet; fi
not telnet
Décommentez la echo
ligne pour la voir fonctionner.
Personnellement, je munge la sortie de "qui suis-je" pour d'autres raisons (réglage DISPLAY). Le dernier champ semble être la "source" de la connexion
typeset -a LOGINARRAY
# who am I format: USER TTY MON DAY TIME LOGINHOST,
# use array to get last entry
LOGINARRAY=( $(/usr/bin/who -sum) )
LASTINDEX=$(( ${#LOGINARRAY[*]} - 1))
LOGINHOST=${LOGINARRAY[$LASTINDEX]}
LOGINHOST=${LOGINHOST##*\(}
LOGINHOST=${LOGINHOST%%)*}
DISPLAY=$LOGINHOST:0
export DISPLAY
unset LOGINARRAY LASTINDEX
il devrait être assez facile de vérifier le format de LOGINHOST pour voir s’il s’agit d’un login "distant". telnet est désactivé ici (comme il se doit), donc je ne peux pas vérifier explicitement comment il est configuré pour telnet