Перевірте, чи активний порт telnet в сценарії оболонки


11

Я намагаюся створити сценарій, щоб перевірити, чи можна ввійти через telnet. Я не хочу дійсно входити в систему; тому очікувати не потрібно. Я просто хочу перевірити, чи зможу я отримати підказку для входу. Це робиться в системі Linux, тому я намагався використовувати nc:

nc 192.168.10.5 23 -w 1 | grep -q login 
if [ $? -eq 1 ]
then
    echo "console is down"
fi

Проблема полягає в тому, що це призводить до блокування моєї консолі. Здається, що -wце насправді не перериває зв’язок.

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

\echo "\035" | telnet 192.168.10.5

перерви, перш ніж я отримаю запит на вхід.


Можливий дублікат superuser.com/questions/621870/…
vschum

Відповіді:


14

Bash пропонує псевдопристрої, з якими ви, ймовірно, знайомі /dev/null. Однак існують і інші пристрої, такі як /dev/tcpі /dev/udpдля тестування мережевих з'єднань, які ви також можете використовувати в межах сценаріїв Bash.

уривок зі сторінки чоловіка Баша

Bash обробляє кілька імен файлів спеціально, коли вони використовуються у перенаправленнях, як описано в наступній таблиці:

          /dev/fd/fd
                 If fd is a valid integer, file descriptor fd is duplicated.
          /dev/stdin
                 File descriptor 0 is duplicated.
          /dev/stdout
                 File descriptor 1 is duplicated.
          /dev/stderr
                 File descriptor 2 is duplicated.
          /dev/tcp/host/port
                If  host  is a valid hostname or Internet address, and port 
                is an integer port number or service name, bash attempts to 
                open a TCP connection to the corresponding socket.
          /dev/udp/host/port
                If host is a valid hostname or Internet address, and port 
                is an integer port number or service name, bash attempts to 
                open a  UDP  connection to the corresponding socket.

Приклад

Ось я тестую підключення до хоста в моєму домені з назвою skinner і бачу, чи можу я підключитися до його порту 22.

ПРИМІТКА: Порт 22 призначений для SSH, для порту 23 використовується telnet.

$ echo > /dev/tcp/skinner/22 && echo "it's up" || echo "it's down"
it's up

Чудово, тож давайте спробуємо не порту:

$ echo > /dev/tcp/skinner/223 && echo "it's up" || echo "it's down"
bash: connect: Connection refused
bash: /dev/tcp/skinner/223: Connection refused
it's down

Добре, що це працює, але це жахливо негарно. Не хвилюватися. Ви можете запустити echo > /dev/tcp/...в підпакеті і перенаправити весь результат, щоб /dev/nullтрохи очистити його. Ось шаблон, який ви можете використовувати у своїх скриптах оболонки:

$ (echo > /dev/tcp/skinner/22) > /dev/null 2>&1 \
    && echo "it's up" || echo "it's down"
it's up

$ (echo > /dev/tcp/skinner/223) > /dev/null 2>&1 \
    && echo "it's up" || echo "it's down"
it's down

Якщо ви спеціально хочете протестувати telnet, то це за замовчуванням працює на порту 23, тож там, де slm використовує 22 та 223, використовуйте 23.
Warwick

@Warwick - дякую, я додав це як примітку до розділу прикладів.
slm

@sim дякую за коментар. Я бачив це раніше, але мені не вдалося змусити його працювати. Моє питання полягає в тому, що мені потрібно мати змогу зіткнутися або перевірити на запит на вхід. У цьому випадку консоль замикається і немає запиту на вхід. # telnet 192.168.10.5 Trying 192.168.10.5... Connected to 192.168.10.5 (192.168.10.5). Escape character is '^]'. Connection closed by foreign host.
rleon

# cat < /dev/tcp/192.168.10.12/23 дає мені запит на вхід, але я не в змозі вийти з нього.
rleon

1
вау .. багато перенаправлення там. # cat afile ^] після запуску це просто повторює перерву на afile. Досі граю з цим, але я відчуваю, що я майже там.
rleon

7

Ви на правильному шляху, використовуючи nc, але якщо ви дійсно хочете просто перевірити, чи можете ви встановити з'єднання, використовуйте перемикач nc-z :

#!/bin/bash
REMOTEHOST=10.11.12.13
REMOTEPORT=1234
TIMEOUT=1

if nc -w $TIMEOUT -z $REMOTEHOST $REMOTEPORT; then
    echo "I was able to connect to ${REMOTEHOST}:${REMOTEPORT}"
else
    echo "Connection to ${REMOTEHOST}:${REMOTEPORT} failed. Exit code from Netcat was ($?)."
fi

це працює не у всіх системах, у мого ПК немає прапора -z
Shapeshifter

Цікаво. Яка це версія nc?
DopeGhoti

Я на CentOS 7, і nc був замінений на nmap-ncat, у якого немає такого варіанта :(
Shapeshifter

Якщо я пам'ятаю правильно, пакет, який ви хочете в CentOS, просто nc.
DopeGhoti

nc nmap-ncat in centos 7
Shapeshifter

2

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

Те, що бракувало у вашому початковому відлунні, було перемикачем -e:

   -e     enable interpretation of backslash escapes
   -E     disable interpretation of backslash escapes (default)

І новий рядок + команда quit, щоб вийти з telnet після відключення. Як такий:

echo -e '\035\nquit' | telnet 10.0.0.1 23 && echo "success" || echo "failed"

Очевидно те саме буде працювати, якщо ви використовуєте стиль блоку, якщо оператор і оцінюєте $? як ви робили спочатку:

echo -e '\035\nquit' | telnet 10.0.0.1 23
if [ $? -eq 1 ]
then
  echo "Console is down."
fi

Поки ми на це, наскільки nc йде, це залежить від того, який аромат nc у вас є (gnu ncat vs nmap-ncat). Gnu матиме перемикач -z:

  -z                         Zero-I/O mode, report connection status only
nc -z 10.0.0.1 23
# (evaluate $? here)

в той час як інший не буде, і вам доведеться передати порожній рядок на ваш nc, щоб він не застряг:

echo | nc 10.0.0.1 23
# (evaluate $? here)

1

запустити nc -z 192.168.10.5 23в командному рядку або створити сценарій bash для запуску цієї команди.

Він повертає заяву нижче, якщо з'єднання вдале.

Підключення до 192.168.10.5 23 порт [tcp / *] вдалося!

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