Тестирование удаленного TCP-порта с использованием telnet с помощью однострочной команды

12

У меня есть множество Linux-коробок с очень ограниченным набором команд и дискового пространства. Но у него есть telnetкоманда.

Я удаленно подключаюсь к каждому из этих зондов (программно) и выдаю одну команду line linux через SSH.

Мне нужно выполнить одну команду, чтобы подключиться к определенной машине, используя telnet, а затем сразу отключиться .

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

Если я сделаю это, я смогу легко разобрать текстовый вывод на наличие сообщений об ошибках, так как я не могу подключиться к машине через указанный порт, и это именно то, что я ищу.

Итак, как я могу запустить однострочную команду для подключения к машине с помощью telnet и последующего отключения?

Мухаммед Гелбана
источник
Как я понимаю ваш клиент Telnet не поддерживает отправку напрямую?
IBr
@IBr, что ты имеешь в виду?
Мухаммед Гелбана
Обратите внимание, что клиенты Telent различаются по коду выхода, сообщаемому после использования команды выхода на стороне клиента для его завершения. Поэтому нулевой код выхода не должен рассматриваться как сигнал, что порт открыт. Не работает для RHEL telent RPM по крайней мере.
Оливер Гонджа,

Ответы:

28

Вы должны быть в состоянии передать exitкоманду в STDIN telnet. Пытаться:

echo 'exit' | telnet {site} {port}

и посмотреть, если это работает. (кажется, работает на моем веб-сервере, но YMMV).

Чарльз Ньюи
источник
может работать, но кажется глупым - у telnet должна быть возможность выхода или что-то при первом контакте
Александр Миллс
10

Самый простой и легкий способ приведен ниже.

 sleep <n> | telnet <server> <port>

n - Время ожидания в секундах до автоматического выхода. Это может быть дробным, как 0,5. Обратите внимание, что некоторые требуемые выходные данные не могут быть возвращены в указанное время ожидания. Таким образом, нам, возможно, потребуется увеличить соответственно.

сервер - IP-адрес или имя хоста целевого сервера.

порт - Номер целевого сервисного порта.

Вы также можете перенаправить вывод в файл, как это,

sleep 1 | telnet <server> <port> > output.log
Seff
источник
Это работает отлично! В то время как вывод действительно перенаправлен, я заметил, что я все еще получаю «Соединение закрыто внешним хостом». вывод в моей консоли после сна, а не в файле output.log. Есть ли способ предотвратить это?
19
5

В моем случае это работает. (CentOS 7):

while read host port; do
r=$(bash -c 'exec 3<> /dev/tcp/'$host'/'$port';echo $?' 2>/dev/null)
if [ "$r" = "0" ]; then
     echo "$host $port is open"
else
     echo "$host $port is closed"
     exit 1 # To force fail result in ShellScript
fi
done
Chuss
источник
1
Эй, это здорово. Я являюсь пользователем всех систем Linux на своей работе, но не администратор (и не имею прав администратора). Мне надоело постоянно просить их установить telnet, чтобы я мог проверить сетевое соединение (я сетевой инженер). Это отличный обходной путь. Я немного изменил его, чтобы больше походить на telnet. Я предоставил свой ответ здесь с изменениями.
theglossy1
3

Я думаю, что лучшим инструментом для прямой отправки команд и получения результатов будет netcat. Это просто простой, но мощный инструмент для ввода команд через порты. Вы можете увидеть пример использования в этом вопросе суперпользователя: /superuser/261900/how-can-i-pipe-commands-to-a-netcat-that-will-stay-alive - asker дает рабочий пример в котором соединение закрывается через несколько секунд.

И если вы хотите просто проверить подключение, используйте это: http://terminalinflection.com/use-netcat-not-telnet-to-test-network-connectivity/

IBr
источник
Я пытаюсь установить Netcat прямо сейчас, но я не могу это сделать. Я скачал скомпилированную версию powerpc, но библиотека glibc отсутствовала. Я скачал скомпилированную версию powerpc, но на устройстве не хватило места для копирования файлов библиотеки! Возможно ли, что библиотека glibc уже существует, но netcat не может ее найти?
Мухаммед Гелбана
Netcat нужен только на стороне клиента: на сервере (зонд) может быть такой же обычный старый телнет.
IBr
Также Glibc должен уже существовать, он используется для многих вещей в обычной системе.
IBr
Вы можете попытаться добавить в сценарии telnet, чтобы && exitувидеть, отключается ли он (в ssh по крайней мере этого достаточно).
IBr
&& exitне работал Если glibc должен существовать, и я верю, что он существует. Зачем nc.traditionalжаловаться на это, как будто это отсутствует?
Мухаммед Гелбана
1

Это еще одна версия ответа выше, которая делает его немного более похожим на «обычный» синтаксис telnet. Если вам нравится мой ответ, пожалуйста, дайте оценку не этому, а оригиналу.

#!/bin/bash
if [ "$2" == "" ]; then
 echo "Syntax: $0 <host> <port>"
 exit;
fi

host=$1
port=$2

r=$(bash -c 'exec 3<> /dev/tcp/'$host'/'$port';echo $?' 2>/dev/null)
if [ "$r" = "0" ]; then
     echo "$host $port is open"
else
     echo "$host $port is closed"
     exit 1 # To force fail result in ShellScript
fi
theglossy1
источник
1

Вот решение, которое я нашел в Интернете:

( echo open 127.0.0.1 23
sleep 5
echo your_login
sleep 5
echo your_password
sleep 5
echo hostname
sleep 5
echo exit ) | telnet

У меня работает на SunOS & HP-UX

Владимир
источник
0

Пытаться

echo -e '\x1dclose\x0d' | telnet {HOSTNAME} {PORT}

Лучшая часть выше, вы также получаете статус выхода. Если telnet успешен, код выхода будет 0 или 1

Абхишек Кумар
источник
0

Избегайте использования netcat, если у вас есть собственные маршруты, так как он не подчиняется правилам маршрутизации. Подобно тому , как nslookup, digи hostигнорировать / и т.д. / хост файл ( записей Nslookup, роют, светлячок игнорирование / и т.д. / хост файл ).

То есть: в отличие от приложений и инструментов, таких как telnetи /dev/tcp( тестирование удаленного порта TCP с помощью telnet с помощью команды, состоящей из одной строки ), которые следуют правилам маршрутизации системы, ncиспользует шлюз по умолчанию, если не указано иное использовать исходный IP-адрес с -s:

nc -w 3 -s 192.168.1.12 example.com 8080

Мне нужно было проверить, может ли приложение получить доступ к ресурсу, и если маршруты не работают, netcatсообщили, что все в порядке, так как адрес источника был указан в тесте. Я перехожу на использование /dev/tcp.

legatoproteus
источник