Bash 彩色全网猫聊天

Bash 彩色全网猫聊天,bash,netcat,Bash,Netcat,TLDR;服务器端nc-l端口,以便所有客户端都能看到特定颜色的服务器消息 我可以打印红色文本:echo-e\e[31mRed消息 我可以通过管道将该文本发送到netcat:echo-e\e[31mRed Message | nc-l 1234。这允许连接到我的用户在其终端支持颜色的情况下看到红色消息。 但我不知道如何在给定的netcat聊天会话中以特定颜色发送我的所有消息 echo-e\e[31mRed Message | nc-l 1234的问题是,只有一条消息被打印成红色,然后机器在端口1

TLDR;服务器端nc-l端口,以便所有客户端都能看到特定颜色的服务器消息

我可以打印红色文本:echo-e\e[31mRed消息 我可以通过管道将该文本发送到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\u IP}1234

你好,我是服务器 你好,我是客户 我是服务器,我的消息很无聊,没有颜色 我是一个客户,我的信息同样令人厌烦

理想情况下,我想做的是 服务器:一些神奇的netcat东西,给服务器文本上色 客户端:nc${SERVER\u IP}1234

你好,我是服务器 你好,我是客户 我是服务器,我的消息很酷,都是红色的! 我是一个客户,我可以看到你的冷色红色消息,但我的消息很无聊:

上面示例中使用的粗体文本表示红色文本


如果我在服务器端使用它,这似乎对我有效:

#!/bin/bash

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

while read line ; do
   printf "${red}${line}${off}\n"
done | nc -l 1234
完整的解决方案,基于评论

服务器:

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"
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\u IP}1234

我是服务器。 我是客户。 我看到我是红色的,而你是没有颜色的。 我看到你是红色的,我看到我没有颜色! 我们看到了同样的事情

服务器:

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"
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\u IP}1234

我是服务器 我是客户 我看见我是红色的,你是绿色的 我看到你是红色的,但我似乎对自己没有颜色 我们看到相似但不同的东西

实现此功能的技巧:

netcat进程的输入现在是sed-u进程的输出。sed-u进程就是stdin的输出。 netcat进程的输出现在是sed进程的输入。这个sed进程生成stdout。 两个sed脚本都使用^将颜色代码前置到行首,使用$将颜色代码追加到行尾。
那么,这种颜色与netcat有任何关系吗?如果您想以特定的方式打印文本,那么您的终端需要支持以颜色显示文本,并且您可以使用.Well\e与终端进行通信[31m set将以下所有颜色设置为红色。因此,只需先发送它。all是什么意思?确切地说是什么消息?在每行的开头添加\e[31m,并在每行的末尾添加重置颜色ansi转义码,即从服务器发送到客户端。如sed的/^/\x1b\[31m/g;s/$/\x1b/g'| netcat…我猜是因为管道中存在行缓冲。尝试添加stdbuf-oL sed…或sed-u。我认为,在键入任何内容之前,您需要输出红色ansi代码。这将需要在客户端和服务器之间进行大量同步。这将变得复杂。因此,如果您真的需要,我建议编写一个C pr控制终端设备ncurses并自己实现的gram。这个解决方案很好。它实现了文本着色的目标,但它不会在两侧给服务器文本着色。我希望所有参与者的所有服务器消息都显示为红色?我这样做是因为你的问题说……这样所有客户端都会看到服务器混乱特定颜色的年龄:-