Jak czytać dane z gniazda w Bash w systemie Linux?

Opublikowany: 2022-06-28
Kod binarny przepływający przez kable optyczne.
XYZ/Shutterstock.com

Wiersz poleceń systemu Linux umożliwia pobieranie danych przez nasłuchiwanie w gnieździe lub połączenie z gniazdem. Dane mogą być zapisane w pliku tekstowym. Pokażemy Ci jak.

Klienty i serwery Socket

Gniazda umożliwiają komunikację oprogramowania sieciowego. Po raz pierwszy zostały zaimplementowane w systemie operacyjnym 4.2BSD Unix, który powstał na Uniwersytecie Kalifornijskim w Berkeley w 1983 roku. Zostały szybko zaadoptowane przez System V Unix i Microsoft Windows.

Co oznacza „Wszystko jest plikiem” w systemie Linux?
POWIĄZANE Co oznacza „wszystko jest plikiem” w systemie Linux?

Gniazdo jest punktem końcowym połączenia sieciowego oprogramowania, wyabstrahowanym tak, że może być traktowane jako uchwyt pliku. Oznacza to, że pasuje do ogólnej zasady projektowania systemów Unix i Linux: „wszystko jest plikiem”. Nie mamy na myśli fizycznego gniazdka w ścianie, do którego podłączasz kabel sieciowy.

Jeśli program łączy się z gniazdem w innym oprogramowaniu, jest uważany za klienta innego oprogramowania. Oprogramowanie, które pozwala innym programom żądać połączeń, nazywa się serwerem . Terminy te są używane niezależnie od innych zastosowań klienta i serwera w świecie IT. Aby uniknąć nieporozumień, są one czasami nazywane klientem gniazd i serwerem gniazd, aby usunąć niejednoznaczność. Będziemy nazywać je klientami i serwerami.

Gniazda są zaimplementowane jako interfejs programowania aplikacji (API), który umożliwia programistom wywoływanie funkcji gniazd z poziomu ich kodu. To dobrze, jeśli jesteś programistą, ale co jeśli nie? A może tak, ale Twój przypadek użycia nie uzasadnia napisania aplikacji? Linux udostępnia narzędzia wiersza polecenia, które pozwalają używać — podstawowych — serwerów i klientów gniazd, zgodnie z potrzebami, do pobierania lub odbierania danych z innych procesów obsługujących gniazda.

POWIĄZANE: Co to jest interfejs API i jak programiści z niego korzystają?

Związki nigdy nie są łatwe

Programy, których będziemy używać to nc i ncat . Te dwa narzędzia mają dziwny związek. Program nc jest przepisanym ncat , który jest znacznie starszy niż nc . Ale ncat też został napisany od nowa i teraz pozwala nam robić rzeczy, których nc nie potrafi. Istnieje wiele implementacji programu ncat , który sam w sobie jest pochodną narzędzia o nazwie netcat . Co więcej, w większości dystrybucji nc jest dowiązaniem symbolicznym do ncat , a nie oddzielnym programem.

Sprawdziliśmy najnowsze dystrybucje Arch, Manjaro, Fedora i Ubuntu. Jedynym, który wymagał zainstalowania narzędzi, był Manjaro. Na Manjaro musisz zainstalować pakiet netcat , aby otrzymać nc , ale nie dostajesz ncat , dostajesz netcat . A na Manjaro nc jest dowiązaniem symbolicznym do netcat .

 sudo pacman -S netcat 

Instalowanie pakietu netcat na Manjaro

Najważniejsze jest to, że na Manjaro użyj netcat , gdy zobaczysz ncat w przykładach w tym artykule.

Słuchanie na gnieździe

Jeśli oprogramowanie nasłuchuje przychodzących połączeń z gniazdem, działa jako serwer. Wszystkie dane, które przychodzą przez połączenie z gniazdem, są odbierane przez serwer. Możemy bardzo łatwo odtworzyć to zachowanie za pomocą nc . Wszelkie otrzymane dane są wyświetlane w oknie terminala.

Musimy powiedzieć nc , aby nasłuchiwał połączeń, używając opcji -l (listen) i musimy określić port, na którym będziemy nasłuchiwać połączeń. Wszelkie programy lub procesy klienckie, które próbują połączyć się z tą instancją nc , muszą używać tego samego portu. Mówimy nc , na którym porcie ma nasłuchiwać, używając opcji -p (port).

To polecenie uruchamia nc jako serwer gniazd, nasłuchujący połączenia na porcie 6566:

 nc -l -p 6566 

uruchamianie nc jako serwer gniazd

Podczas oczekiwania na połączenie przychodzące nc nie generuje żadnych danych wyjściowych. Po nawiązaniu połączenia wszelkie pobrane informacje są wyświetlane w oknie terminala. W tym przypadku połączenie zostało nawiązane przez program kliencki, który identyfikuje się jako „klient 1.”

nc odbieranie danych od klienta

