Script shell simple pour envoyer un message de socket

16

À des fins de test, je dois créer un script shell qui se connecte à un IP> Port distant et envoie un simple message TCPIP Socket.

Bachalo
la source

Réponses:

18

Utilisation de nc( netcat).

Serveur:

$ nc -l localhost 3000

Client:

$ nc localhost 3000

Le serveur et le client lisent et écrivent sur la sortie / entrée standard.

Cela fonctionnera lorsque le serveur et le client se trouvent sur la même machine. Sinon, changez localhostle nom externe du serveur.

Un peu plus intéressant, un "serveur" qui vous donne l'heure du jour si vous vous connectez à lui et lui envoyez un d, et qui se ferme si vous envoyez q:

Serveur (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"

Session client:

$ nc localhost 3000
ré
Jeu.12 janv.18: 04: 21 CET 2017
Bonjour?
Quelle?
q

(le serveur se ferme après q, mais le client ne détecte pas qu'il a disparu tant que vous n'avez pas appuyé sur Enter).

Kusalananda
la source
2
Si le serveur renvoie un résultat lorsque le client a fini d'envoyer des données, le ctrl+cne montrera pas le résultat. Si vous utilisez echo, par exemple echo "cookie" | nc localhost 9090, le flux de sortie du client sera fermé (eof envoyé) mais le client attendra toujours le résultat du serveur.
AlikElzin-kilaka
12

En général, les conseils netcatsont mieux.

Mais dans bashet kshvous pouvez aussi le faire:

exec 3<>/dev/tcp/hostname/port
echo "request" 1>&3
response="$(cat <&3)"
ValeriyKr
la source
c'est quoi 1>&3? Je ne sais pas ce que cela représente
Alexander Mills
en d'autres termes, pourquoi pas juste echo "request" >&3, je suppose que le 1 est juste redondant
Alexander Mills
4

essayez netcat (par exemple 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
  • dans l'exemple ci-dessus, j'envoie un GET ( echo GET / HTTP/1.0) à mon serveur http local
  • Si vous ne voulez pas de protocole complexe, cela pourrait faire l'affaire.
Archemar
la source
0

Dans de nombreux cas, je n'ai pas eu accès à netcat / socat. J'ai également eu des problèmes avec l'utilisation de bash execdans un environnement informatique distribué.

En raison de sa prévalence, une solution alternative consiste à utiliser les capacités TCP / IP de GNU AWK. Il fournit une syntaxe simple basée sur son opérateur de "canal bidirectionnel".

Voici un exemple modifié de cette source qui enverra un message TCP sur un socket:

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

La syntaxe complète de l'adresse est: /net-type/protocol/local-port/remote-host/remote-port. Lorsque local-portest défini sur 0, l'hôte local choisit automatiquement le port, qui correspond généralement à ce que vous souhaitez. Vous pouvez en savoir plus sur gawkdes » capacités de réseau TCP / IP ici:

John Lunzer
la source