Como configurar um comando para executar no login, mas somente se através do telnet

2

Eu quero executar um comando toda vez que eu fizer login na minha caixa do Ubuntu, mas apenas se eu estiver conectando através do telnet, não se eu estiver logando no console.

    
por moswald 09.02.2010 / 16:43

3 respostas

2

Algo parecido com isto no seu .bashrc (assumindo o bash) deve funcionar razoavelmente bem:

if ( tty | egrep -q '\/pts\/' )
then
   echo "is a pts - remote login"
else
   echo "is not a pts - local login"
fi

Você apenas substituiria o eco pelo que quer que você quisesse executar.

    
por 09.02.2010 / 17:20
0

telnet? Eu não recomendo o seu uso! Uma das seguintes abordagens deve funcionar para a maioria dos métodos de acesso remoto. (Acesso remoto através de um cliente X, ou via VNC ou similar sendo exceções desculpáveis.)

  • alguns telnetd definem a variável de ambiente REMOTEHOST ou similar que você pode verificar
  • se você estiver executando xinetd , poderá alterar o ambiente telnetd por meio do atributo env
  • se você realmente quer dizer ssh (OpenSSH), então você pode verificar as variáveis SSH_TTY e SSH_CONNECTION .

Os terminais virtuais do console Linux (antes de você iniciar o X) terão tty nomes como /dev/tty1 em vez de pty (pseudo-ttys) em /dev/pts/ (pelo menos em x86). Dentro de X, os terminais serão alocados ptys.

A verificação de variáveis de ambiente muitas vezes pode ser subvertida pelos usuários, se isso for uma preocupação.

Uma solução de caso geral mais robusta é percorrer a árvore de processos de $$ até encontrar o que você está procurando (ou não), use isso em um script bash :

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
}

Quando executar por meio de um ssh login, por exemplo:

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

Descomente a linha echo para vê-la funcionando.

    
por 27.02.2013 / 19:15
0

Eu pessoalmente munge a saída de "quem sou eu" por outras razões (configuração DISPLAY). O último campo parece ser a "fonte" do login

    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

deve ser fácil verificar o formato do LOGINHOST para ver se é um login "remoto". telnet está desabilitado aqui (como deveria ser), portanto não posso verificar explicitamente como ele está configurado para o telnet

    
por 27.02.2013 / 19:49