Я хочу запускать команду каждый раз, когда я захожу в свой ящик 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