2

Я хочу запускать команду каждый раз, когда я захожу в свой ящик Ubuntu, но только если я подключаюсь через telnet, а не если я захожу в консоль.

3 ответа3

2

Нечто подобное в вашем .bashrc (при условии, что bash) должно работать довольно хорошо:

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

Вы бы просто заменили эхо тем, что хотели запустить.

0

телнет? Я не рекомендую его использовать! Один из следующих подходов должен работать для большинства методов удаленного доступа. (Удаленный доступ через X-клиент, или через VNC или аналогичные исключения.)

  • некоторые telnetd устанавливают переменную окружения REMOTEHOST или аналогичную, которую вы можете проверить
  • если вы используете xinetd вы можете изменить окружение telnetd через атрибут env
  • если вы действительно имеете в виду ssh (OpenSSH), то вы можете проверить любую из переменных SSH_TTY и SSH_CONNECTION .

Виртуальные терминалы консоли Linux (до запуска X) будут иметь tty-имена, такие как /dev/tty1 а не pty (pseudo-ttys) в /dev/pts/ (по крайней мере, в x86). В пределах X терминалам будут выделены ptys.

Проверка переменных среды часто может быть подорвана пользователями, если это вызывает озабоченность.

Более надежное общее решение для случая - это пройтись по дереву процессов от $$, пока вы не найдете то, что ищете (или нет), используйте это в скрипте 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
}

При запуске через логин ssh например:

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

echo строку эха, чтобы увидеть, как она работает.

0

Я лично оцениваю вывод "кто я" по другим причинам (настройка DISPLAY). Последнее поле кажется "источником" логина

    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

должно быть достаточно легко проверить формат LOGINHOST, чтобы увидеть, является ли это "удаленным" логином. Telnet здесь отключен (как и должно быть), поэтому я не могу явно проверить, как он настроен для Telnet

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .