Тестування віддаленого порту TCP за допомогою telnet за допомогою однорядкової команди


12

У мене є численні вікна Linux з дуже обмеженим набором команд і дисковим простором. Але на ньому є telnetкоманда.

Я віддалено підключаюся до кожної з цих зондів (програмно) і видаю одну команду для linux-лінії через SSH.

Мені потрібно запустити одну команду, щоб підключитися до певної машини, використовуючи telnet, а потім відразу відключитися .

Я можу все це зробити, але відключення відразу ж . Telnet відкриває якусь консоль чи термінал, і я не можу визначити однорядну команду для запуску команди telnet, а потім відключення.

Якщо я це зробив, я можу легко розібрати текстовий висновок для повідомлень про помилки за неможливість підключення до машини на вказаному порту, і саме це я шукаю.

Тож як я можу запустити однорядкову команду для підключення до машини за допомогою telnet та відключення після цього?


Як я розумію, ваш клієнт Telnet не підтримує надсилання безпосередньо?
IBr

@IBr, що ти маєш на увазі?
Мухаммед Гелбана

Зауважте, що клієнтські оператори розрізняються в коді виходу, повідомленому після того, як команда виходу з боку клієнта використовується для його припинення. Тому нульовий код виходу не слід вважати сигналом, через який порт відкрито. Принаймні, не працює для RPEL телеметра 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

Це прекрасно працює! Хоча вихід дійсно переспрямований, я помітив, що все ще отримую "З'єднання закрите іноземним хостом". вихід у мою консоль після сну, а не у файл output.log. Будь-який спосіб запобігти цьому?
дан

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

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/


Я зараз намагаюся встановити netcat, але мені це не вдається. Я завантажив компільовану версію powerpc, але бібліотека glibc відсутня. Я завантажив компільовану версію powerpc, але у пристрою не було достатньо місця для копіювання файлів бібліотеки! Чи можливо, що бібліотека glibc вже існує, але netcat не може її знайти?
Мухаммед Гелбана

Netcat потрібен лише на стороні клієнта: на сервері (зонді) може бути той самий звичайний старий telnet.
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

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ігнорувати файл / etc / hosts ( nslookup, dig, firefox ignoering / etc / hosts файли ).

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

nc -w 3 -s 192.168.1.12 example.com 8080

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.