netcat non stampa la risposta


12

Sto provando a inviare comandi a una porta tcp usando netcate pipe response
quando corro netcate digito il mio comando stampa la risposta correttamente ma quando passo comando da una pipe invia il comando correttamente ma non stampa la risposta

Quindi, questo funziona correttamente:

netcat  localhost 9009

mentre questo invia solo il comando ma non stampa la risposta:

echo 'my_command' | netcat  localhost 9009

perché?
Come posso fare netcatper stampare il testo di risposta?


questo è probabilmente accadendo a voi
Jeff Schaller

@JeffSchaller: no! sfortunatamente usare quei comandi non aiuta! questa volta si blocca per sempre!
RYN,

Quale netcat stai usando? Sfortunatamente ci sono una dozzina di diverse varianti dello strumento netcat e non si comportano tutti allo stesso modo. Inoltre, cosa c'è sull'estremità remota?
Patrick,

@Patrick: il mio netcat è la OpenBSD netcat (Debian patchlevel 1.105-7ubuntu1)versione; e all'estremità remota è telegram-clisulla stessa macchina.
RYN,

Penso di aver trovato una pagina man per quel netcat, ma non vedo alcuna bandiera che controlli ciò che sospetto stia accadendo. Sospetto che una volta netcatriceve l'EOF su STDIN, che spenga immediatamente entrambi i lati della presa invece di fare una mezza chiusura e aspettare che il lato remoto chiuda la sua estremità. Se socatè un'opzione, lo consiglio vivamente invece. C'è solo una socat, in modo da non avere i problemi di portabilità con che vi sia una dozzina di diversi gusti di esso, si comporta molto di più in modo sano, ed è altamente configurabile.
Patrick,

Risposte:


8

Come ha detto @Patrick, questo problema è di solito dovuto alla netcatchiusura prima che la risposta sia stata data. Rimedi che aggiungendo -q 2alla riga di comando, vale a dire, dire netcatdi sospendere circa 2 secondi dopo aver rilevato EOF sull'input standard. Ovviamente puoi farlo aspettare anche un altro numero di secondi.


Grazie; -q 2ha funzionato ma è affidabile? sta facendo una richiesta web Non posso essere sicuro che 2s sia sempre abbastanza! posso ?
RYN,

1
Usa un numero più grande per farlo aspettare più a lungo, o un numero negativo per farlo aspettare indefinitamente. C'è anche l' -wopzione con cui giocare. Questo è tutto nella man ncpagina ovviamente.
Ralph Rönnquist,

5
diceinvalid option -- 'q'
phil294,

Penso che una buona domanda di follow-up sia: perché ncuscire immediatamente invece di aspettare una risposta? Se la connessione è ancora aperta, dovrebbe esserci un'opzione per ncattendere che si chiuda, non solo per la fine di stdin
theferrit32

6

Usa questo:

cat <(echo command) - | nc host port

Il problema è che ncchiuderà la connessione immediatamente dopo la chiusura di stdin, che è molto veloce per una my_commandstringa semplice e quindi non ha mai la possibilità di ricevere una risposta. (Se installi un file molto grande, vedrai che potrebbe ricevere una risposta prima che abbia finito di inviare il file).

Entra catcon -come secondo argomento: fa catascoltare su stdin che più contenuto passi attraverso dopo che ha inviato il contenuto del primo argomento. Il primo argomento è solo ottenere il echocomando attraverso cat- potrebbe anche essere un file con i tuoi comandi alla la cat < file - | ....

In alternativa, fai questo:

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

Questo invia un numero illimitato di #caratteri sulla seconda riga dell'input. Usare le #opere per un bash come il telecomando che lo ignorerebbe come commento. Ho scelto un piccolo tempo di attesa di 10 millisecondi qui, quindi reagisce più velocemente alla fine della connessione. YMMV.

Il rovescio della medaglia può essere quello cato il whileloop e nccontinuare a correre fino a quando non si colpisce ^Co ^Dsulla shell. Dipende molto dall'estremità remota.

L'aggiunta di un timeout mediante -w 1(OSX netcat) o -i 1(nmap's ncat) consente di chiudere la connessione e ncdopo 1 secondo, ma catcontinuerà a funzionare fino a quando non si immette un carattere e si interrompe la pipe (penso).

Tuttavia, funziona se il lato remoto chiuderà automaticamente la connessione dopo aver ricevuto e gestito il comando - questo terminerà anche il ncclient e il processo di piping al suo interno.

Questa risposta si basa su questa risposta a una domanda identica da superutente .


{ echo my_command; cat;}farebbe lo stesso e potrebbe essere considerato più facile da capire.
G-uomo dice 'Ripristinare Monica'

1

Diverse versioni openbsd-netcat sono eccentrico, che necessitano di diverse combinazioni di -w <seconds>, -q <seconds>, -Ne argomenti diversi anche bisogno a seconda di ciò che è in esecuzione su l'altra estremità della connessione. L'uso di opzioni di timeout con determinate versioni o server causa ritardi e il loro mancato utilizzo potrebbe comportare un ritardo estremamente lungo (infinito?). E mi aspetterei diverse stranezze con gnu netcat, ma non so se sono diverse tra le versioni di esso.

Ad esempio la versione 1.130_3 di archlinux impiega molto tempo (per sempre?) Quando faccio questo:

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

$ time echo request | nc localhost 9999
request
response

(wait forever possibly)

Funziona con -N aggiunto al server o al client.


1

So che questo è un po 'vecchio ma nessun'altra risposta ha funzionato per me e questo ha fatto:

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

Si noti che -N:

spegnere il socket di rete dopo EOF sull'ingresso. Alcuni server lo richiedono per completare il loro lavoro.

Ha funzionato per me su Windows e Linux.

Nota: questa è una copia incolla della risposta che ho pubblicato per una domanda duplicata .

Sto pensando che potrebbe essere utile. Le mod si sentono libere di modificare / eliminare se questo è contro la politica o qualcosa del genere.

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.