Я хочу запускать команду каждый раз, когда я захожу в свой ящик Ubuntu, но только если я подключаюсь через telnet, а не если я захожу в консоль.
3 ответа
Нечто подобное в вашем .bashrc (при условии, что bash) должно работать довольно хорошо:
if ( tty | egrep -q '\/pts\/' )
then
   echo "is a pts - remote login"
else
   echo "is not a pts - local login"
fi
Вы бы просто заменили эхо тем, что хотели запустить.
телнет? Я не рекомендую его использовать! Один из следующих подходов должен работать для большинства методов удаленного доступа. (Удаленный доступ через 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 строку эха, чтобы увидеть, как она работает.
Я лично оцениваю вывод "кто я" по другим причинам (настройка 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
