Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа №4 (FAQ).doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
406.02 Кб
Скачать

6.4.4. Telnet(1), nc(1)

Основное назначение программы telnet(1) заключается в том, что она предоставляет удалённый терминал, позволяя управлять машиной на расстоянии. К сожалению, программа telnet(1) не шифрует трафик и даже пароли передаёт в открытом виде. Мы покажем чем это опасно, когда будем обсуждать программу tcpdump(1).

Важно

Использовать программу telnet(1) по назначению — дурной тон. Это крайне небезопасно! Вместо неё следует использовать программу ssh(1).

Однако программу telnet(1) можно использовать для того, чтобы провести диалог с удалённым сервером, проверить работу сервиса прослушивающего соответствующий порт. Например, при передаче почты, устанавливается связь с 25-м портом почтового сервера и далее идут команды SMTP протокола. Ниже приведён короткий пример такого диалога. Здесь символ | означает, что на этой строке приведено служебное сообщение программы telnet(1), > — строка которую мы вводим с клавиатуры, т.е. её клиент отсылает серверу, < — ответ сервера.

$ telnet mxs.mail.ru 25

| Trying 194.67.23.20...

| Connected to mxs.mail.ru.

| Escape character is '^]'.

< 220 Mail.Ru ESMTP

> HELO somewhere.org

< 250 mx8.mail.ru ready to serve

> QUIT

< 221 mx8.mail.ru closing connection

| Connection closed by foreign host.

Обратите внимание на фразу Escape character is '^]'. Если по каким-то причинам вы не можете дождаться ответа сервера и вам надо разорвать соединение, нажмите клавиши <Ctrl>+] и перед вами появится командная строка telnet(1). В ней вы можете набрать команду quit и завершить сеанс:

$ telnet mxs.mail.ru 25

Trying 194.67.23.20...

Connected to mxs.mail.ru.

Escape character is '^]'.

220 Mail.Ru ESMTP

^]

telnet> quit

Connection closed.

Работа с telnet(1) может быть неудобна тем, что вы не всегда можете отредактировать свой текст в случае ошибки, к тому же некоторые сервисы, расчитанные на работу с роботом могут завершить соединение по таймауту, если вы набираете команды недостаточно быстро. Наконец, telnet(1) невозможно использовать в скриптах.

Чтобы преодолеть эти недостатки, вместо telnet(1) можно использовать программу nc(1) (netcat). В следующем примере, мы делаем тоже, что и в предыдущем, но две команды SMTP (HELO example.org и QUIT) мы посылаем на стандартный ввод команде nc(1), а на STDOUT мы получаем ответы почтового сервера (вместо команды echo, использована команда printf(1), для того, чтобы напечатать команды HELO и QUIT на двух разных строках):

$ printf 'HELO example.org\nQUIT' | nc mxs.mail.ru 25

220 Mail.Ru ESMTP

250 mx19.mail.ru ready to serve

Конечно программой nc(1) можно пользоваться и интерактивно, если не назначить ей STDIN, она, как и положено любой UNIX программе, будет брать STDIN с клавиатуры:

$ nc msx.mail.ru 25

< 220 Mail.Ru ESMTP

> HELO somehere.ru

< 250 mx18.mail.ru ready to serve

> QUIT

< 221 mx18.mail.ru closing connection

В качестве примера скрипта использующего программу nc(1) приведём программу, которая пытается определить правильность некоторого адреса email. Приведённая программа первым делом разбирает адрес email, находя в нём часть отвечающую за имя сервера. Затем делает запрос к серверу DNS при помощи программы dig(1) определяя имя почтового сервера. И, наконец, при помощи nc(1) проводит диалог с этим сервером пытаясь при помощи команды SMTP RCPT определить существование почтового адреса на данной машине. Почтовый сервер на эту команду должен дать положительный ответ (код больше двухсот, но меньше трёхсот) и надпись <Recipient ok>. Но может и не дать никакого ответа по соображениям безопасности (смотря как настроен почтовый сервер). Тонкости работы команды dig(1) рассмотрены в Раздел 6.5, «Запрос к серверу DNS». Программирование в Bourne shell в Раздел 7.7, «Написание несложных Bourne-скриптов».

#!/bin/sh

if [ $# -lt 1 ]

then

echo "Usage mailtest.sh user@server"

exit 1

fi

# Вычленяем имя сервера из почтового адреса

server=`echo $1 | sed s/.*@//`

# Определяем почтовый сервер ответственный за передачу писем на

# сервер $server

mxserver=$( dig $server MX |\

egrep 'MX[[:space:]]+[0-9]+[[:space:]]+[^[:space:]]+\.' |\

sort -n -k5,5 |\

head -1 | awk '{print $6}' | sed 's/\.$//' )

echo Investigate: $1

echo Server: $server

echo MX server: $mxserver

# Пытаемся провести SMTP диалог с почтовым сервером

nc $mxserver 25 << EOF

HELO example.org

MAIL From: postmaster@example.org

RCPT To: $1

QUIT

EOF

Программа nc(1) штатно присутствует в FreeBSD и OpenBSD, а в DragonFly BSD и NetBSD её надо ставить отдельно, как сторонний продукт.

В Раздел C.2.1.6.4.3, «TCP proxy» можно найти пример в котором nc(1) используется в качестве прокси-сервера.