Простой скрипт для отправки сообщения сокета

16

Для целей тестирования мне нужно создать сценарий оболочки, который соединяется с удаленным IP-портом и отправляет простое текстовое сообщение TCPIP Socket.

Bachalo
источник

Ответы:

18

Использование nc( netcat).

Сервер:

$ nc -l localhost 3000

Клиент:

$ nc localhost 3000

И сервер, и клиент будут читать и записывать в стандартный вывод / ввод.

Это будет работать, когда сервер и клиент находятся на одном компьютере. В противном случае измените localhostна внешнее имя сервера.

Немного интереснее, «сервер», который дает вам время суток, если вы подключитесь к нему и отправите ему d , и который выходит, если вы отправляете q:

Сервер (в 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"

Клиентская сессия:

$ nc localhost 3000
d
Чт 12 января 18:04:21 CET 2017
Здравствуйте?
Какая?
Q

(сервер выходит после q, но клиент не обнаруживает, что он ушел, пока вы не нажмете Enter).

Кусалананда
источник
2
Если сервер вернет результат, когда клиент закончит отправку данных, результат ctrl+cне будет показан. Например echo "cookie" | nc localhost 9090, при использовании echo выходной поток клиента будет закрыт (eof sent), но клиент все равно будет ожидать результата сервера.
АликЭльзин-килака
12

В общем, совет netcatлучше.

Но в bashи kshвы также можете сделать это:

exec 3<>/dev/tcp/hostname/port
echo "request" 1>&3
response="$(cat <&3)"
ValeriyKr
источник
что такое 1>&3? Я не уверен, что это представляет
Александр Миллс
другими словами, почему бы не просто echo "request" >&3, я думаю, что 1 просто избыточен
Александр Миллс,
4

попробуйте netcat (например, 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
  • в примере выше я отправляю GET ( echo GET / HTTP/1.0) на мой локальный http-сервер
  • Если вам не нужен сложный протокол, это может помочь.
Archemar
источник
0

Во многих случаях у меня не было доступа к netcat / socat. У меня также были проблемы с использованием Bash execв распределенной вычислительной среде.

Из-за его распространенности альтернативным решением является использование возможностей TCP / IP GNU AWK. Он предоставляет простой синтаксис, основанный на его операторе «двусторонний канал».

Вот модифицированный пример из этого источника , который отправит TCP-сообщение через сокет:

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

Полный синтаксис адреса: /net-type/protocol/local-port/remote-host/remote-port. Когда local-portзадано значение 0, локальный хост автоматически выбирает порт, который обычно является тем, что вам нужно. Вы можете прочитать больше о gawk«ю.ш. TCP / IP сетевых возможностей здесь:

Джон Ланцер
источник