Как читать данные из сокета в Bash в Linux
Опубликовано: 2022-06-28Командная строка Linux позволяет извлекать данные, прослушивая сокет или подключаясь к сокету. Данные могут быть захвачены в текстовом файле. Мы покажем вам, как это сделать.
Сокет-клиенты и серверы
Сокеты позволяют сетевому программному обеспечению обмениваться данными. Впервые они были реализованы в операционной системе 4.2BSD Unix, созданной в Калифорнийском университете в Беркли в 1983 году. Они были быстро приняты System V Unix и Microsoft Windows.
Сокет — это конечная точка программного сетевого соединения, абстрагированная таким образом, что ее можно рассматривать как дескриптор файла. Это означает, что он соответствует общему принципу проектирования 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
Суть в том, что на Manjaro используйте netcat
, когда вы видите ncat
в примерах в этой статье.
Прослушивание через сокет
Если программное обеспечение прослушивает входящие соединения сокетов, оно действует как сервер. Говорят, что любые данные, поступающие через сокетное соединение, принимаются сервером. Мы можем очень легко воспроизвести это поведение, используя nc
. Любые полученные данные отображаются в окне терминала.
Нам нужно указать nc
прослушивать соединения, используя опцию -l
(listen), и нам нужно указать порт, на котором мы собираемся прослушивать соединения. Любые клиентские программы или процессы, пытающиеся подключиться к этому экземпляру nc
, должны использовать тот же порт. Мы сообщаем nc
, какой порт прослушивать, используя опцию -p
(port).
Эта команда запускает nc
как сервер сокетов, прослушивая соединение через порт 6566:
нк -л -р 6566
Пока он ожидает входящего соединения, nc
ничего не выводит. После установления соединения любая полученная информация отображается в окне терминала. Здесь соединение установлено клиентской программой, которая идентифицирует себя как «клиент 1».
Все, что отображается nc
, получено от клиента. Этот клиент отправляет свое имя и пронумерованное сообщение, содержащее время и дату.
Когда клиент разрывает соединение, nc
завершается, и вы возвращаетесь к приглашению терминала.
Отправка данных в файл
Чтобы захватить данные от клиента в файл, мы можем отправить вывод из nc
в файл, используя перенаправление. Эта команда сохраняет полученные данные в файл с именем «logfile.txt».
nc -l -p 6566 > файл журнала.txt
Вы не увидите никакого вывода — он попадает в файл — и, как это ни парадоксально, вы не узнаете, произошло ли соединение, пока nc
не завершится. Возврат в командную строку означает, что соединение было установлено и было прервано клиентом.
Мы можем использовать less
для просмотра содержимого файла «logfile.txt».
меньше logile.txt
Затем вы можете прокручивать данные и выполнять поиск, используя встроенные функции less.
СВЯЗАННЫЕ С: Как использовать команду less в Linux
Отправка данных в файл и окно терминала
Если вы хотите, чтобы данные прокручивались в окне терминала и одновременно отправлялись в файл, направьте вывод из nc
в tee
.
нк -л -р 6566 | тройник logfile.txt
Принятие нескольких подключений
Все это хорошо, но есть ограничения. Мы можем принять только одно соединение. Мы ограничены получением данных от одного клиента. Кроме того, когда этот клиент разрывает соединение, наш сервер сокетов nc
прекращает работу.
Если вам нужно принять несколько подключений, нам нужно использовать ncat
. нам нужно указать ncat
слушать и использовать определенный порт, как мы это делали с nc
. Но мы также будем использовать опцию -k
(оставить в живых). Это говорит ncat
продолжать работать и принимать соединения от клиентов, даже если последнее активное соединение обрывается.
Это означает, что ncat
будет работать до тех пор, пока мы не решим остановить его с помощью «Ctrl-C». Новые подключения будут приниматься независимо от того, подключен ли ncat
в данный момент к каким-либо клиентам или нет.
ncat -k -l -p 6566
Мы можем видеть данные от разных клиентов, появляющиеся в выводе ncat
по мере их подключения.
Подключение к серверу
Мы также можем использовать nc
в качестве клиента сокета и подключиться к другой программе, которая принимает соединения и действует как сервер. В этом сценарии nc
является клиентом сокета. Для этого нам нужно сообщить nc
, где в сети находится серверное программное обеспечение.
Один из способов сделать это — указать IP-адрес и номер порта. Если сервер находится на том же компьютере, на котором мы запускаем nc
, мы можем использовать петлевой IP-адрес 127.0.0.1. Не то, чтобы не было никаких флагов, используемых для указания адреса сервера и номера порта. Мы просто предоставляем соответствующие значения.
Чтобы подключиться к серверу на том же ПК и использовать порт 6566, мы могли бы использовать петлевой IP-адрес. Команда для использования:
нк 127.0.0.1 6566
Данные, которые nc
получает с сервера, прокручиваются в окне терминала.
Если вы знаете сетевое имя компьютера, на котором запущено серверное программное обеспечение, вы можете использовать его вместо IP-адреса.
Северная Каролина Сулако 6566
Используйте «Ctrl + C», чтобы разорвать соединение.
Быстро и просто
nc
и ncat
всем требованиям, когда вы не хотите писать собственный обработчик сокетов, но вам нужно собирать данные из какого-либо источника с поддержкой сокетов. Перенаправление вывода в файл позволяет просмотреть вывод с помощью less
и проанализировать файл с помощью таких утилит, как grep
.
СВЯЗАННЫЕ С: Как использовать команду grep в Linux