如何在 bash 中制作聊天脚本?

Posted

技术标签:

【中文标题】如何在 bash 中制作聊天脚本?【英文标题】:How can I make a chat script in bash? 【发布时间】:2015-12-29 22:07:01 【问题描述】:

我想在 bash 中创建一个聊天脚本,我已经开始了非常基本的操作,您首先使用您想要的任何名称登录,不需要密码,然后您可以编写连接、清除、退出等命令开。

但我希望能够在终端窗口中真正开始两个人之间的聊天。现在,我已经阅读了一些关于 IRC 的信息,但我不知道如何让它工作。

任何帮助将不胜感激

这是我的脚本:

#!/bin/bash
ver=1.0
my_ip="127.0.0.1"

function connect()


echo -n "Ip-address: "
read ip

if [ -n "$ip" ]
then

exit

fi    



function check()


    if [ "$c" = "connect" ] || [ "$c" = "open" ]
    then

    connect

    fi

    if [ "$c" = "clear" ] || [ "$c" = "cls" ]
    then

    clear
    new

    fi

    if [ "$c" = "quit" ] || [ "$c" = "exit" ]
    then

    echo "[Shutdown]"
    exit

    fi



function new()


    echo -n "$: "
    read c

    if [ -n "$c" ]
    then

    check

    else

    echo "Invalid command!"
    new

    fi



function onLogin()


clear
echo "Logged in as $l_name on [$my_ip]"
new



function login()


echo -n "Login: "
read l_name

if [ -n "$l_name" ]

then
onLogin

else

echo "Invalid input!"
login

fi




#execution
clear
echo "Bash Chat v$ver | Mac"
login

【问题讨论】:

IRC 是一种协议。你可以编写任何你喜欢的代码,但我不确定这与你已经编写的任何代码有什么关系。此外,可能已经有成千上万的 irc 客户。你真的有兴趣在 shell 脚本中编写 irc 客户端吗? 嗯,不一定是 irc 客户端,而是允许两个或更多用户通过某种互联网协议或类似的东西连接,然后能够相互发送消息的东西。 一个shell脚本可以做到这一点,但可能真的不是它的正确选择。我想这会让很多事情变得相当复杂。 好的,有没有其他办法解决这个问题? 我至少希望它从终端运行。 【参考方案1】:

如果你真的想用纯 bash 编写聊天客户端,它必须是本地聊天(同一台物理机器)而不是网络聊天。

假设这足以满足您的需求,您可以使用named pipes (FIFO)

插图

这是一个示例,说明您可以使用两个管道(用于双向通信)做什么:

    mkfifo /tmp/chatpipe1 ; mkfifo /tmp/chatpipe2 (在终端一):cat > /tmp/chatpipe1 (在二号航站楼):cat /tmp/chatpipe2

(3号和4号航站楼相同,反之)

这说明在 bash 中可以有 4 个进程,两个写入两个管道,两个从相同的两个管道读取。左边两个终端是给鲍勃的,右边两个是给约翰的。

如果您了解 bash 后台、循环(以及希望在关闭时清理的陷阱),您可以将所有这些组织到一个脚本中。

脚本

这是一个初步的版本:

#!/bin/bash

if [ -z "$2" ] ; then
    echo "Need names of chat pipes (yours and other's), eg $0 bob john"
    exit 1
fi

P1=/tmp/chatpipe$1
P2=/tmp/chatpipe$2

[ -p "$P1" ] || mkfifo $P1
[ -p "$P2" ] || mkfifo $P2

# Background cat of incoming pipe,
# also prepend current date to each line)
(cat $P2 | sed "s/^/$(date +%H:%M:%S)> /" ) &

# Feed one notice and then STDIN to outgoing pipe
(echo "$1 joined" ; cat) >> $P1

# Kill all background jobs (the incoming cat) on exit
trap 'kill -9 $(jobs -p)' EXIT
# (Probably should delete the fifo files too)

还有一个聊天会话:

注意这个脚本只是一个简单的例子。如果 bob 和 john 是不同的 unix 帐户,您必须更加小心文件权限(或者如果您不关心安全性,mkfifo -m 777 ... 是一个选项)

【讨论】:

网络聊天当然可以通过重定向/dev/tcp/$host/$portnc来实现。【参考方案2】:

一个聊天室可以用 10 行 bash 来创建。我今天早些时候在我的github上发布了一个

https://github.com/ErezBinyamin/webCatChat/blob/master/minimalWbserver

可以处理“n”个用户。他们只需要连接到:1234

代码如下:

#!/bin/bash
mkdir -p /tmp/webCat && printf "HTTP/1.1 200 OK\n\n<!doctype html><h2>Erez's netcat chat server!!</h2><form>Username:<br><input type=\"text\" name=\"username\"><br>Message:<br><input type=\"text\" name=\"message\"><div><button>Send data</button></div><button http-equiv=\"refresh\" content=\"0; url=129.21.194:1234\">Refresh</button></form>" > /tmp/webCat/webpage
while [ 1 ]
do
    [[ $(head -1 /tmp/webCat/r) =~ "GET /?username" ]] && USER=$(head -1 /tmp/webCat/r | sed 's@.*username=@@' | sed 's@&message.*@@') && MSG=$(head -1 /tmp/webCat/r | sed 's@.*message=@@' | sed 's@HTTP.*@@')
    [ $#USER -gt 1 ] && [ $#MSG -gt 1 ] && [ $#USER -lt 30 ] && [ $#MSG -lt 280 ] && printf "\n%s\t%s\n" "$USER" "$MSG" && printf "<h1>%s\t%s" "$USER" "$MSG" >> /tmp/webCat/webpage
    cat /tmp/webCat/webpage | timeout 1 nc -l 1234 > /tmp/webCat/r
    unset USER && unset MSG
done

【讨论】:

以上是关于如何在 bash 中制作聊天脚本?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用参数制作 Bash 函数? [复制]

如何在 Linux 中使用终端命令将文件参数传递给我的 bash 脚本? [复制]

在 bash 脚本中,如何引用单独的文件以在 for 循环中使用它? [复制]

如何从 bash 脚本中停用 virtualenv

如何迭代 Bash 脚本中的参数

如何在 React JS 中使用聊天气泡制作像 UI 一样的聊天