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

Из вашего описания (выделение мое):

Каждое определение начинается с [*Term*] и
отделяется от следующего пустой новой строкой

Awk при вызове с нулевым RS (RS='') разбивает файл на пустые строки.
Он также способен выбирать на основе строк:

$ var="someothermatch"
$ awk -v RS='' -v var="$var" '$0~var{print}' infile

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

Из руководства awk:

Если RS имеет значение нулевой строки, то записи разделяются пустыми строками. Когда RS имеет значение нулевой строки, символ новой строки всегда действует как разделитель полей, в дополнение к любому значению, которое может иметь FS.

16
18.11.2018, 08:44
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-сервер
  • . Если вам не нужен сложный протокол, это может сработать.
5
27.01.2020, 19:48

Using 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
Thu Jan 12 18:04:21 CET 2017
Hello?
What?
q

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

34
27.01.2020, 19:48

В целом совет с netcat - лучший способ.

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

exec 3<>/dev/tcp/hostname/port
echo "request" 1>&3
response="$(cat <&3)"
17
27.01.2020, 19:48

Во многих случаях у меня не было доступа к 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's TCP/IP по предоставленной ссылке.

Стоит отметить, что это можно сократить, если вы собираетесь отправлять только одно сообщение за одно выполнение awk:

BEGIN {print "coke" |& "/inet/tcp/0/cs.wisc.edu/finger"}
1
27.01.2020, 19:48

Теги

Похожие вопросы