Чем открыть сокет linux

How to open a TCP/UDP socket in a bash shell

Suppose you want to open a TCP/UDP socket on a Linux server for various reasons. For example, you want to check if a specific address/port is reachable. Or you want to fetch a remote web page or invoke a restful API for testing. Or you want to connect to a remote IRC server, etc. However, what if the Linux server you are on is very restrictive? On that server, none of standard tools such as netcat , curl or wget may be available, and you are pretty much left with the bash shell only.

In fact, one of built-in features of bash shell is to open TCP/UDP sockets via /dev/tcp (and /dev/udp ) device file. In the rest of this tutorial, let’s find out how to open a TCP/UDP socket, and read to and write from the socket in bash shell.

Open or Close a TCP/UDP Socket in Bash Shell

In a nutshell, you can open a TCP/UDP socket using the following syntax in bash shell.

The file descriptor is a unique non-negative integer associated with each socket. File descriptors 0, 1 and 2 are reserved for stdin , stdout and stderr , respectively. Thus you must specify 3 or higher (whichever is unused) as a file descriptor.

Читайте также:  Dell vostro 3500 linux

The protocol field can be either tcp or udp. The host and port fields are self-explanatory.

For example, to open a bi-directional TCP socket for xmodulo.com with HTTP port and file descriptor 3 :

Once opened, a read/write socket can be closed using the following syntax. The first command close an input connection, while the latter closes an output connection.

Read from or Write to a TCP/UDP Socket in Bash Shell

Once a socket is opened, you can write a message to or read a message from the socket.

To write a message stored in $MESSSAGE to a socket:

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

To read a message from a socket and store it in $MESSAGE :

$ read -r -u -n $MESSAGE /dev/null)

TCP/UDP Socket Examples in Bash Shell

Here I present several shell script examples that open and use a TCP socket.

1. Fetch a remote web page and print its content.

#!/bin/bash exec 3<>/dev/tcp/xmodulo.com/80 echo -e "GET / HTTP/1.1rnhost: xmodulo.comrnConnection: closernrn" >&3 cat 

2. Display a remote SSH server version.

In fact, the above script can be shortened to the following one-liner:

3. Display the current time from nist.gov.

4. Check the Internet connectivity.

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

5. Perform TCP port scanning against a remote host.

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

Final Notes

Opening a socket in bash requires that the bash shell have net-redirections enabled (i.e., compiled with --enable-net-redirections ). Old distributions may have this feature disabled for bash , in which case you will encounter the following error.

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

Besides bash , socket support is known to be available in other shells such as ksh or zsh .

If you find this tutorial helpful, I recommend you check out the series of bash shell scripting tutorials provided by Xmodulo.

Support Xmodulo

This website is made possible by minimal ads and your gracious donation via PayPal or credit card

Please note that this article is published by Xmodulo.com under a Creative Commons Attribution-ShareAlike 3.0 Unported License. If you would like to use the whole or any part of this article, you need to cite this web page at Xmodulo.com as the original source.

Источник

Чем открыть сокет linux

Библиотека сайта rus-linux.net

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

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

По сути, вы можете открыть TCP-/UDP-сокет средствами командной оболочки bash, воспользовавшись следующей синтаксической конструкцией:

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

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

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

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

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

Прием и передача данных через TCP-/UDP-сокет средствами командной оболочки bash

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

Для передачи сообщения, хранящегося в переменной $MESSAGE , через сокет следует использовать одну из следующих команд:

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

Для чтения сообщения из сокета и сохранения его в переменной $MESSAGE — одну из следующих команд (в переменных $NUM_BYTES и $COUNT должны храниться числовые значения, равные количеству байт сообщения и количеству сообщений соответственно — прим.пер.):

$ read -r -u -n $MESSAGE /dev/null)

Примеры использования TCP-/UDP-сокетов при работе с командной оболочкой bash

Ниже я привел несколько примеров сценариев, в рамках которых создаются и используются 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 

2. Вывод информации о версии установленного на удаленном узле SSH-сервера

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

3. Вывод информации о текущем времени, полученной с веб-сайта nist.gov

4. Проверка работоспособности соединения с сетью Интернет

#!/bin/bash HOST=www.mit.edu PORT=80 (echo >/dev/tcp/$/$) &>/dev/null if [ $? -eq 0 ]; then echo "Соединение успешно установлено" else echo "Не удалось установить соединение" fi

5. Сканирование TCP-портов удаленного узла

#!/bin/bash host=$1 port_first=1 port_last=65535 for ((port=$port_first; port/dev/tcp/$host/$port) >/dev/null 2>&1 && echo "Порт $port открыт" done

Заключительные слова

Для получения возможности открытия сокетов средствами командной оболочки bash необходима активация механизма поддержки виртуальных файлов устройств сокетов на этапе сборки бинарного файла этой командной оболочки из исходных кодов (т.е., его сборки с активацией возможности "--enable-net-redirections" ). В устаревших версиях дистрибутивов данная возможность bash может быть деактивирована, причем в этом случае вы будете получать следующее сообщение об ошибке после каждой попытки открытия сокета:

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

Помимо командной оболочки bash, виртуальные устройства сокетов поддерживаются такими командными оболочками, как ksh и zsh.

Источник

Оцените статью
Adblock
detector