我想在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
答案 0 :(得分:0)
如果你真的想用纯粹的bash编写聊天客户端,它必须是本地聊天(相同的物理机)而不是网络聊天。
假设这足以满足您的需求,您可以使用named pipes(FIFO)
这是一个示例,说明了您可以使用两个管道(用于双向通信):
(与3号和4号航站楼相同和相反)
这说明你可以在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)
注意这个脚本只是一个简单的例子。如果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