Comment configurer une commande à exécuter lors de la connexion, mais uniquement si via Telnet

2

Je souhaite exécuter une commande chaque fois que je me connecte à ma boîte Ubuntu, mais uniquement si je me connecte via Telnet, pas si je me connecte à la console.

Moswald
la source

Réponses:

2

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.

jch
la source
Un pty sera également alloué pour un terminal X ou une fenêtre "écran", ce qui n’est donc pas très fiable.
Grawity
J'ouvre quelques fenêtres de terminal ouvertes lorsque je me connecte à la console ...
moswald
Ouais, ça ne va pas suffire. Cela provoque l’impression de toutes les fenêtres du terminal X 'est un pts - login distant'.
moswald
0

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.)

  • certains telnetddéfinissent la variable d'environnement REMOTEHOSTou similaire que vous pouvez vérifier
  • si vous êtes en cours xinetdd' exécution, vous pouvez modifier l' telnetdenvironnement via l' envattribut
  • si vous voulez vraiment dire ssh(OpenSSH), alors vous pouvez vérifier l’une des variables SSH_TTYet SSH_CONNECTION.

Les terminaux virtuels de la console Linux (avant de démarrer X) auront des noms de tty similaires à /dev/tty1ceux 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 bashscript:

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 sshlogin, par exemple:

$ if checkparents sshd; then echo ssh; fi
ssh
$ if ! checkparents in.telnetd; then echo not telnet; fi
not telnet

Décommentez la echoligne pour la voir fonctionner.

mr.spuratic
la source
0

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

Rich Homolka
la source