netcat nie drukuje odpowiedzi

12

Próbuję wysłać polecenia do portu TCP przy użyciu polecenia netcati odpowiedzi potoku
podczas uruchamiania netcati wpisywania polecenia, drukuje odpowiedź poprawnie, ale gdy przekazuję polecenie z potoku, wysyła polecenie poprawnie, ale nie drukuje odpowiedzi

Działa to poprawnie:

netcat  localhost 9009

podczas gdy to po prostu wysyła polecenie, ale nie drukuje odpowiedzi:

echo 'my_command' | netcat  localhost 9009

dlaczego?
Jak mogę netcatwydrukować tekst odpowiedzi?

RYN
źródło
to prawdopodobnie dzieje się z tobą
Jeff Schaller
@JeffSchaller: nie! niestety używanie tych poleceń nie pomaga! tym razem blokuje się na zawsze!
RYN
Z którego netcat korzystasz? Niestety istnieje kilkanaście różnych wariantów narzędzia netcat i nie wszystkie zachowują się tak samo. Co znajduje się na drugim końcu?
Patrick,
@Patrick: mój netcat to OpenBSD netcat (Debian patchlevel 1.105-7ubuntu1)wersja; a na odległym końcu znajduje się telegram-clina tej samej maszynie.
RYN
Myślę, że znalazłem stronę podręcznika dla tego netcata, ale nie widzę żadnych flag, które kontrolowałyby to, co podejrzewam. Podejrzewam, że raz netcatodbiera EOF na STDIN, że natychmiast zamyka obie strony gniazda zamiast robić pół-zamknięcie i czekać na drugą stronę zamknięcia. Jeśli socatjest to opcja, zdecydowanie polecam ją zamiast tego. Jest tylko jeden socat, więc nie masz problemów z przenośnością, ponieważ istnieje tuzin różnych smaków, zachowuje się znacznie bardziej rozsądnie i jest wysoce konfigurowalny.
Patrick,

Odpowiedzi:

8

Jak powiedział @Patrick, ten problem zwykle wynika z netcatwyjścia przed udzieleniem odpowiedzi. Można temu zaradzić, dodając -q 2do wiersza poleceń, tzn. Powiedz, netcataby zawiesił się około 2 sekund po wykryciu EOF na standardowym wejściu. Oczywiście możesz sprawić, że zaczeka jeszcze kilka sekund.

Ralph Rönnquist
źródło
Dzięki; -q 2działało, ale czy jest godne zaufania? wysyła żądanie internetowe Nie mogę być pewien, że 2s zawsze wystarcza! czy mogę ?
RYN
1
Użyj większej liczby, aby wydłużyć czas oczekiwania, lub innej liczby ujemnej, aby poczekać w nieskończoność. Istnieje również -wopcja zabawy. To wszystko man ncoczywiście na stronie.
Ralph Rönnquist
5
mówiinvalid option -- 'q'
phil294,
Myślę, że dobrym następczym pytaniem jest: dlaczego ncnatychmiast wychodzi, zamiast czekać na odpowiedź? Jeśli połączenie jest nadal otwarte, powinna istnieć opcja ncpoczekać na jego zamknięcie, a nie tylko na zakończenie wejścia standardowego
theferrit32
6

Użyj tego:

cat <(echo command) - | nc host port

Problem polega na tym, ncże zamknie połączenie natychmiast po zamknięciu standardowego wejścia, co jest bardzo szybkie dla prostego my_commandciągu, a zatem nigdy nie ma szansy na odpowiedź. (Jeśli potokujesz bardzo duży plik, zobaczysz, że może otrzymać odpowiedź, zanim zakończy wysyłanie pliku).

Wpisz catsię -jako drugi argument: To sprawia, że catsłuchanie na stdin więcej treści do rury przez po to wysłał zawartość pierwszego argumentu. Pierwszym argumentem jest po prostu wykonanie echopolecenia cat- może to być również plik z twoimi poleceniami cat < file - | ....

Alternatywnie wykonaj to:

(echo command; while true; do sleep 0.01; echo -n "#"; done) | nc host port

To wysyła nieograniczoną liczbę #znaków w 2. linii wejścia. Użycie #działa w trybie bash jak pilot, który zignorowałby to jako komentarz. Wybrałem tutaj krótki czas oczekiwania wynoszący 10 milisekund, więc reaguje on szybciej po zakończeniu połączenia. YMMV.

Minusem tego może być to, że catlub whilepętla i ncbiegać, aż trafisz ^Club ^Dna pocisk. To naprawdę zależy od zdalnego końca.

Dodanie limitu czasu przy użyciu -w 1(OSX netcat) lub -i 1(ncat nmap) powoduje zamknięcie połączenia i ncpo 1 sekundzie, ale catbędzie działać, dopóki nie wpiszesz znaku i nie dojdzie do zerwania potoku (tak myślę).

Działa to jednak, jeśli strona zdalna automatycznie zamknie połączenie po otrzymaniu i obsłużeniu polecenia - spowoduje to także zamknięcie ncklienta i procesu do niego dołączającego.

Ta odpowiedź jest oparta na tej odpowiedzi na identyczne pytanie superużytkownika .

Alexander Klimetschek
źródło
{ echo my_command; cat;}zrobiłby to samo i może być uważany za łatwiejszy do zrozumienia.
G-Man mówi „Przywróć Monikę”
1

Różne wersje OpenBSD-Netcat są dziwaczne, wymagających różnych kombinacji -w <seconds>, -q <seconds>, -Na nawet wymagają różnych argumentów, w zależności od tego, co jest wyświetlane na drugim końcu połączenia. Korzystanie z opcji przekroczenia limitu czasu w niektórych wersjach lub serwerach powoduje opóźnienia, a niestosowanie ich może spowodować wyjątkowo długie (nieskończone?) Opóźnienie. I spodziewałbym się różnych dziwactw z gnu netcat, ale nie wiem, czy różnią się między wersjami.

Na przykład wersja 1.130_3 z archlinuxa zajmuje bardzo długo (na zawsze?), Kiedy to robię:

$ echo response | nc -l 9999 &
[1] 15190

$ time echo request | nc localhost 9999
request
response

(wait forever possibly)

Ale działa z -N dodanym do serwera lub klienta.

Piotr
źródło
1

Wiem, że to jest trochę stare, ale żadna inna odpowiedź nie działała dla mnie, a to zadziałało:

echo 'test' | netcat -N $server $port

Zwróć uwagę na -N:

zamknij gniazdo sieciowe po EOF na wejściu. Niektóre serwery wymagają tego, aby zakończyć pracę.

Pracował dla mnie zarówno w systemie Windows, jak i Linux.

Uwaga: To jest wklej kopię odpowiedzi, którą zamieściłem na duplikat pytania .

Myślę, że to może być przydatne. Mody mogą edytować / usuwać, jeśli jest to sprzeczne z zasadami lub czymś innym.

yannick1976
źródło