Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Odczytanie treści pakietu UDP w bashu

3 views
Skip to first unread message

heby

unread,
Mar 2, 2021, 2:35:14 PM3/2/21
to
Cześć.

Input: broadcastowy pakiet UDP na jakiś port z treścią będącą znakami ascii.

Output zmienna w bashu zawierajaca tą treść.

Teraz detale: jest urządzenie które wysyła swój stan w postaci pakietu
UDP na ff:ff:ff:ff:ff:ff 255.255.255.255:<port>.

Pakiet zawiera dosłownie jedno słowo typu "ON", "ERROR 7" itd. bez
żadnej struktury, ciało pakietu to znaki ASCII razem z zerem.

Na urządzenie które je emituje nie mam wpływu, ktoś to tak zrobił i tyle.

Chciałbym "przyczaić" się na ten pakiet w bashu, a nastepnie, jesli
przyjdzie, wydłubać z niego treść i zwrócić w formie zmiennej/env. Mogę
przeoczyć pakiety, to nie jest krytyczne.

Nie ma tu żadnych zagadnień bezpieczeństwa, to nie jest otwarta sieć, to
taki komplenie zamknięty LAN bez dostępu z zewnątrz.

Dopuszczam użycie Pythona, ale zanim go użyje: czym mogę zrealizować
powyższe zadanie czymś prostym z konsoli?

Widzę to tak: czekanie - netcat
Parsowanie outputu z pakietu - hmmm awk lub jakiś gotowiec typu readline?

Ma ktoś lepszy pomysł?

Zerkałem za pomysłami tutaj:

https://stackoverflow.com/questions/24247811/listen-for-returning-udp-packets-in-bash

Ale jak ktoś ma coś jeszcze...

Dominik Ałaszewski

unread,
Mar 3, 2021, 2:43:04 AM3/3/21
to
Dnia 02.03.2021 heby <he...@poczta.onet.pl> napisał/a:

> Dopuszczam użycie Pythona, ale zanim go użyje: czym mogę zrealizować
> powyższe zadanie czymś prostym z konsoli?

_Ja_ bym użył czegoś w rodzaju tcpdump -A udp port 12345
i zapisywał do pliku. A pliku pilnowałbym mechanizmem
kernelowym iwatch (np. za pomocą incron)- gdy się zmieni
(tcpdump załapie jakiś pakiet) odpalał skrypt, który sparsuje
go i podejmie stosowną akcję.

Jeśli to 1 akcja na jakiś czas, to pewnie wystarczy wpisać
zawartość pliku jako zmienną w bashu, porównywać,
czy zawiera stosowny ciąg (coś w rodzaju
if [[ $string == *"ERROR"* ]]; then ) i wtedy
podejmować akcję.

Można na koniec zerować plik, albo skrypt może
sobie przechowywać poprzednią zawartość i analizować
tylko bieżącą różnicę- wtedy dodatkowo jest historia.

--
Dominik Ałaszewski (via raspbianowy slrn)
"W życiu piękne są tylko chwile…" (Ryszard Riedel)
Wyrażam wyłącznie prywatne poglądy zgodnie z Art. 54 Konstytucji RP
Pisząc na priv zmień domenę na gmail.

Mateusz Viste

unread,
Mar 3, 2021, 3:00:36 AM3/3/21
to
2021-03-02 o 20:35 +0100, heby napisał:
> Pakiet zawiera dosłownie jedno słowo typu "ON", "ERROR 7" itd. bez
> żadnej struktury, ciało pakietu to znaki ASCII razem z zerem.

A czy nie prościej zrobić to jak człowiek, w formie normalnego
programu nasłuchującego na porcie? To kwestia kilkunastu - no
może kilkudziesięciu - linijek w C. W googielu można nawet znaleźć
gotowce: https://lloydrochester.com/post/c/unix-udp-example/

Mateusz

heby

unread,
Mar 3, 2021, 3:54:43 AM3/3/21
to
On 03/03/2021 09:00, Mateusz Viste wrote:
>> Pakiet zawiera dosłownie jedno słowo typu "ON", "ERROR 7" itd. bez
>> żadnej struktury, ciało pakietu to znaki ASCII razem z zerem.
> A czy nie prościej zrobić to jak człowiek, w formie normalnego
> programu nasłuchującego na porcie?

Można, problem w tym że nie ja będę to "utrzymywał". Wiec im więcej
basha a mniej pythona, tym lepiej. Co nie oznacza że będę z tego zadowolony.
0 new messages