Colorfull Netcat чат - PullRequest
       52

Colorfull Netcat чат

0 голосов
/ 27 марта 2020

TLDR; Сторона сервера nc -l PORT, так что все клиенты видят серверные сообщения в определенном цвете.

Я могу напечатать красный текст: echo -e "\e[31mRed Message" Я могу передать этот текст для netcat: echo -e "\e[31mRed Message" | nc -l 1234. Это позволяет пользователю, который подключается ко мне, видеть красное сообщение (если его терминал поддерживает цвета). Но я не знаю, как отправить все мои сообщения в определенном сеансе чата netcat определенного цвета

Проблема с echo -e "\e[31mRed Message" | nc -l 1234 заключается в том, что только одно сообщение печатается красным, а затем на сервер (компьютер прослушивание порта 1234) больше не может отправлять сообщения. Я ищу способ постоянно перенаправлять stdin и обрабатывать его по-разному (раскрасить) перед отправкой в ​​виде исходящего сообщения через netcat.

Обычно общение по netcat может выглядеть следующим образом:
Сервер: nc -l 1234
Клиент: nc ${SERVER_IP} 1234

Здравствуйте, я являюсь сервером
Здравствуйте, я являюсь клиентом
Я являюсь сервером, и мои сообщения скучны и не окрашены
Я клиент, и мои сообщения одинаково скучны

В идеале я хотел бы сделать следующее:
Сервер: some magic netcat thing that colors server text
Клиент: nc ${SERVER_IP} 1234

Здравствуйте, я сервер
Здравствуйте, я клиент
Я сервер, и мои сообщения классные и все окрашены в красный цвет!
I Я являюсь клиентом, и я вижу ваши прохладные красные сообщения, хотя мои сообщения скучны: (

жирный текст, использованный в приведенном выше примере для представления красного текста

Хорошая справка для bash коды окраски

Ответы [ 2 ]

1 голос
/ 27 марта 2020

Мне кажется, это работает, если я использую его на стороне сервера:

#!/bin/bash

red="$(tput setaf 1)"
off="$(tput sgr0)"

while read line ; do
   printf "${red}${line}${off}\n"
done | nc -l 1234

enter image description here

0 голосов
/ 27 марта 2020

Полное решение на основе KamilCuk комментариев

Сервер:

NO_COLOR="\x1b\[0m"      # Uncolored
SERVER_COLOR="\x1b\[31m" # Red

sed -u "s/^/${SERVER_COLOR}/g; s/$/${NO_COLOR}/g" | nc -l 1234 | sed "s/^/${NO_COLOR}/g; s/$/${SERVER_COLOR}/g"

Клиент: nc ${SERVER_IP} 1234

Я - сервер.
Я - клиент.
Я вижу, что я красный, а вы не окрашены.
Я вижу, что вы красный. И я вижу, что я неокрашенный!
Мы видим то же самое!

Сервер:

NO_COLOR="\x1b\[0m"      # Uncolored
SERVER_COLOR="\x1b\[31m" # Red
CLIENT_COLOR="\x1b\[32m" # Green

sed -u "s/^/${SERVER_COLOR}/g; s/$/${NO_COLOR}/g" | nc -l 1234 | sed "s/^/${CLIENT_COLOR}/g; s/$/${SERVER_COLOR}/g"

Клиент: nc ${SERVER_IP} 1234

Я сервер
Я клиент
Я вижу, что я красный, а вы зеленый
Я вижу, что вы красный, но я, кажется, не окрашен для себя
Мы видим похожие, но разные вещи

Трюки, чтобы сделать эту работу :

  1. Входные данные процесса netcat теперь являются выходными данными процесса sed -u. Процесс sed -u - это то, что получает stdin.
  2. Вывод процесса netcat теперь является вводом процесса sed. Этот sed процесс - это то, что генерирует stdout.
  3. Оба сценария sed используют ^ до с добавлением цветового кода к началу строки и от $ до append цветовой код до конца строки.
...