Zachowanie Netcat / socat z orurowaniem i UDP?

16

Myślę, że jest to bliskie linuxowi - Netcat przestaje nasłuchiwać ruchu UDP - Super Użytkownik , ale pomyślałem, że i tak lepiej zapytam

Jeśli chodzi o wersje netcat , używam Ubuntu 11.04 i domyślnie netcatna nim, domyślam się openbsd:

$ nc
This is nc from the netcat-openbsd package. An alternative nc is available
in the netcat-traditional package.
usage: nc [-46DdhklnrStUuvzC] [-i interval] [-P proxy_username] [-p source_port]
      [-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_protocol]
      [-x proxy_address[:port]] [hostname] [port[s]]

 

To wydaje mi się dziwne: pierwszy przypadek działa zgodnie z oczekiwaniami - otwieram serwer UDP w jednym terminalu:

$ sudo nc -ul 5000

... aw innym terminalu inicjuję nowe połączenie klienta UDP - i piszę hellotrzy razy, naciskając po każdym klawisz ENTER:

$ nc -u 127.0.0.1 5000
hello
hello
hello
^C

... i wracając do terminala serwera, wydrukował hellotrzy razy, zgodnie z oczekiwaniami:

$ sudo nc -ul 5000 
hello
hello
hello
^C

 

Jak dotąd tak dobrze, wszystko działa zgodnie z oczekiwaniami. Powiedzmy jednak, że próbuję teraz to samo, przesyłając dane wejściowe do klienta; więc najpierw załóż serwer UDP w jednym terminalu:

$ sudo nc -ul 5000

... a po drugie, potokuj niektóre dane ncjako klient UDP:

$ echo hello | nc -u 127.0.0.1 5000
hello
hello
^C

... po komendzie klienta rodzaj powłoki zawiesza się, jakby czekał na dane wejściowe - więc tam wpisuję helloi ENTER jeszcze dwa razy; ale serwer zarejestrował tylko pierwszy hello(który został przesłany przez echo). Co więcej, nawet jeśli naciśniesz Ctrl-C i spróbujesz powtórzyć echo hello | nc -u 127.0.0.1 5000polecenie klienta , serwer nadal będzie zgłaszał tylko pierwszą hello:

$ sudo nc -ul 57130 
hello
^C

... i tylko po zatrzymaniu serwera za pomocą Ctrl-C i ponownym uruchomieniu go ponownie, można powtórzyć echo hello | nc -u 127.0.0.1 5000polecenie klienta i obserwować, jak działa.

 

Czy tak ncma się zachowywać? Spodziewałbym się, że przynajmniej powtórzone połączenia echo hello | nc -u 127.0.0.1 5000zostaną zarejestrowane - bez konieczności ponownego uruchamiania serwera? A może istnieje specjalny przełącznik wiersza polecenia dla tego rodzaju zachowania?

EDYCJA: Znalazłem tę ładną prezentację PDF: socat - Obsługa wszystkich rodzajów gniazd , która zawiera następujące netcatvs socatnotatki:

netcat - Ograniczenia
● tylko jednorazowy (kończy się po zamknięciu gniazda)
...
Przykłady 1: zamiana netcat
...
● Klient UDP z portem źródłowym:
nc -u -p 500 1.2.3.4 500
socat - udp: 1.2.3.4: 500, sp = 500
● Serwer TCP:
nc -l -p 8080
socat - tcp-l: 8080, reuseaddr
...

... jednak uzyskuję to samo zachowanie, co powyżej, jeśli zastąpię polecenie serwera „ socat - udp4-listen:5000,reuseaddr” - a wiersz klienta „ socat - udp:127.0.0.1:5000”… W przypadku danych wejściowych potokowych „ echo hello | socat - udp:127.0.0.1:5000” jedyną różnicą jest to, że tutaj polecenie istnieje przynajmniej po hellowysłaniu słowa - jednak kolejne uruchomienia tego polecenia nie spowodują żadnego odbioru na serwerze, dopóki serwer nie zostanie zrestartowany.

sdaau
źródło

Odpowiedzi:

23

Ok, myślę, że przynajmniej coś mam socat- mianowicie, opcja forkmusi być dołączona do linii serwera:

$ socat - udp4-listen:5000,reuseaddr,fork

... a następnie w innym terminalu możemy wywoływać echopotok do socatlinii klienta wiele razy w linii poleceń, ponieważ natychmiast zakończy działanie ( cóż, po pół sekundy :) ):

$ echo "hello" | socat - udp-sendto:127.0.0.1:5000
$ echo "hello" | socat - udp-sendto:127.0.0.1:5000
$ echo "hello" | socat - udp-sendto:127.0.0.1:5000

... i wracając do pierwszego terminala, możemy zobaczyć, że serwer pomyślnie pokazał wszystkie trzy hellos:

$ socat - udp4-listen:5000,reuseaddr,fork
hello
hello
hello
^C

 

Zauważ, że nawet z fork-ed socatserwerze, linia echo "hello" | nc -u 127.0.0.1 5000będzie nadal „lock” jakby czekając na wejście użytkownika; jednak teraz po Ctrl-C i ponownym uruchomieniu polecenia, tj

$ echo "hello" | nc -u 127.0.0.1 5000
^C
$ echo "hello" | nc -u 127.0.0.1 5000
^C
$ echo "hello" | nc -u 127.0.0.1 5000
^C

... serwer fork-ed socatpokaże trzy hellosekundy bez konieczności restartowania.

 

Niby ten openBSD netcatnie ma forkopcji - ale nie jestem pewien, czy ma taką, która mu odpowiada.

Tak czy inaczej, mam nadzieję, że to komuś pomoże,
zdrowie!

sdaau
źródło
4

Twój netcat odczytuje wyjście ze standardowego wyjścia echa tylko podczas używania potoku, nie jest już „podłączony” do klawiatury. Aby uzyskać oczekiwaną odpowiedź, możesz dodać trzy „witaj” do pliku

cat [myfile] | nc -u 127.0.0.1 5000
OldWolf
źródło
Cześć @OldWolf - wielkie dzięki za odpowiedź! Wypróbowałem twoją sugestię (również w nieco bardziej skomplikowany sposób, „ cat $(echo -e "hello\nhello\nhello\n" > tmpf; echo tmpf) | nc -u 127.0.0.1 5000”), ale gdy widzę trzy hellos, to co mnie zastanawia, wciąż jest obecne: to polecenie również będzie jakby „blokować”, jakby czekało na wpisane dane z użytkownika, a po Ctrl-C i ponownym uruchomieniu serwer nie zobaczy żadnych danych, dopóki nie zostanie zrestartowany !? To chciałbym wiedzieć lepiej - na zdrowie!
sdaau
2
nc czeka na EOF, który w tym przypadku nie dostanie, dopóki nie wyślesz sygnału wyjścia do programu.
OldWolf,
Ach, rozumiem - wielkie dzięki za wyjaśnienie, @OldWolf! Pozornie socatmożna to obejść z forkopcją ... Jeszcze raz dziękuję, na zdrowie!
sdaau
3

Jeśli wykonasz śledzenie nc nasłuchiwania, pokaże, że netcat czeka na połączenie, a gdy je otrzyma, połączy się z tym hostem i portem, ignorując wszystkie inne. Musisz dodać „-k”, aby kontynuować, i „-w 0”, aby przekroczyć limit czasu każdego połączenia po 0 sekundach. Myślę, że Socat to lepszy wybór.

pdragon
źródło