Wszystko, co wyświetla nc , jest odbierane od klienta. Zdarza się, że ten klient wysyła swoją nazwę i numerowaną wiadomość zawierającą datę i godzinę.

Kiedy klient zerwie połączenie, nc kończy działanie i wracasz do monitu terminala.

nc zakończone po rozłączeniu ze strony klienta

Wysyłanie danych do pliku

Aby przechwycić dane od klienta do pliku, możemy wysłać dane wyjściowe z nc do pliku za pomocą przekierowania. To polecenie zapisuje odebrane dane w pliku o nazwie „logfile.txt”.

 nc -l -p 6566 > plik dziennika.txt 

Przekierowanie wyjścia z nc do pliku tekstowego

Nie zobaczysz żadnego wyjścia — idzie do pliku — i paradoksalnie nie będziesz wiedział, czy połączenie zostało nawiązane, dopóki nc się nie zakończy. Powrót do wiersza poleceń wskazuje, że połączenie zostało nawiązane i zostało przerwane przez klienta.

Możemy użyć less , aby przejrzeć zawartość pliku „logfile.txt”.

 mniej logile.txt 

Używanie less do badania pliku tekstowego

Następnie możesz przewijać dane i wyszukiwać za pomocą wbudowanych funkcji less.

Przeglądanie przechwyconych danych wyjściowych z nc w mniej

POWIĄZANE: Jak używać mniej poleceń w systemie Linux

Wysyłanie danych do pliku i okna terminala

Jeśli chcesz widzieć przewijane dane w oknie terminala i jednocześnie wysyłać je do pliku, prześlij wyjście z nc do tee .

 nc -l -p 6566 | trójnik logfile.txt 

Wysyłanie danych wyjściowych z nc do pliku i do okna terminala w tym samym czasie

Akceptowanie wielu połączeń

Wszystko w porządku, ale ma ograniczenia. Możemy zaakceptować tylko jedno połączenie. Ograniczamy się do odbierania danych od jednego klienta. Ponadto, gdy ten klient zerwie połączenie, nasz serwer gniazd nc kończy działanie.

Jeśli chcesz zaakceptować wiele połączeń, musimy użyć ncat . musimy powiedzieć ncat , żeby nasłuchiwał i używał określonego portu, tak jak zrobiliśmy to z nc . Ale użyjemy również opcji -k (utrzymaj przy życiu). To mówi ncat , aby kontynuował działanie i akceptował połączenia od klientów, nawet gdy ostatnie aktywne połączenie zostanie przerwane.

Oznacza to, że ncat będzie działał, dopóki nie zdecydujemy się zakończyć go za pomocą „Ctrl-C”. Nowe połączenia będą akceptowane niezależnie od tego, czy ncat jest aktualnie połączony z jakimikolwiek klientami, czy nie.

 ncat -k -l -p 6566 

nasłuchiwanie wielu połączeń z ncat

Możemy zobaczyć dane od różnych klientów pojawiające się w danych wyjściowych z ncat podczas ich łączenia.

Drugi i trzeci klient łączący się z ncat

Łączenie z serwerem

Możemy również użyć nc jako klienta gniazda i połączyć się z innym programem, który akceptuje połączenia i działa jako serwer. W tym scenariuszu klientem gniazda jest nc . Aby to zrobić, musimy powiedzieć nc , gdzie w sieci znajduje się oprogramowanie serwera.

Jednym ze sposobów, aby to zrobić, jest podanie adresu IP i numeru portu. Jeśli serwer znajduje się na tym samym komputerze, na którym pracujemy w nc , możemy użyć adresu IP sprzężenia zwrotnego 127.0.0.1. Nie oznacza to, że nie ma flag używanych do wskazania adresu serwera i numeru portu. Po prostu zapewniamy odpowiednie wartości.

Aby połączyć się z serwerem na tym samym komputerze i korzystając z portu 6566, moglibyśmy użyć adresu IP pętli zwrotnej. Polecenie do użycia to:

 bd 127.0.0.1 6566 

Używanie nc jako klienta gniazda

Dane, które nc pobiera z serwera, przewijają się w oknie terminala.

Pobieranie danych z serwera gniazd za pomocą nc

Jeśli znasz nazwę sieciową komputera, na którym działa oprogramowanie serwera, możesz użyć jej zamiast adresu IP.

 nc sulaco 6566 

Używanie nc do łączenia się z serwerem gniazdka przy użyciu nazwy komputera, na którym działa serwer

Użyj „Ctrl+C”, aby przerwać połączenie.

Szybko i łatwo

nc i ncat się, gdy nie chcesz pisać niestandardowego programu obsługi gniazd, ale musisz zebrać dane z jakiegoś źródła obsługującego gniazda. Przekierowanie danych wyjściowych do pliku umożliwia przeglądanie danych wyjściowych za pomocą less , i parsowanie pliku za pomocą narzędzi, takich jak grep .

POWIĄZANE: Jak korzystać z polecenia grep w systemie Linux