如何在bash中创建聊天脚本?

时间:2015-12-29 22:07:02

标签: bash shell networking irc

我想在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

2 个答案:

答案 0 :(得分:0)

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

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

插图

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

  1. mkfifo / tmp / chatpipe1; mkfifo / tmp / chatpipe2
  2. (在终端1中):cat>的/ tmp / chatpipe1
  3. (在第二站):cat / tmp / chatpipe2
  4. (与3号和4号航站楼相同和相反)

    Illustrated chat session

    这说明你可以在bash中有4个进程,两个写入两个管道,两个从同一个管道读取。左边的两个终端用于Bob,右边的两个用于John。

    如果您了解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)
    

    聊天会话: Chat session with script

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

答案 1 :(得分:-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