Script di shell semplice per inviare un messaggio socket


16

A scopo di test ho bisogno di creare uno script shell che si connette con un IP remoto> Porta e invii un semplice messaggio di testo TCPIP Socket.

Risposte:


18

Utilizzando nc( netcat).

Server:

$ nc -l localhost 3000

Cliente:

$ nc localhost 3000

Sia il server che il client leggeranno e scriveranno sull'output / input standard.

Funzionerà quando sia il server che il client si trovano sulla stessa macchina. In caso contrario, passare localhostal nome esterno del server.

Leggermente più interessante, un "server" che ti dà l'ora del giorno se ti connetti ad esso e lo invii a d, e che si chiude se invii q:

Server (in bash):

#!/bin/bash

coproc nc -l localhost 3000

while read -r cmd; do
  case $cmd in
    d) date ;;
    q) break ;;
    *) echo 'What?'
  esac
done <&"${COPROC[0]}" >&"${COPROC[1]}"

kill "$COPROC_PID"

Sessione cliente:

$ nc localhost 3000
d
Gio 12 gen 18:04:21 CET 2017
Ciao?
Che cosa?
q

(il server esce dopo q, ma il client non rileva che è andato fino a quando non si preme Enter).


2
Se il server restituisce un risultato al termine dell'invio dei dati, il client ctrl+cnon mostrerà il risultato. Se si utilizza echo, ad esempio echo "cookie" | nc localhost 9090, il flusso di output del client verrà chiuso (eof inviato) ma il client attenderà comunque il risultato del server.
AlikElzin-kilaka,

12

In generale consiglio con netcatè il modo migliore.

Ma dentro bashe kshpuoi anche fare questo:

exec 3<>/dev/tcp/hostname/port
echo "request" 1>&3
response="$(cat <&3)"

che cos'è 1>&3? Non sono sicuro di ciò che rappresenta
Alexander Mills il

in altre parole, perché non solo echo "request" >&3, immagino che il 1 sia solo ridondante
Alexander Mills,

4

prova netcat (es. nc)

echo GET / HTTP/1.0 | nc 0 80
HTTP/1.1 400 Bad Request
Date: Thu, 12 Jan 2017 13:44:23 GMT
Server: Apache/2.4.18 (Ubuntu)
Content-Length: 311
Connection: close
Content-Type: text/html; charset=iso-8859-1
  • nell'esempio sopra mando un GET ( echo GET / HTTP/1.0) al mio server http locale
  • Se non si desidera un protocollo complesso, questo potrebbe fare il lavoro.

0

In molti casi non ho avuto accesso a netcat / socat. Ho anche avuto problemi con l'utilizzo di bash execin un ambiente informatico distribuito.

Per la sua prevalenza, una soluzione alternativa è quella di utilizzare le funzionalità TCP / IP di GNU AWK. Fornisce una sintassi semplice basata sul suo operatore "pipe a due vie".

Ecco un esempio modificato da questa fonte che invierà un messaggio TCP su un socket:

BEGIN {
 NetService = "/inet/tcp/0/cs.wisc.edu/finger"
 print "coke" |& NetService
 close(NetService)
}

La sintassi completa per l'indirizzo è il seguente: /net-type/protocol/local-port/remote-host/remote-port. Quando local-portè impostato su 0, l'host locale sceglie automaticamente la porta, che in genere è quella desiderata. Si può leggere di più su gawk's rete TCP / IP funzionalità qui:

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.