Come terminare una connessione TCP stabilita da bash stesso?


17

Ho usato exec 3<>/dev/tcp/192.168.0.101/6435per stabilire una connessione TCP con 192.168.0.101:6435. E ho ricevuto e inviato alcuni messaggi con il pipecomando.

Ora voglio terminare la connessione TCP. Ma, ss -anpetvedo che bash stesso mantiene questa connessione, senza biforcarsi un processo figlio.

Ho provato a inviare i segnali 9 e 15 al processo bash, ma come sai, bash non può uccidersi.

Quindi, posso terminare la connessione TCP che ho stabilito senza terminare i punti che sto usando (né ucciderlo per root né inviare Ctrl + D)?


Potresti ottenere un'altra shell e uccidere bashcon quella shell?
trysis,

3
bashsicuramente può uccidersi, anche se in realtà non è quello che vuoi fare qui!
psmears,

@TJM per rendere questa affascinante domanda più utile agli altri, potresti per favore approfondire il pipecomando che stai usando e che non riesco a trovare sul mio sistema? Da quale pacchetto pipeproviene? Quali parametri (esempio) è possibile passare ad esso per inviare / ricevere dati tramite la /dev/tcp/...connessione? Grazie.
Ari

@arielf In genere, sono un principiante di Informatica e ho trovato questo tipo di utilizzo da uno script di shell bash chiamato sedbot, lo puoi trovare su Github. Sì, non riesco a trovare alcun file /dev/tcp, nemmeno a trovarmi /dev/tcp. Tuttavia, sembra un uso speciale con cui è possibile inviare / ricevere dati pipee questo tipo di file. Si dice che usi /dev/tcp/ip/portper le connessioni tcp e /dev/udp/ip/portper i pacchetti udp. Per il mio inglese non è molto buono, non so come spiegarlo correttamente. Sentiti libero di modificare la domanda e pubblicare una risposta.
TJM,

@TJM grazie. La domanda riguardava il pipecomando che hai citato. Ho guardato https://github.com/clsr/sedbot/blob/master/sedbot.bash. Non c'è nessun pipecomando lì. Definisce due funzioni: readmsge sendmsgleggere / scrivere rispettivamente dalla / alla connessione. readmsgusa IFS= read -r -u 3 -t "$READ_TIMEOUT" lineper leggere dal descrittore di file 3 nella variabile linee sendmsgusa echo "$(date +%s.%N) >>> $line" >&4per scrivere nel descrittore di file 4. Comunque, questo chiarisce il metodo completo. La pipemenzione " comando" rimane ancora un mistero per i lettori.
arielf

Risposte:


18

Quel comando ha aperto la connessione sul descrittore di file 3. Quindi per chiudere la connessione, è necessario chiudere il descrittore di file 3. Per fare ciò:

exec 3<&-

1
Farà una shutdown(3)chiamata corretta o solo close(2)il descrittore di file?
Kevin,

Fa un close, ma shutdownnon è più appropriato che vicino. shutdownL'unico vero utilizzo è quando si desidera chiudere solo un lato di una presa duplex.
Patrick,

4
A shutdowninvia un FIN, mentre a closeinvia un RST. Queste sono cose materialmente diverse.
Kevin,

2
@Kevin RST è causato dalla chiusura del socket senza prima leggere tutti i dati da esso. Se leggi fino alla fine dei dati e poi fai una chiusura, la chiusura invierà un FIN.
Kasperd,

@kasperd: nell'API del socket UNIX, l'unico modo per sapere se ci sono dati in sospeso è provare a leggere da un socket non bloccante o chiamare qualcosa del genere select(), e non credo che bash preveda entrambe le opzioni.
Kevin,
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.