Jak czytać dane z gniazda w Bash w systemie Linux?
Opublikowany: 2022-06-28Wiersz 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.
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
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
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.”
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.
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
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
Następnie możesz przewijać dane i wyszukiwać za pomocą wbudowanych funkcji less.
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
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
Możemy zobaczyć dane od różnych klientów pojawiające się w danych wyjściowych z ncat
podczas ich łączenia.
Łą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
Dane, które nc
pobiera z serwera, przewijają się w oknie terminala.
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ż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