Поиск по сайту:

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


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

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

Сокеты позволяют сетевому программному обеспечению обмениваться данными. Впервые они были реализованы в операционной системе 4.2BSD Unix, созданной в Калифорнийском университете в Беркли в 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 (прослушивание), и нам нужно указать порт, на котором мы собираемся прослушивать подключения. Любые клиентские программы или процессы, пытающиеся подключиться к этому экземпляру nc, должны использовать один и тот же порт. Мы сообщаем nc, какой порт прослушивать, используя параметр -p (port).

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

nc -l -p 6566

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

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

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

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

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

nc -l -p 6566 > logfile.txt

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

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

less logile.txt

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

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

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

nc -l -p 6566 | tee 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-адрес. Команда для использования:

nc 127.0.0.1 6566

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

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

nc sulaco 6566

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

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

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