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.
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.
Risposte:
Funziona con il nc
comando su OS X (supponendo che il comando che si desidera inviare sia in un file):
cat file - | nc host port
(Essenzialmente, cat
scarica 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
{ echo command; cat;}
farebbe lo stesso e potrebbe essere considerato più facile da capire.
netcat
comando 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
netcat
cat - | nc localhost 8063
Con nc
su 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 nc
opzioni disponibili variano molto tra le distribuzioni, quindi potrebbe non funzionare sul tuo (OpenSUSE).
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.
Potrebbe essere che la connessione sia chiusa all'altra estremità del socket?
Per impostazione predefinita, nc
chiude la connessione dopo il completamento, se non gli dici esplicitamente di rimanere in ascolto (con l' -k
opzione):
-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>
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 cat
blocca indefinitamente.
socat
L' shut-none
opzione 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".