Как открыть TCP-/UDP-сокет средствами командной оболочки

Здесь будут размещаться ссылки и отзывы на интересные публикации по Linux

Модераторы: Olej, vikos

Правила форума
Запрещается помещать сообщения, не имеющие отношения к обсуждаемой статье. Все такие сообщения будут удаляться непосредствено после обнаружения.
Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Как открыть TCP-/UDP-сокет средствами командной оболочки

Непрочитанное сообщение Olej » 30 окт 2016, 16:36

Как открыть TCP-/UDP-сокет средствами командной оболочки bash
Оригинал: How to open a TCP/UDP socket in a bash shell
Автор: Dan Nanni
Дата публикации: 24 мая 2016 г.
Перевод: А.Панин
Дата перевода: 23 июля 2016 г.
Смешная такая статья...
Но может иногда оказаться полезным такой приём.
По сути, вы можете открыть TCP-/UDP-сокет средствами командной оболочки bash, воспользовавшись следующей синтаксической конструкцией:

$ exec {дескриптор-файла}<>/dev/{протокол}/{адрес-узла}/{номер-порта}

Вместо строки "дескриптор-файла" следует использовать уникальные неотрицательные целочисленные идентификаторы (дескрипторы), которые будут ассоциированы с каждым из создаваемых сокетов. Файловые дескрипторы 0, 1 и 2 зарезервированы за стандартными потоками ввода (stdin), вывода (stdout) и ошибок (stderr) соответственно. Исходя из этого, вы должны использовать значения, начиная с 3 (которые не используются) в качестве файловых дескрипторов.

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

В поле "протокол" может располагаться строка "tcp", либо "udp". Назначение полей "адрес-узла" и "номер-порта" не требует особых комментариев.

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

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

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

$ exec {дескриптор-файла}<&-
$ exec {дескриптор-файла}>&-
И примеры применения для конкретных случаев ... см. там в тексте.
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
и т.д.

Ответить

Вернуться в «Публикации, книги и обсуждения»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 13 гостей