À 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.
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).
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)"
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
echo GET / HTTP/1.0
) à mon serveur http localDans 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 gawk
capacité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"}