Einfaches Shell-Skript zum Senden von Socket-Nachrichten

16

Zu Testzwecken muss ich ein Shell-Skript erstellen, das eine Verbindung zu einem Remote-IP> -Port herstellt und eine einfache TCPIP-Socket-Textnachricht sendet.

Bachalo
quelle

Antworten:

18

Mit nc( netcat).

Server:

$ nc -l localhost 3000

Klient:

$ nc localhost 3000

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

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

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

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 Jan 18:04:21 CET 2017
Hallo?
Was?
q

(Der Server wird nach dem Beenden beendet q, der Client erkennt jedoch erst, wenn Sie auf drücken. Enter)

Kusalananda
quelle
2
Wenn der Server ein Ergebnis zurückgibt, wenn der Client das Senden der Daten beendet hat, ctrl+cwird das Ergebnis nicht angezeigt. Wenn Sie beispielsweise Echo verwenden, echo "cookie" | nc localhost 9090wird der Ausgabestream des Clients geschlossen (eof gesendet), der Client wartet jedoch weiterhin auf das Ergebnis des Servers.
AlikElzin-kilaka
12

Generell ist Rat mit dem netcatWeg besser.

Aber in bashund kshdu kannst das auch machen:

exec 3<>/dev/tcp/hostname/port
echo "request" 1>&3
response="$(cat <&3)"
ValeriyKr
quelle
was ist 1>&3? Ich bin nicht sicher, was das darstellt
Alexander Mills
Mit anderen Worten, warum nicht einfach echo "request" >&3, ich denke, die 1 ist einfach überflüssig
Alexander Mills
4

versuche netcat (zB 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) an meinen lokalen http-Server
  • Wenn Sie kein komplexes Protokoll wünschen, ist dies möglicherweise der richtige Weg.
Archemar
quelle
0

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

Aufgrund seiner Verbreitung besteht eine alternative Lösung darin, die TCP / IP-Funktionen von GNU AWK zu nutzen. Es bietet eine einfache Syntax basierend auf dem Operator "Two-Way-Pipe".

Hier ist ein modifiziertes Beispiel aus dieser 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. Wenn der local-portWert auf 0 gesetzt ist, wählt der lokale Host automatisch den gewünschten Port aus. Weitere gawkInformationen zu den TCP / IP-Netzwerkfunktionen finden Sie hier:

John Lunzer
quelle