Telnet (telecommunications network) — это сетевой протокол (работающий по TCP-соединению), предназначенный для ручного управления удаленными машинами с помощью команд консольного терминала.
С помощью Telnet команды вводятся на локальной машине, а выполняются на удаленной. То есть пользователь сперва вводит IP-адрес и порт (по умолчанию 23) удаленного сервера, после чего выполняет команды на нем.
Несмотря на то, что в наши дни чаще всего используется SSH, Telnet до сих пор остается популярным инструментом для управления удаленными хостами.
В этом руководстве будет рассмотрено базовое использование команд Telnet в операционных системах на базе Linux. Все показанные примеры запускались на облачном сервере Timeweb Cloud под управлением операционной системы Ubuntu 22.04.
Telnet и SSH — похожие друг на друга технологии, позволяющие выполнять консольные команды на удаленных машинах.
Однако горизонтальное сравнение Telnet и SSH не совсем корректно. Скорее SSH, появившийся в 1995 году, является эволюционным преемником Telnet, созданным в 1969 году.
Протокол SSH, в отличие от Telnet, выполняет полное шифрование данных. Поэтому Telnet, как более старая технология, в большей степени уязвим к перехватам.
В дополнение к этому, SSH поддерживает безопасные методы аутентификации с использованием пары закрытого (приватного) и открытого (публичного) ключей, в то время как Telnet использует простую текстовую авторизацию.
Тем не менее, из-за своей простоты Telnet до сих пор актуален. Его использует в задачах, которые не требовательны к безопасности. Например, в закрытых сетях.
Исходя из этого, можно выделить некоторые ключевые отличия Telnet от SHH:
Telnet |
SSH |
|
Релиз |
1969 год |
1995 год |
Порт |
23 |
22 |
Уязвимость |
Высокая |
Низкая |
Данные |
Обычный текст |
Зашифрованный текст |
Специализация |
Частные сети |
Публичные сети |
Полоса пропускания |
Низкая |
Высокая |
Цветной (графический) терминал |
Не поддерживает |
Поддерживается |
Чтобы проверить, установлен ли Telnet в системе, можно ввести в консольный терминал соответствующую команду с неправильно указанной опцией:
telnet -q
Если Telnet действительно есть в системе, то в консольном терминале появится вывод с сообщением об ошибке и короткой справкой о возможных опциях команды:
telnet: invalid option -- 'q'
Usage: telnet [-4] [-6] [-8] [-E] [-L] [-a] [-d] [-e char] [-l user]
[-n tracefile] [ -b addr ] [-r] [host-name [port]]
Если же в консольном терминале появился примерно такой вывод:
-bash: /usr/bin/telnet: No such file or directory
Или такой:
telnet: command not found
Try: apt install <deb name>
Тогда утилиту Telnet необходимо загрузить и установить вручную с помощью пакетного менеджера APT:
sudo apt install telnet
После этого можно переходить к использованию протокола Telnet для управления удаленными хостами.
vds
Установление связи с удаленной машиной с помощью утилиты Telnet не требует ввода сложных команд и во многом напоминает работу с SSH.
Схема консольной команды выглядит так:
telnet [ОПЦИИ] [IP-АДРЕС] [ПОРТ]
Здесь задаются три основных типа параметров для соединения с удаленной машиной:
IP-АДРЕС
. Либо IP-адрес (IPv4 или IPv4), либо домен удаленной машины, к которой выполняется подключение.
ПОРТ
. Открытый порт на удаленной машине, по которому выполняется подключение. По умолчанию Telnet прослушивает подключения на 23 порту.
ОПЦИИ
. Дополнительные флаги с параметрами, которые уточняют нюансы подключения.
Особое внимание стоит уделить небольшому списку возможных опций в Telnet, каждая из которых выполняет свою определенную функцию:
|
Использовать IPv4-адрес во время подключения |
|
Использовать IPv6-адрес во время подключения |
|
Использовать 8-битную кодировку при отправке данных |
|
Изменить горячую клавишу отсоединения (escape-последовательность) |
|
Отключить горячую клавишу отсоединения (escape-последовательность) |
|
Указать явно имя пользователя для авторизации на удаленной машине |
|
Использовать имя пользователя для авторизации на удаленной машине из переменной окружения |
Таким образом, настоящая команда подключения через Telnet может выглядеть следующим образом:
telnet -4 194.87.118.235 23
В этом случае мы указали:
Опцию -4
, сообщающую об использовании IP-адреса типа IPv4.
Сам IP-адрес удаленной машины.
Стандартный 23 порт, на котором удаленный сервер прослушивает Telnet-подключения.
При этом параметры по умолчанию можно не указывать явно, упрощая команду до вида:
telnet 194.87.118.235
После установки соединения с удаленным хостом Telnet может работать в двух режимах:
Построчный (по умолчанию). Команды и данные вводятся посимвольно, но отправляются на удаленный сервер построчно. Поэтому перед отправкой команды всегда можно исправить возможную ошибку ввода.
Посимвольный. Команды и данные вводятся посимвольно и отправляются на удаленный сервер тоже посимвольно. В этом случае любую возможную ошибку ввода исправить невозможно.
Управление удаленной машиной выполняется с помощью набора команд. В этом руководстве мы рассмотрим лишь основные из них:
|
Подключиться к удаленной машине |
|
Отключиться от удаленной машины |
|
Отключить от удаленной машины и выйти из Telnet |
|
Проверить статус соединения с удаленной машиной |
|
Переключиться между построчным и посимвольным режимами |
Самый простой способ проверить работоспособность Telnet — подключиться к локальному хосту:
telnet localhost
Как правило, после выполнения этой команды возникает ошибка:
Trying ::1...
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused
Это связано с тем, что на локальной машине не установлена служба Telnet — сервер (демон), прослушивающий 23 порт (по умолчанию) и обрабатывающий подключения.
Установить его можно через пакетный менеджер APT:
sudo apt install telnetd -y
Обратите внимание на букву «d» после слова «telnet» — это не описка! Флаг -y
автоматически положительно отвечает на вопросы во время установки.
После этого можно повторить попытку подключения к локальному хосту:
telnet localhost
В консольном терминале появится вывод, содержащий информацию о статусе подключения и требование ввести имя пользователя, под которым необходимо выполнить авторизацию на удаленной машине:
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Ubuntu 22.04.5 LTS
3833269-yn55665 login:
Для тестирования возможностей Telnet можно авторизоваться под пользователем root
.
После этого консольный терминал потребует ввести пароль указанного пользователя:
Password:
После успешной авторизации все введенные команды будут выполняться на удаленной машине.
Например, сразу подключения можно выйти из консольного терминала удаленного хоста:
exit
В консольном терминале локальной машины появится сообщение о закрытии соединения:
logout
Connection closed by foreign host.
При этом консольный ввод имени пользователя можно пропустить, заранее указав его с помощью опции -l
:
telnet -l root localhost
В этом случае в консольном терминале появится информация о состоянии подключения и предложение сразу ввести пароль:
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Password:
Еще один вариант использования Telnet — выполнение HTTP-запросов к удаленным серверам.
Например, таким образом можно загрузить содержимое главной страницы произвольного сайта:
telnet timeweb.cloud 80
Обратите внимание, что в команде был явно указан 80 порт, через который по умолчанию устанавливается HTTP-соединение.
После этого консольный терминал предложит ввести содержимое HTTP-запроса:
GET / HTTP/1.0
Host: timeweb.cloud
После его отправки в консольном терминале появится вывод, содержащий ответ удаленного сервера и информационное сообщение о закрытии соединения:
HTTP/1.1 301 Moved Permanently
Server: QRATOR
Date: Sun, 01 Dec 2024 19:02:03 GMT
Content-Length: 0
Connection: close
location: https://timeweb.cloud/
Connection closed by foreign host.
Полученный ответ удаленного сервера сообщает, что запрашиваемый сайт навсегда переехал на адрес протокола HTTPS.
При использовании Telnet можно указывать дополнительные опции, уточняющие механизм соединение с удаленной машиной.
Все опции представлены в виде флагов, которые указываются вместе с символом минуса (дефиса). Некоторые опции требуют указания дополнительного параметра после.
Опция явно показывает Telnet, что для подключения используется IP-адрес типа IPv4:
telnet -4 194.87.118.235
Опция явно показывает Telnet, что для подключения используется IP-адрес типа IPv6:
telnet -6 2a03:6f00:a::4ca1
При этом важно убедиться в том, что прослушивающий сервер (например, telnetd
) поддерживает работу с IPv6-адресами.
Опция предписывает Telnet использовать для передачи 8-битный тип данных:
telnet -8 194.87.118.235
Сегодня эту опцию можно считать неактуальной, т.к. современные машины поддерживают большую битность при передачи данных.
Опция устанавливает горячую клавишу выхода — так называемую escape-последовательность (или символ).
Если запустить без явного указания escape-последовательности:
telnet 194.87.118.235
— то в консоли появится информационное сообщение о статусе подключения:
Trying 194.87.118.235...
Connected to 194.87.118.235.
Escape character is '^]'.
Ubuntu 22.04.5 LTS
3833269-yn55665 login:
В нем можно заметить такую строчку:
Escape character is '^]'.
По умолчанию escape-последовательность выглядит так:
^]
Это означает, что при нажатии сочетания клавиш Ctrl + ] в активном консольном терминале удаленной машины Telnet отключится от нее и перейдет в свой терминал, который обычно открывается после ввода команды вызова утилиты:
telnet
После этого можно выйти из терминала Telnet, оказавшись в стандартном консольном терминале локальной машины:
quit
Соответственно, сочетание клавиш выхода можно изменить:
telnet -e ^P 194.87.118.235
В этом случае отключение от удаленной машины будет выполняться после одновременного нажатия клавиш Ctrl + P.
Если перед символом клавиши не указывать символ циркумфлекса (^
), тогда Telnet будет реагировать на нажатие только указанной клавиши без учета Ctrl:
telnet -e ] 194.87.118.235
В этом случае отключиться от удаленной машины можно будет с помощью одиночного нажатия клавиши с буквой Ъ.
Однако в этом случае нужно быть осторожным — если вводимые имя пользователя или пароль (даже если они копируются, а не печатаются на клавиатуре) содержат указанный одиночный символ (например, квадратную скобку ]
), то Telnet на него среагирует и оборвет соединение с удаленным хостом еще на этапе авторизации.
Впрочем, то же самое касается ввода символов в качеств управляющих команд в удаленный терминал уже после авторизации.
Например, если в качестве escape-символа указать строчную букву t
:
telnet -e t 194.87.118.235
— то Telnet оборвет соединение в момент ввода последнего символа имени пользователя root
:
root@3833269-yn55665:~# telnet -e t 194.87.118.235
Telnet escape character is 't'.
Trying 194.87.118.235...
Connected to 194.87.118.235.
Escape character is 't'.
Ubuntu 22.04.5 LTS
3833269-yn55665 login:
Сочетание горячих клавиш для выхода (escape-последовательность) можно полностью отключить:
telnet -E 194.87.118.235
После этого в консольном терминале появится сообщение о статусе подключения:
Trying 194.87.118.235...
Connected to 194.87.118.235.
Escape character is 'off'.
Ubuntu 22.04.5 LTS
3833269-yn55665 login:
В нем будет соответствующая строчка, показывающая отсутствие escape-последовательности:
Escape character is 'off'.
После этого выйти из консольного терминала удаленной машины (например, если она работает на Ubuntu) можно только с помощью явной команды выхода:
exit
При подключении через Telnet в консольном терминале появится требование ввести имя пользователя, под которым выполняется авторизация на удаленной машине:
Trying 194.87.118.235...
Connected to 194.87.118.235.
Escape character is 'off'.
Ubuntu 22.04.5 LTS
3833269-yn55665 login:
Ввода имени пользователя можно можно избежать, явно указав его в команде:
telnet -l root 194.87.118.235
В этом случае консольный терминал сразу попросит ввести пароль от учетной записи указанного пользователя:
Trying 194.87.118.235...
Connected to 194.87.118.235.
Escape character is '^]'.
Password:
В операционных системах Linux есть переменная окружения USER
, содержащая имя пользователя, который использует систему в данный момент:
echo $USER
В консольном терминале появится имя текущего пользователя:
root
Это имя можно передать в Telnet для автоматической авторизации:
telnet -a 194.87.118.235
После этого Telnet возьмет необходимое имя из переменной окружения USER
и попросит ввести только пароль:
Trying 194.87.118.235...
Connected to 194.87.118.235.
Escape character is '^]'.
Password:
В отличие от опций, команды представляют собой ключевые слова, после которых указываются дополнительные параметры.
Команды Telnet можно вводить только в его собственном терминале:
telnet
После этого перед активная строка консольного терминала будет иметь такую надпись:
telnet>
Чтобы посмотреть описание конкретной команды, необходимо ввести знак вопроса перед ее названием:
? команда
Чтобы посмотреть справку о конкретной команде, необходимо ввести знак вопроса после ее названия:
команда ?
Устанавливает соединение с хостом на основе его IP-адреса и порта:
open localhost
После этого в консольном терминале появится уже знакомое предложение ввести имя пользователя:
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Password:
Можно запросить дополнительную справку о команде:
open ?
После чего в консольном терминале появится схема команды со всеми возможными параметрами и опциями:
usage: open [-l user] [-a] host-name [port]
Как можно заметить, с этой командой можно использовать опцию -l
, которая позволяет явно указать имя пользователя перед авторизацией:
open -l root localhost
Короткое описание команды можно прочитать следующим образом:
? open
В этом случае в консольном терминале появится такой вывод:
connect to a site
Закрывает открытое соединение с хостом:
close
Эта команда не используется во время работы с терминалом удаленного хоста. Обычно она актуальна при подключении к системам другого типа.
Команда похожа на CLOSE
, но работает несколько иначе. В отличие от самостоятельного закрытия соединения на стороне локальной машины, как в случае с CLOSE
, эта команда заставляет удаленный хост закрыть соединение:
logout
Выводит состояние текущего соединения:
status
Переключает режимы работы с удаленным хостом.
Например, так можно активировать построчный режим:
mode line
А так посимвольный:
mode character
Разверните свой Linux VDS в Timeweb Cloud
Будучи предшественником SSH, протокол Telnet не обладает достаточно высокой безопасностью — он не использует те методы шифрования, которые являются стандартными для SSH.
Тем не менее Telnet до сих пор актуален в частных задачах. Поэтому стоит знать основы работы с ним.
Взаимодействие с Telnet основано на выполнении команд с указанием специфических опций. Таким образом можно выполнять подключения (запросы) к удаленным машинам по различным адресам и портам, а также выполнять консольные команды так, как если бы они запускались локально.
Исчерпывающую информацию (хотя из без достойных примеров) можно найти в документации по протоколу (утилите) Telnet.