🕵️ Как читать данные из сокета на Bash |

🕵️ Как читать данные из сокета на Bash

Мануал

Командная строка Linux позволяет получать данные, прослушивая сокет или подключаясь к нему.

Данные могут быть записаны в текстовый файл.

Мы покажем вам, как это сделать.

Клиенты и серверы сокетов

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

Впервые они были реализованы в операционной системе Unix 4.2BSD, которая была создана в Калифорнийском университете в Беркли в 1983 году.

Они были быстро приняты в System V Unix и Microsoft Windows.

Сокет – это конечная точка программного сетевого соединения, абстрагированная таким образом, что ее можно рассматривать как файловый дескриптор.

Это означает, что она соответствует общему принципу проектирования Unix и Linux “все есть файл”.

Мы не имеем в виду физическую розетку на стене, в которую вы вставляете сетевой кабель.

Если программа подключается к сокету другой части программного обеспечения, она считается клиентом другой программы.

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

Эти термины используются независимо от других употреблений терминов “клиент” и “сервер” в мире ИТ.

Чтобы избежать путаницы, их иногда называют сокет-клиент и сокет-сервер, чтобы устранить двусмысленность.

Мы будем называть их клиентами и серверами.

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

Это хорошо, если вы программист, но что если нет?

Или, возможно, вы им являетесь, но ваш случай использования не требует написания приложения?

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

Инструменты

Программы, которые мы будем использовать, – это nc и ncat.

У этих двух утилит странные отношения.

Программа nc – это переписанная версия ncat, которая намного старше nc.

Но ncat тоже была переписана, и теперь она позволяет нам делать некоторые вещи, которые nc не может.

Существует множество реализаций ncat, который сам является производным от инструмента под названием netcat.

Кроме того, в большинстве дистрибутивов nc – это символическая ссылка на ncat, а не отдельная программа.

Мы проверили последние дистрибутивы Arch, Manjaro, Fedora и Ubuntu.

Единственный, который требовал установки инструментов, был Manjaro.

В Manjaro вам нужно установить пакет netcat, чтобы получить nc, но вы не получите ncat, вы получите netcat.

А в Manjaro nc – это символическая ссылка на netcat.

sudo pacman -S netcat

Суть в том, что на Manjaro используйте netcat, когда вы видите ncat в примерах в этой статье.

Прослушивание сокетов

Если программное обеспечение прослушивает входящие сокетные соединения, оно действует как сервер.

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

Мы можем легко воспроизвести это поведение с помощью nc.

Любые полученные данные отображаются в окне терминала.

Нам нужно указать nc прослушивать соединения, используя опцию -l (listen), и указать порт, на котором мы будем прослушивать соединения.

Любые клиентские программы или процессы, которые пытаются подключиться к данному экземпляру nc, должны использовать тот же порт.

Мы указываем nc, какой порт прослушивать, используя опцию -p (port).

Эта команда запускает nc как сокет-сервер, прослушивающий соединение на порту 6566:

nc -l -p 6566

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

Все, что отображается в nc, поступает от клиента.

Этот клиент посылает свое имя, а также пронумерованное сообщение, содержащее время и дату.

Когда клиент разрывает соединение, nc завершает работу, и вы возвращаетесь к приглашению терминала.

Отправка данных в файл

Чтобы собрать данные от клиента в файл, мы можем отправить вывод из nc в файл с помощью перенаправления.

Эта команда сохраняет полученные данные в файле под названием “logfile.txt”.

nc -l -p 6566 > logfile.txt

Вы не увидите никакого вывода – он идет в файл – и, как ни парадоксально, вы не будете знать, произошло ли соединение, пока nc не завершится.

Возврат в командную строку означает, что соединение произошло и было прервано клиентом.

less logile.txt

Затем вы можете прокручивать данные и осуществлять поиск с помощью встроенных функций less.

Отправка данных в файл и в окно терминала

Если вы хотите видеть прокрутку данных в окне терминала и одновременно отправлять их в файл, передайте вывод из nc в tee .

nc -l -p 6566 | tee logfile.txt

Прием нескольких подключений

Все это хорошо, но у этого есть ограничения.

Мы можем принимать только одно соединение.

Мы ограничены получением данных от одного клиента. К

роме того, когда клиент разрывает соединение, наш сокет-сервер nc завершает работу.

Если вам нужно принимать несколько соединений, мы должны использовать ncat.

Нам нужно указать ncat прослушивать и использовать определенный порт, как мы это делали с nc. Но мы также будем использовать опцию -k (keep alive).

Она указывает ncat продолжать работать и принимать соединения от клиентов, даже если последнее активное соединение разрывается.

Это означает, что ncat будет работать до тех пор, пока мы не завершим его нажатием клавиши Ctrl-C.

Новые соединения будут приниматься независимо от того, подключен ли ncat в данный момент к каким-либо клиентам или нет.

ncat -k -l -p 6566

Мы увидим, как данные от разных клиентов появляются в выводе ncat по мере их подключения.

Подключение к серверу

Мы также можем использовать nc в качестве клиента сокетов и подключиться к другой программе, которая принимает соединения и действует как сервер.

В этом сценарии nc является клиентом сокетов.

Для этого нам нужно указать nc, где в сети находится серверная программа.

Один из способов сделать это – указать IP-адрес и номер порта.

Если сервер находится на том же компьютере, на котором мы запускаем nc, мы можем использовать loopback IP-адрес 127.0.0.1.

Для указания адреса сервера и номера порта не используется никаких флагов.

Мы просто указываем соответствующие значения.

Чтобы подключиться к серверу на том же компьютере и использовать порт 6566, мы можем использовать IP-адрес loopback.

Команда для этого следующая:

nc 127.0.0.1 6566

Данные, которые nc получает с сервера, прокручиваются в окне терминала.

Если вам известно сетевое имя компьютера, на котором установлено серверное программное обеспечение, вы можете использовать его вместо IP-адреса.

nc itsecforu 6566

Используйте “Ctrl+C”, чтобы разорвать соединение.

Заключение

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

Перенаправление вывода в файл позволяет просмотреть вывод с помощью less и разобрать файл с помощью таких утилит, как grep.

см. также:

 

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

  1. аноним

    пишем про сетевые соединения в bash и ничего не пишем про “/dev/tcp/host/port” в bash – стыдоба…

    переименовать статью тогда надо, на “использование netcat”

    Ответить