Возможен ли условный ответ с помощью netcat

Я хочу запустить netcat (netcat-openbsd 1.105-7ubuntu1) и смоделировать последовательность чата. Я хочу, чтобы netcat отвечал автоматически.

Пример того, что я хочу.

NETCAT: nc -l 8080

CLIENT: nc localhost 8080

CLIENT: hello

NETCAT: (if statment) 
        if hello
           do hello friend

        if bye
           do bye friend
           send a FIN tcp 

        default
           date()

Я скопировал код этого вопроса (в ответе @wooghie): выполнить команду условно с помощью netcat и grep ... но сообщение не было отправлено клиенту. Netcat был в режиме прослушивания.

#!/bin/bash

netcat -l 8080 | while read line
do
    match=$(echo $line | grep -c 'Hello')
    if [ $match -eq 1 ]; then
        printf "Hello friend\r\n\r\n"
    fi
done

person natalia garcia    schedule 19.01.2017    source источник
comment
Нет. Вам нужно будет подавать как stdin , так и через stdout. Следовательно, использовать netcat -l намного сложнее/хрупче, чем повторно реализовать весь netcat -l на Perl или Python.   -  person kubanczyk    schedule 19.01.2017
comment
@kubanczyk - Вы вполне можете использовать именованные каналы. Однако coproc в Bash упрощает задачу: stackoverflow.com/a/36327396/477563   -  person Mr. Llama    schedule 19.01.2017
comment
Попробуйте добавить expect к тегам, и @GlennJackman может поделиться своей огромной мудростью в таких вещах....   -  person Mark Setchell    schedule 19.01.2017
comment
Возможно, это поможет   -  person Gustavo Kawamoto    schedule 03.10.2020


Ответы (1)


Я думаю, вы хотите ожидать (1). Что-то вроде:

#!/usr/bin/env expect
spawn nc localhost 8080
expect {
  hello {
     send "hello dude"
  } bye {
     close
  } -re .* {
     send [date]
  }
}

Обратите внимание, что expect на самом деле является Tcl, который сам по себе очень мощный.
Не тестировалось. YMMV.

person TheMadsen    schedule 19.01.2017