Как читать данные из сокета в Bash в Linux

Опубликовано: 2022-06-28
Двоичный код, проходящий через оптические кабели.
XYZ/Shutterstock.com

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

Сокет-клиенты и серверы

Сокеты позволяют сетевому программному обеспечению обмениваться данными. Впервые они были реализованы в операционной системе 4.2BSD Unix, созданной в Калифорнийском университете в Беркли в 1983 году. Они были быстро приняты System V Unix и Microsoft Windows.

Что означает «Все является файлом» в Linux?
СВЯЗАННЫЕ С : Что означает «Все является файлом» в Linux?

Сокет — это конечная точка программного сетевого соединения, абстрагированная таким образом, что ее можно рассматривать как дескриптор файла. Это означает, что он соответствует общему принципу проектирования Unix и Linux: «все является файлом». Мы не имеем в виду физическую розетку на стене, в которую вы подключаете сетевой кабель.

Если программа подключается к сокету другого программного обеспечения, она считается клиентом другого программного обеспечения. Программное обеспечение, которое позволяет другому программному обеспечению запрашивать соединения, называется сервером . Эти термины используются независимо от других вариантов использования клиента и сервера в мире ИТ. Чтобы избежать путаницы, их иногда называют клиентом сокетов и сервером сокетов, чтобы устранить двусмысленность. Мы будем называть их клиентами и серверами.

Сокеты реализованы как интерфейс прикладного программирования (API), позволяющий разработчикам программного обеспечения вызывать функциональные возможности сокетов из своего кода. Хорошо, если вы программист, но что, если нет? Или, возможно, да, но ваш вариант использования не требует написания приложения? Linux предоставляет инструменты командной строки, которые позволяют вам использовать — базовые — сокет-серверы и сокет-клиенты, в соответствии с вашими потребностями, для извлечения или получения данных из других процессов, поддерживающих сокеты.

СВЯЗАННЫЕ С: Что такое API и как их используют разработчики?

Отношения никогда не бывают легкими

Мы будем использовать программы 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 

Установка пакета netcat на Manjaro

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

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

Если программное обеспечение прослушивает входящие соединения сокетов, оно действует как сервер. Говорят, что любые данные, поступающие через сокетное соединение, принимаются сервером. Мы можем очень легко воспроизвести это поведение, используя nc . Любые полученные данные отображаются в окне терминала.

Нам нужно указать nc прослушивать соединения, используя опцию -l (listen), и нам нужно указать порт, на котором мы собираемся прослушивать соединения. Любые клиентские программы или процессы, пытающиеся подключиться к этому экземпляру nc , должны использовать тот же порт. Мы сообщаем nc , какой порт прослушивать, используя опцию -p (port).

Эта команда запускает nc как сервер сокетов, прослушивая соединение через порт 6566:

 нк -л -р 6566 

запуск nc в качестве сервера сокетов

Пока он ожидает входящего соединения, nc ничего не выводит. После установления соединения любая полученная информация отображается в окне терминала. Здесь соединение установлено клиентской программой, которая идентифицирует себя как «клиент 1».

nc получает данные от клиента

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

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

nc завершается после отключения от клиентской стороны

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

Чтобы захватить данные от клиента в файл, мы можем отправить вывод из nc в файл, используя перенаправление. Эта команда сохраняет полученные данные в файл с именем «logfile.txt».

 nc -l -p 6566 > файл журнала.txt 

Перенаправление вывода из nc в текстовый файл

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

Мы можем использовать less для просмотра содержимого файла «logfile.txt».

 меньше logile.txt 

Использование less для проверки текстового файла

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

Просмотр захваченного вывода из nc в less

СВЯЗАННЫЕ С: Как использовать команду less в Linux

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

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

 нк -л -р 6566 | тройник logfile.txt 

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

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

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

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

Это означает, что ncat будет работать до тех пор, пока мы не решим остановить его с помощью «Ctrl-C». Новые подключения будут приниматься независимо от того, подключен ли ncat в данный момент к каким-либо клиентам или нет.

 ncat -k -l -p 6566 

прослушивание нескольких соединений с помощью ncat

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

Второй и третий клиенты, подключающиеся к ncat

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

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

Один из способов сделать это — указать IP-адрес и номер порта. Если сервер находится на том же компьютере, на котором мы запускаем nc , мы можем использовать петлевой IP-адрес 127.0.0.1. Не то, чтобы не было никаких флагов, используемых для указания адреса сервера и номера порта. Мы просто предоставляем соответствующие значения.

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

 нк 127.0.0.1 6566 

Использование nc в качестве сокет-клиента

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

Получение данных с сервера сокетов с помощью nc

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

 Северная Каролина Сулако 6566 

Использование nc для подключения к серверу сокетов с использованием имени ПК, на котором работает сервер

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

Быстро и просто

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

СВЯЗАННЫЕ С: Как использовать команду grep в Linux