Prosty skrypt powłoki, aby wysłać komunikat gniazda

16

Do celów testowych muszę utworzyć skrypt powłoki, który łączy się ze zdalnym adresem IP> Port i wysyła prosty tekstowy komunikat TCPIP Socket.

Bachalo
źródło

Odpowiedzi:

18

Używanie nc( netcat).

Serwer:

$ nc -l localhost 3000

Klient:

$ nc localhost 3000

Zarówno serwer, jak i klient będą czytać i zapisywać na standardowe wyjście / wejście.

Działa to, gdy zarówno serwer, jak i klient znajdują się na tym samym komputerze. W przeciwnym razie zmień localhostzewnętrzną nazwę serwera.

Nieco bardziej interesujący, „serwer”, który podaje godzinę, jeśli się z nim połączysz i wyślesz d, i który kończy działanie, jeśli wyślesz q:

Serwer (w 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"

Sesja klienta:

$ nc localhost 3000
re
Czw 12 stycznia 18:04:21 CET 2017
Witaj?
Co?
q

(serwer wychodzi później q, ale klient nie wykrywa, że ​​zniknął, dopóki nie naciśniesz Enter).

Kusalananda
źródło
2
Jeśli serwer zwróci wynik, gdy klient zakończy wysyłanie danych, wynik ctrl+cnie zostanie wyświetlony. Jeśli używasz echa, np. echo "cookie" | nc localhost 9090Strumień wyjściowy klienta zostanie zamknięty (eof wysłany), ale klient nadal będzie czekał na wynik serwera.
AlikElzin-kilaka
12

Ogólnie rzecz biorąc, porady netcatsą lepsze.

Ale bashi kshmożna też to zrobić:

exec 3<>/dev/tcp/hostname/port
echo "request" 1>&3
response="$(cat <&3)"
ValeriyKr
źródło
co jest 1>&3? Nie jestem pewien, co to oznacza
Alexander Mills,
innymi słowy, dlaczego nie tylko echo "request" >&3, myślę, że 1 jest po prostu zbędny
Alexander Mills,
4

spróbuj netcat (np. 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
  • w powyższym przykładzie wysyłam GET ( echo GET / HTTP/1.0) na mój lokalny serwer http
  • Jeśli nie chcesz skomplikowanego protokołu, może to zrobić zadanie.
Archemar
źródło
0

W wielu przypadkach nie miałem dostępu do netcat / socat. Miałem również problemy z używaniem basha execw rozproszonym środowisku komputerowym.

Ze względu na powszechność, alternatywnym rozwiązaniem jest wykorzystanie możliwości TCP / IP GNU AWK. Zapewnia prostą składnię opartą na operatorze „potoku dwukierunkowego”.

Oto zmodyfikowany przykład z tego źródła , który wyśle ​​komunikat TCP przez gniazdo:

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

Pełna składnia na adres: /net-type/protocol/local-port/remote-host/remote-port. Gdy local-portustawiony jest na 0, lokalny host automatycznie wybiera port, który zwykle jest tym, czego chcesz. Możesz przeczytać więcej na temat gawk„s możliwości TCP / IP networking tutaj:

John Lunzer
źródło