Jak przesyłać polecenia do netcata, który pozostanie przy życiu?
32
echo command | netcat host port
Powoduje to wysłanie polecenia do zdalnego hosta i ponowne odczytanie niektórych danych. Ale po kilku sekundach połączenie zostaje zamknięte. Parametr -w niczego nie zmienił. Używam netcat v1.10 na SuSE 10.1.
Jest fajny, ponieważ działa na bardzo osadzonym systemie kości, w którym netcatowi brakuje wszystkich wymyślnych opcji.
SF.
{ echo command; cat;}zrobiłby to samo i może być uważany za łatwiejszy do zrozumienia.
G-Man mówi „Przywróć Monikę”
1
Widzę, że netcatpolecenie będzie trzymać gniazdo otwarte, dopóki nie zobaczy końca wejścia. Wszystkie te przykłady pokazują to, nie mówiąc zbyt wiele o tym, dlaczego . Ja interakcji z serwerem przy użyciu przez dłuższy czas po prostu przy użyciu: . SocketTest to przydatne narzędzie, które może nasłuchiwać lub obsługiwać na dowolnym porcie TCP lub UDP. SocketTestnetcatcat - | nc localhost 8063
Nie sądzę, że poradzisz sobie z tym za pomocą netcat lub socat. Właśnie zrobiłem obszerne majsterkowanie z oboma i socat wyglądał najbardziej obiecująco.
Udało mi się skonfigurować socat, aby łączył się ze zdalnym portem TCP i nasłuchiwał na lokalnym gnieździe domeny unix (teoretycznie, aby łącze mogło być cały czas utrzymywane), ale jak tylko proces lokalny został odłączony od gniazda unix (inny socat połączenie gniazda unix ze standardowym wyjściem / wyjściem) zamknęło sesję socat TCP.
Problem polega na tym, że każde połączenie przez netcat / socat tworzy nowe połączenie strumienia TCP z serwerem i zamyka tę sesję strumienia TCP, gdy lokalny koniec się rozłącza.
Myślę, że prawdopodobnie będziesz musiał napisać niestandardowe oprogramowanie proxy, które otworzy połączenie TCP ze zdalnym końcem, a następnie nasłuchuje lokalnie na gnieździe / rurze / fifo lub czymkolwiek, a następnie po prostu wyśle dane w dół istniejącego potoku TCP i zwraca wyniki.
Czy to możliwe, że połączenie jest zamknięte na drugim końcu gniazda?
Domyślnie nczamyka połączenie po zakończeniu, jeśli nie powiesz mu wyraźnie, by nadal nasłuchiwał (z -kopcją):
-k Forces nc to stay listening for another connection after its current
connection is completed. It is an error to use this option without the
-l option.
Zobaczyć man nc.1.
Pomyślnie przesyłam strumieniowo dane między dwoma komputerami:
nadawca:
while (true); do
echo -n "$RANDOM " | nc <host> <port>
done
Changes the (address dependent) method of shutting down the write part of a connection to not do anything.
Prawdopodobnie będziesz również musiał zastąpić domyślny limit czasu przy użyciu -t <timeout>, w przeciwnym razie gniazdo zostanie zamknięte po 0,5 s. Ta opcja zastępuje zachowanie domyślne, czyli:
When one of the streams effectively reaches EOF, the closing phase begins. Socat transfers the EOF condition to the other stream, i.e. tries to shutdown only its write stream, giving it a chance to terminate gracefully. For a defined time socat continues to transfer data in the other direction, but then closes all remaining channels and terminates.
Twoje polecenie kończy się, jeśli albo zdalny host zamyka połączenie (lub nie jest osiągalne), albo polecenie przed zakończeniem potoku (podczas gdy netcat nadal wysyła resztę swojej kolejki wejściowej).
Odpowiedzi:
Działa to z
nc
poleceniem w systemie OS X (zakładając, że polecenie, które chcesz wysłać, znajduje się w pliku):(Zasadniczo
cat
zrzuca zawartość pliku na stdout, a następnie czeka na ciebie na stdin).Według rozszerzenia, jeśli chcesz wysłać polecenie z samej powłoki, możesz to zrobić:
źródło
{ echo command; cat;}
zrobiłby to samo i może być uważany za łatwiejszy do zrozumienia.netcat
polecenie będzie trzymać gniazdo otwarte, dopóki nie zobaczy końca wejścia. Wszystkie te przykłady pokazują to, nie mówiąc zbyt wiele o tym, dlaczego . Ja interakcji z serwerem przy użyciu przez dłuższy czas po prostu przy użyciu: . SocketTest to przydatne narzędzie, które może nasłuchiwać lub obsługiwać na dowolnym porcie TCP lub UDP.SocketTest
netcat
cat - | nc localhost 8063
Z
nc
na Ubuntu:Z Ubuntu
nc
strony man :Zauważ, że dostępne
nc
opcje różnią się znacznie między dystrybucjami, więc może nie działać na twoją (OpenSUSE).źródło
Znalazłem to:
Mój współpracownik wiedział o tym. W ogóle tego nie widzę w dokumentacji.
źródło
Nie sądzę, że poradzisz sobie z tym za pomocą netcat lub socat. Właśnie zrobiłem obszerne majsterkowanie z oboma i socat wyglądał najbardziej obiecująco.
Udało mi się skonfigurować socat, aby łączył się ze zdalnym portem TCP i nasłuchiwał na lokalnym gnieździe domeny unix (teoretycznie, aby łącze mogło być cały czas utrzymywane), ale jak tylko proces lokalny został odłączony od gniazda unix (inny socat połączenie gniazda unix ze standardowym wyjściem / wyjściem) zamknęło sesję socat TCP.
Problem polega na tym, że każde połączenie przez netcat / socat tworzy nowe połączenie strumienia TCP z serwerem i zamyka tę sesję strumienia TCP, gdy lokalny koniec się rozłącza.
Myślę, że prawdopodobnie będziesz musiał napisać niestandardowe oprogramowanie proxy, które otworzy połączenie TCP ze zdalnym końcem, a następnie nasłuchuje lokalnie na gnieździe / rurze / fifo lub czymkolwiek, a następnie po prostu wyśle dane w dół istniejącego potoku TCP i zwraca wyniki.
źródło
Czy to możliwe, że połączenie jest zamknięte na drugim końcu gniazda?
Domyślnie
nc
zamyka połączenie po zakończeniu, jeśli nie powiesz mu wyraźnie, by nadal nasłuchiwał (z-k
opcją):Zobaczyć
man nc.1
.Pomyślnie przesyłam strumieniowo dane między dwoma komputerami:
nadawca:
odbiorca:
źródło
Metoda Georgesa działa dobrze z interaktywnej powłoki, ale nie pomoże w skryptowaniu, gdy np. Wywołujesz skrypt jako
nohup ./script &
.Odkryłem, że zastąpienie stdin manekinem FIFO pomaga.
Ponieważ nic nigdy nie zapisuje do FIFO, po wysłaniu pliku
cat
zawiesza się na nim w nieskończoność.źródło
socat
„sshut-none
opcja powinna pomóc tutaj:Prawdopodobnie będziesz również musiał zastąpić domyślny limit czasu przy użyciu
-t <timeout>
, w przeciwnym razie gniazdo zostanie zamknięte po 0,5 s. Ta opcja zastępuje zachowanie domyślne, czyli:Tak więc polecenie takie jak:
utrzyma gniazdo otwarte przez 10s po wysłaniu „bla”.
źródło
Twoje polecenie kończy się, jeśli albo zdalny host zamyka połączenie (lub nie jest osiągalne), albo polecenie przed zakończeniem potoku (podczas gdy netcat nadal wysyła resztę swojej kolejki wejściowej).
źródło