it-swarm.com.de

Einfaches Shell-Skript zum Senden einer Socket-Nachricht

Zu Testzwecken muss ein Shell-Skript erstellt werden, das eine Verbindung mit einer Remote-IP> Port herstellt und eine einfache TCPIP-Socket-Textnachricht sendet.

20
Bachalo

Verwenden von nc (netcat).

Server:

$ nc -l localhost 3000

Klient:

$ nc localhost 3000

Sowohl der Server als auch der Client lesen und schreiben in die Standardausgabe/-eingabe.

Dies funktioniert, wenn sich Server und Client auf demselben Computer befinden. Andernfalls ändern Sie localhost in den externen Namen des Servers.

Etwas interessanter ist ein "Server", der Ihnen die Tageszeit anzeigt, wenn Sie eine Verbindung herstellen und ihm ein d senden, und der beendet wird, wenn Sie q senden:

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"

Client-Sitzung:

 $ Nc localhost 3000 
 D 
Do 12. Januar 18:04:21 MEZ 2017
Hallo?
Was?
 Q 
 

(Der Server wird nach q beendet, aber der Client erkennt nicht, dass er verschwunden ist, bis Sie drücken Enter).

23
Kusalananda

Im Allgemeinen ist der Rat mit netcat der bessere Weg.

Aber in bash und ksh können Sie auch Folgendes tun:

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

versuchen Sie netcat (z. B. 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
  • im obigen Beispiel sende ich ein GET (echo GET / HTTP/1.0) zu meinem lokalen http-Server
  • Wenn Sie kein komplexes Protokoll wünschen, ist dies möglicherweise die Aufgabe.
4
Archemar

In vielen Fällen hatte ich keinen Zugriff auf netcat/socat. Ich hatte auch Probleme mit der Verwendung von bashs exec in einer verteilten Computerumgebung.

Aufgrund seiner Verbreitung besteht eine alternative Lösung darin, die TCP/IP-Funktionen von GNU AWK) zu verwenden. Es bietet eine einfache Syntax, die auf dem "Zwei-Wege-Pipe" -Operator basiert.

Hier ist ein modifiziertes Beispiel von diese Quelle , das eine TCP - Nachricht über einen Socket sendet:

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

Die vollständige Syntax für die Adresse lautet: /net-type/protocol/local-port/remote-Host/remote-port. Wann local-port wird auf 0 gesetzt. Der lokale Host wählt den Port automatisch aus. Dies ist normalerweise das, was Sie möchten. Weitere Informationen zu gawk 's TCP/IP-Netzwerkfunktionen finden Sie unter dem angegebenen Link.

Es ist erwähnenswert, dass dies verkürzt werden kann, wenn Sie nur eine Nachricht pro awk-Ausführung senden:

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