Script de shell simple para enviar mensajes de socket

16

Para fines de prueba, necesito crear un script de shell que se conecte con un IP remoto> Puerto y envíe un mensaje de texto simple de TCPIP Socket.

Bachalo
fuente

Respuestas:

18

Usando nc( netcat).

Servidor:

$ nc -l localhost 3000

Cliente:

$ nc localhost 3000

Tanto el servidor como el cliente leerán y escribirán en la salida / entrada estándar.

Esto funcionará cuando tanto el servidor como el cliente estén en la misma máquina. De lo contrario, cambie localhostal nombre externo del servidor.

Un poco más interesante, un "servidor" que le da la hora del día si se conecta a él y le envía un d, y que se cierra si envía q:

Servidor (en 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"

Sesión del cliente:

$ nc localhost 3000
re
Jue 12 ene 18:04:21 CET 2017
¿Hola?
¿Qué?
q

(el servidor se cierra después q, pero el cliente no detecta que se ha ido hasta que presiona Enter).

Kusalananda
fuente
2
Si el servidor devuelve un resultado cuando el cliente termina de enviar datos, ctrl+cno mostrará el resultado. Si usa echo, por ejemplo echo "cookie" | nc localhost 9090, la secuencia de salida del cliente se cerrará (eof enviado) pero el cliente seguirá esperando el resultado del servidor.
AlikElzin-kilaka
12

En general, el consejo netcates mejor.

Pero en bashy kshtambién puedes hacer esto:

exec 3<>/dev/tcp/hostname/port
echo "request" 1>&3
response="$(cat <&3)"
ValeriyKr
fuente
lo que es 1>&3? No estoy seguro de lo que eso representa
Alexander Mills
en otras palabras, ¿por qué no echo "request" >&3, supongo que el 1 es simplemente redundante
Alexander Mills
4

pruebe netcat (por ejemplo, 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
  • en la muestra anterior, envío un GET ( echo GET / HTTP/1.0) a mi servidor http local
  • Si no desea un protocolo complejo, esto podría hacer el trabajo.
Archemar
fuente
0

En muchos casos no he tenido acceso a netcat / socat. También he tenido problemas con el uso de bash execen un entorno informático distribuido.

Debido a su prevalencia, una solución alternativa es utilizar las capacidades TCP / IP de GNU AWK. Proporciona una sintaxis simple basada en su operador de "tubería bidireccional".

Aquí hay un ejemplo modificado de esta fuente que enviará un mensaje TCP a través de un socket:

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

La sintaxis completa de la dirección es: /net-type/protocol/local-port/remote-host/remote-port. Cuando local-portse establece en 0, el host local elige el puerto automáticamente, que normalmente es lo que desea. Puede leer más sobre gawklas capacidades de red TCP / IP aquí:

John Lunzer
fuente