Próbuję wysłać polecenia do portu TCP przy użyciu polecenia netcat
i odpowiedzi potoku
podczas uruchamiania netcat
i 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ę netcat
wydrukować tekst odpowiedzi?
OpenBSD netcat (Debian patchlevel 1.105-7ubuntu1)
wersja; a na odległym końcu znajduje siętelegram-cli
na tej samej maszynie.netcat
odbiera EOF na STDIN, że natychmiast zamyka obie strony gniazda zamiast robić pół-zamknięcie i czekać na drugą stronę zamknięcia. Jeślisocat
jest to opcja, zdecydowanie polecam ją zamiast tego. Jest tylko jedensocat
, 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.Odpowiedzi:
Jak powiedział @Patrick, ten problem zwykle wynika z
netcat
wyjścia przed udzieleniem odpowiedzi. Można temu zaradzić, dodając-q 2
do wiersza poleceń, tzn. Powiedz,netcat
aby zawiesił się około 2 sekund po wykryciu EOF na standardowym wejściu. Oczywiście możesz sprawić, że zaczeka jeszcze kilka sekund.źródło
-q 2
działało, ale czy jest godne zaufania? wysyła żądanie internetowe Nie mogę być pewien, że 2s zawsze wystarcza! czy mogę ?-w
opcja zabawy. To wszystkoman nc
oczywiście na stronie.invalid option -- 'q'
nc
natychmiast wychodzi, zamiast czekać na odpowiedź? Jeśli połączenie jest nadal otwarte, powinna istnieć opcjanc
poczekać na jego zamknięcie, a nie tylko na zakończenie wejścia standardowegoUżyj tego:
Problem polega na tym,
nc
że zamknie połączenie natychmiast po zamknięciu standardowego wejścia, co jest bardzo szybkie dla prostegomy_command
cią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
cat
się-
jako drugi argument: To sprawia, żecat
słuchanie na stdin więcej treści do rury przez po to wysłał zawartość pierwszego argumentu. Pierwszym argumentem jest po prostu wykonanieecho
poleceniacat
- może to być również plik z twoimi poleceniamicat < file - | ...
.Alternatywnie wykonaj to:
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
cat
lubwhile
pętla inc
biegać, aż trafisz^C
lub^D
na 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 inc
po 1 sekundzie, alecat
bę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
nc
klienta i procesu do niego dołączającego.Ta odpowiedź jest oparta na tej odpowiedzi na identyczne pytanie superużytkownika .
źródło
{ echo my_command; cat;}
zrobiłby to samo i może być uważany za łatwiejszy do zrozumienia.Różne wersje OpenBSD-Netcat są dziwaczne, wymagających różnych kombinacji
-w <seconds>
,-q <seconds>
,-N
a 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ę:
Ale działa z -N dodanym do serwera lub klienta.
źródło
Wiem, że to jest trochę stare, ale żadna inna odpowiedź nie działała dla mnie, a to zadziałało:
Zwróć uwagę na
-N
: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.
źródło