Как открыть сокет TCP / UDP в оболочке bash |

Как открыть сокет TCP / UDP в оболочке bash

Мануал

Предположим, вы хотите открыть сокет TCP / UDP на сервере Linux по разным причинам.

Например, вы хотите проверить, доступен ли конкретный адрес / порт.

Или вы хотите получить удаленную веб-страницу или вызвать спокойный API для тестирования.

Или вы хотите подключиться к удаленному IRC-серверу и т. д.

Однако, что если ваш Linux-сервер очень ограничен?

На этом сервере ни один из стандартных инструментов, таких как netcat, curl или wget, может быть недоступен, и у вас остается только оболочка bash.

Фактически, одной из встроенных функций оболочки bash является открытие сокетов TCP / UDP через файл устройства /dev/tcp (и /dev/udp).

В оставшейся части этого руководства мы узнаем, как открыть сокет TCP / UDP, а также выполнять чтение и запись из сокета в оболочке bash.

Открыть или закрыть сокет TCP / UDP в Bash Shell

В двух словах, вы можете открыть сокет TCP / UDP, используя следующий синтаксис в оболочке bash.

$ exec {file-descriptor}<>/dev/{protocol}/{host}/{port}

«file descriptor» – это уникальное неотрицательное целое число, связанное с каждым сокетом.

Файловые дескрипторы 0, 1 и 2 зарезервированы для stdin, stdout и stderr соответственно.

Таким образом, вы должны указать 3 или выше (в зависимости от того, что не используется) в качестве дескриптора файла.

«<>» означает, что сокет открыт как для чтения, так и для записи. В зависимости от ваших потребностей, вы можете открыть сокет только для чтения (<) или только для записи (>).

Поле «protocol» может быть как tcp, так и udp. Поля “host” и “port” не требуют пояснений.

Например, чтобы открыть двунаправленный сокет TCP для xmodulo.com с HTTP-портом и файловым дескриптором 3:

$ exec 3<>/dev/tcp/xmodulo.com/80

После открытия сокета для чтения / записи он может быть закрыт с использованием следующего синтаксиса.

Первая команда закрывает входное соединение, а вторая закрывает выходное соединение.

$ exec {file-descriptor}<&-
$ exec {file-descriptor}>&-

Чтение или запись в сокет TCP / UDP в Bash Shell

После открытия сокета вы можете написать или прочитать сообщение из сокета.

Чтобы записать сообщение, хранящееся в $MESSSAGE, в сокет:

$ echo -ne $MESSAGE >&3
$ printf $MESSAGE >&3

Чтобы прочитать сообщение из сокета и сохранить его в $MESSAGE:

$ read -r -u -n $MESSAGE <&3
$ MESSAGE=$(dd bs=$NUM_BYTES count=$COUNT <&3 2> /dev/null)

Примеры сокетов TCP / UDP в Bash Shell

Здесь я представляю несколько примеров скриптов оболочки, которые открывают и используют сокет TCP.

1. Получить удаленную веб-страницу и вывести ее содержимое

#!/bin/bash
exec 3<>/dev/tcp/xmodulo.com/80
echo -e "GET / HTTP/1.1\r\nhost: xmodulo.com\r\nConnection: close\r\n\r\n" >&3
cat <&3

2. Показать версию удаленного SSH-сервера

#!/bin/bash
exec 3</dev/tcp/192.168.0.10/22
timeout 1 cat <&3

Фактически, приведенный выше скрипт может быть сокращен до следующей строки:

#!/bin/bash
timeout 1 cat </dev/tcp/192.168.0.10/22

3. Отображение текущего времени от nist.gov

#!/bin/bash
cat </dev/tcp/time.nist.gov/13

4. Проверить интернет-соединение

#!/bin/bash
 
HOST=www.mit.edu
PORT=80
 
(echo >/dev/tcp/${HOST}/${PORT}) &>/dev/null
if [ $? -eq 0 ]; then
    echo "Connection successful"
else
    echo "Connection unsuccessful"
fi

5. Выполните сканирование порта TCP на удаленном хосте.

#!/bin/bash
host=$1
port_first=1
port_last=65535
for ((port=$port_first; port<=$port_last; port++))
do
  (echo >/dev/tcp/$host/$port) >/dev/null 2>&1 && echo "$port open"
done

Финальные заметки

Для открытия сокета в bash необходимо, чтобы в оболочке bash было включено сетевое перенаправление (т. е. Скомпилировано с помощью «–enable-net-redirections»).

В старых дистрибутивах эта функция может быть отключена для bash, и в этом случае вы столкнетесь со следующей ошибкой

/dev/tcp/xmodulo.com/80: No such file or directory

Помимо bash, поддержка сокетов доступна и в других оболочках, таких как ksh или zsh.

Источник xmodulo.com

Пожалуйста, не спамьте и никого не оскорбляйте. Это поле для комментариев, а не спамбокс. Рекламные ссылки не индексируются!
Добавить комментарий

  1. человек

    Дружище, ты как будто сам для себя это написал. В качестве учебного материала это никуда не годится. Просто примеры запросов которые выполняют какие-то операции, никакой раскладки о том, какой элемент что значит нет. Фуфло.

    Ответить
    1. cryptoparty автор

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

      Ответить
  2. mikkos

    это просто перевод без указания источника

    Ответить
    1. cryptoparty автор

      указали

      Ответить