web-dev-qa-db-fra.com

Script Shell simple pour envoyer un message de socket

À 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.

20
Bachalo

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, remplacez localhost par le nom externe du serveur.

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

Serveur (dans 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 
 d 
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'appuyez pas sur Enter).

23
Kusalananda

En général, les conseils avec netcat sont mieux.

Mais dans bash et ksh vous pouvez aussi faire ceci:

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

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.
4
Archemar

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

En raison de sa prévalence, une solution alternative consiste à utiliser GNU les capacités TCP/IP d'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 via une 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. Quand local-port est défini sur 0, l'hôte local choisit automatiquement le port qui correspond généralement à ce que vous voulez. Vous pouvez en savoir plus sur gawkcapacités de mise en réseau TCP/IP dans le lien fourni.

Il convient de noter que cela peut être raccourci si vous ne souhaitez envoyer qu'un seul message par exécution awk:

BEGIN {print "coke" |& "/inet/tcp/0/cs.wisc.edu/finger"}
1
John Lunzer