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

如何在bash中制作聊天脚本?,bash,shell,networking,irc,Bash,Shell,Networking,Irc,我想在bash中创建一个聊天脚本,我已经开始了非常基本的工作,您可以使用任何您想要的名称登录,无需密码,然后您可以编写诸如connect、clear、exit等命令 但是我希望能够在终端窗口中开始两个人之间的聊天。现在,我读了一些关于IRC的书,但我不知道如何让它发挥作用 任何帮助都将不胜感激 这是我的剧本: #!/bin/bash ver=1.0 my_ip="127.0.0.1" function connect() { echo -n "Ip-address: " read ip i

我想在bash中创建一个聊天脚本,我已经开始了非常基本的工作,您可以使用任何您想要的名称登录,无需密码,然后您可以编写诸如connect、clear、exit等命令

但是我希望能够在终端窗口中开始两个人之间的聊天。现在,我读了一些关于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

如果您真的想在纯bash中编写聊天客户端,那么它必须是本地聊天(相同的物理机器),而不是网络聊天

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

插图 下面是一个示例,演示了如何使用两个管道(用于双向通信):

  • mkfifo/tmp/chatpipe1;mkfifo/tmp/chatpipe2
  • (在终端1中):cat>/tmp/chatpipe1
  • (在端子2中):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-m777…是一个选项)

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

    可以处理“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
    
    #/bin/bash
    mkdir-p/tmp/webCat&&printf“HTTP/1.1200 OK\n\nErez的netcat聊天服务器!!用户名:

    消息:
    发送数据刷新”>/tmp/webCat/webpage 而[1] 做 [[$(head-1/tmp/webCat/r)=~“获取/?用户名”]]和&USER=$(head-1/tmp/webCat/r | sed's@.*用户名=@'| sed的@和消息。*@')和消息=$(head-1/tmp/webCat/r|sed's@.*消息=@@'| sed's@HTTP.*@@') [${USER}-gt 1]&&&${{USER}-gt 1]&&&${{USER}-lt 30]&&${{USER}-lt 280]&&printf“\n%s\t%s\n”$USER“$MSG”和&printf”%s\t%s“$USER”$MSG”>/tmp/webCat/webpage cat/tmp/webCat/webpage |超时1 nc-l 1234>/tmp/webCat/r 取消设置用户和取消设置消息(&U) 完成
    IRC是一种协议。你可以写任何你想说的代码,但我不确定这与你已经写的任何代码有什么关系。此外,可能已经有成千上万的irc客户端。你真的对用shell脚本编写irc客户端感兴趣吗?当然,不一定是irc客户端,而是允许两个或两个以上的用户通过某种internet协议或类似的协议进行连接,然后能够互相发送消息。shell脚本可以做到这一点,但可能确实不是正确的选择。我想这会让很多事情变得非常复杂。好吧,还有其他方法吗?我至少希望它能从终端上运行。通过重定向到
    /dev/tcp/$host/$port
    或通过
    nc
    ,网络聊天当然是可能的。