Come posso inviare i comandi a un netcat che rimarrà in vita?


32
echo command | netcat host port

Ciò comporta l'invio del comando all'host remoto e la lettura di alcuni dati. Ma dopo alcuni secondi, la connessione si chiude. Il parametro -w non ha cambiato nulla. Sto usando netcat v1.10 su SuSE 10.1.


Sei sicuro che non sia l'host remoto a chiudere la connessione?
Grawity

Sì. Fare netcat e quindi digitare manualmente il comando fa sì che netcat rimanga in vita indefinitamente.
Chris

Perché dovrebbe rimanere in vita? stampa solo i parametri dell'eco e poi muore?
M'vy,

1
Voglio che rimanga in vita in modo che continui a ricevere i dati provenienti dal server remoto.
Chris

2
Non è vero. "netcat <host> <porta>" apre un socket TCP bidirezionale.
Chris

Risposte:


33

Funziona con il nccomando su OS X (supponendo che il comando che si desidera inviare sia in un file):

cat file - | nc host port

(Essenzialmente, catscarica il contenuto del file su stdout e poi ti aspetta su stdin).

Per estensione, se si desidera inviare il comando dalla shell stessa, è possibile farlo:

cat <(echo command) - | nc host port

È bello in quanto funziona su un sistema embedded con ossa molto nude, in cui netcat manca di tutte le opzioni fantasiose.
SF.

{ echo command; cat;}farebbe lo stesso e potrebbe essere considerato più facile da capire.
G-Man dice "Reinstate Monica" il

1
A mio avviso, il netcatcomando terrà aperto il socket fino a quando non vede la fine dell'input. Tutti questi esempi lo dimostrano senza dire molto sul perché . Sto interagire con server di utilizzo per un periodo prolungato usando solo: . SocketTest è uno strumento utile che può ascoltare o servire su qualsiasi porta TCP o UDP. SocketTest netcatcat - | nc localhost 8063
sarà il

14

Con ncsu Ubuntu:

nc -q -1 host port

Dalla pagina man di Ubuntunc :

 -q seconds
         after EOF on stdin, wait the specified number of seconds and then quit. If seconds is negative, wait forever.

Nota che le ncopzioni disponibili variano molto tra le distribuzioni, quindi potrebbe non funzionare sul tuo (OpenSUSE).


13

L'ho trovato:

echo command | netcat host port -

Il mio collega lo sapeva. Non lo vedo affatto nella documentazione.


2

Non penso che riuscirai a gestirlo con Netcat o Socat. Ho appena fatto un grosso aggiustamento con entrambi, e socat sembrava il più promettente.

Sono riuscito a configurare socat per collegarmi alla porta TCP remota e ascoltare su un socket di dominio unix locale (in teoria in modo che il collegamento potesse essere mantenuto continuamente) ma non appena il processo locale si staccava dal socket unix (un altro socat collegando il socket unix a stdin / out) ha chiuso la sessione socat TCP.

Il problema qui è che ogni connessione tramite netcat / socat stabilisce una nuova connessione di flusso TCP al server e chiude quella sessione di flusso TCP quando si disconnette l'estremità locale.

Penso che probabilmente dovrai scrivere un software proxy personalizzato per questo che apre la connessione TCP all'estremità remota e quindi ascolta localmente su un socket / pipe / fifo o altro e quindi invia semplicemente i dati lungo la pipe TCP esistente e restituisce i risultati.


Ascolta l'onnipotente Matt Jenkins: D
M'vy

2

Potrebbe essere che la connessione sia chiusa all'altra estremità del socket?

Per impostazione predefinita, ncchiude la connessione dopo il completamento, se non gli dici esplicitamente di rimanere in ascolto (con l' -kopzione):

 -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.

Vedere man nc.1.


Sto trasmettendo con successo i dati tra due macchine in questo modo:

  • mittente:

    while (true); do 
      echo -n "$RANDOM " | nc <host> <port>
    done
    
  • ricevitore:

    nc -kl <port> 
    

1

Il metodo di Georges funziona bene da una shell interattiva, ma non aiuta con gli script, ad esempio quando chiami lo script come nohup ./script &.

Ho scoperto che la sostituzione dello stdin con un fittizio FIFO aiuta.

 mkfifo dummy
 cat command.txt dummy | nc host port

Poiché nulla scrive mai sul FIFO, dopo aver emesso il file, si catblocca indefinitamente.


0

socatL' shut-noneopzione dovrebbe aiutare qui:

Changes the (address dependent) method of shutting down the write part of a connection to not do anything.

Probabilmente dovrai anche sovrascrivere il periodo di timeout predefinito usando -t <timeout>, altrimenti il ​​socket verrà chiuso dopo 0,5 secondi. Questa opzione sovrascrive il comportamento predefinito, ovvero:

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.

Quindi, un comando come:

echo 'blah' | socat -t 10 stdio tcp:<addr>:<port>,shut-none

manterrà il socket aperto per 10 secondi dopo aver inviato il "blah".


0

Il comando termina se l'host remoto chiude la connessione (o non è raggiungibile) o il comando prima che la pipe venga terminata (mentre netcat invia ancora il resto della sua coda di input).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.